Magnolia 5.3 reached end of life on June 30, 2017. This branch is no longer supported, see End-of-life policy.
In this tutorial you create your first content app. Content app is a special app type that is well suited for managing custom content items such as products. The items in this example are antique cars but you can use any items you wish. Magnolia 5.2.3
Your content app needs to be deployed as a Magnolia module. Choose from these options depending on your skill level.
Choose this option if you know how to work with a Magnolia project and Git. You get a project that you can edit it in your IDE and customize to your needs.
app-tutorial
repository.git clone http://git.magnolia-cms.com/git/documentation/app-tutorial.git
Choose this option if you are new to Magnolia. Download the module JAR and follow the standard module installation instructions. You get the complete content app and can learn how it works.
<CATALINA_HOME>/webapps/<contextPath>/WEB-INF/lib
folder. Typically this is <CATALINA_HOME>/webapps/magnoliaAuthor/WEB-INF/lib
.The module contains the following source files:
magnolia-module-app-tutorial.xml
config.modules.app-tutorial.apps.xml
config.modules.ui-admincentral.config.appLauncherLayout.groups.edit.apps.products.xml
products.xml
mgnl:product
: app-tutorial-nodetypes.xml
app-products-messages_en.properties
The best way to learn is change things and see what effect it has. Go to Configuration > /modules/app-tutorial
to find the configuration.
Node name | Value |
---|---|
server | |
modules | |
app-tutorial | |
version | 1.3.3-SNAPSHOT |
pages
since a Pages app already exists.Node name | Value |
---|---|
modules | |
app-tutorial | |
apps | |
products | |
appClass | info.magnolia.ui.contentapp.ContentApp |
class | info.magnolia.ui.contentapp.ContentAppDescriptor |
version | 1.3.3-SNAPSHOT |
In the app launcher layout we add the app to the Edit group.
Node name |
---|
modules |
ui-admincentral |
config |
appLauncherLayout |
groups |
edit |
apps |
pages |
assets |
contacts |
products |
Go to the app launcher and verify that you can see the Products app icon.
If you move the app to another group, log out and back in to see the change.
The browser
subapp in /modules/app-tutorial/apps/products
allows you to view and organize items. It is part of every content app.
Node name | Value |
---|---|
modules | |
app-tutorial | |
apps | |
products | |
subApps |
|
browser |
|
class | info.magnolia.ui.contentapp.browser.BrowserSubAppDescriptor |
subAppClass | info.magnolia.ui.contentapp.browser.BrowserSubApp |
A content connector tells the app where the content resides. In this case we store products in the repository so we use a JCR content connector. The configuration identifies the workspace and a path. It also configures the node type the app operates on. Magnolia 5.3+
Node name | Value |
---|---|
subApps | |
browser |
|
contentConnector |
|
nodeTypes |
|
product | |
icon | icon-items |
name | mgnl:product |
defaultOrder | jcrName |
includeProperties | false |
rootPath | / |
workspace | products |
In this app, the workbench displays two node types: mgnl:folder
and mgnl:product
.
Node name | Value |
---|---|
browser |
|
workbench |
|
defaultOrder | jcrName |
dropConstraintClass | info.magnolia.ui.workbench.tree.drop.AlwaysTrueDropConstraint |
editable | false |
includeProperties | false |
A content view defines how the content is displayed to the user. Under workbench
, we have three views: tree, list, thumbnail and search. The tree view defines columns: Name, Status and Modification date. The other views extend the tree view, displaying the same columns.
Node name | Value |
---|---|
workbench | |
contentViews |
|
tree |
|
columns |
|
jcrName |
|
class | info.magnolia.ui.workbench.column.definition.PropertyColumnDefinition |
editable | true |
label | Product name |
propertyName | jcrName |
sortable | true |
status | |
class | info.magnolia.ui.workbench.column.definition.StatusColumnDefinition |
displayInChooseDialog | false |
formatterClass | info.magnolia.ui.workbench.column.StatusColumnFormatter |
label | Status |
width | 45 |
moddate | |
class | info.magnolia.ui.workbench.column.definition.MetaDataColumnDefinition |
displayInChooseDialog | false |
formatterClass | info.magnolia.ui.workbench.column.DateColumnFormatter |
label | Modification date |
propertyName | mgnl:lastModified |
sortable | true |
width | 160 |
class | info.magnolia.ui.workbench.tree.TreePresenterDefinition |
list |
|
columns |
|
extends | ../../tree/columns |
class | info.magnolia.ui.workbench.list.ListPresenterDefinition |
thumbnail | |
class | info.magnolia.ui.workbench.thumbnail.ThumbnailPresenterDefinition |
search | |
columns |
|
extends | ../../tree/columns |
class | info.magnolia.ui.workbench.search.SearchPresenterDefinition |
Here's the tree view:
Test the other views too. Search is case sensitive by default.
Actions allow you to add, edit and delete folders and products. Each action adheres to an action definition.
Node name | Value |
---|---|
browser | |
actions |
|
addProduct |
|
availability | |
nodeTypes | |
folder | mgnl:folder |
root | true |
appName | products |
class | info.magnolia.ui.contentapp.detail.action.CreateItemActionDefinition |
icon | icon-add-item |
nodeType | mgnl:product |
subAppId | detail |
addFolder |
|
availability | |
root | true |
class | info.magnolia.ui.framework.action.AddFolderActionDefinition |
icon | icon-add-folder |
editFolder |
|
deleteFolder | |
editProduct | |
deleteProduct |
Node name | Value |
---|---|
browser |
|
actionbar |
|
sections |
|
root | |
groups | |
addActions | |
items | |
addProduct | |
addFolder | |
availability | |
nodes | false |
root | true |
folder | |
product | |
defaultAction | editProduct |
Image provider is a component that renders images used in apps. It generates the portrait image at the bottom of the action bar and the thumbnails for the thumbnail view.
Node name | Value |
---|---|
browser | |
imageProvider | |
class | info.magnolia.ui.imageprovider.definition.ConfiguredImageProviderDefinition |
imageProviderClass | info.magnolia.ui.imageprovider.DefaultImageProvider |
originalImageNodeName | photo |
Select an item in the browser subapp to test the preview. The preview image is displayed at the bottom of the action bar.
A detail subapp allows you to edit a product. It is configured with a subapp descriptor just like a browser subapp but the classes are different.
Node name | Value |
---|---|
subApps |
|
detail |
|
class | info.magnolia.ui.contentapp.detail.DetailSubAppDescriptor |
subAppClass | info.magnolia.ui.contentapp.detail.DetailSubApp |
Magnolia 5.3+
A JCR content connector is also needed in the detail subapp. Here the definition is simpler. You just need to name the workspace.
Node name | Value |
---|---|
subApps | |
detail |
|
contentConnector |
|
workspace | products |
rootPath | / |
The rootPath
property has the same value (/
) as in browser subapp content connector. They must have the same value. However, since /
is the default value you can leave it out in both subapps.
detail
subapp. Define the node types the editor edits, a form for editing them, and actions for saving the edit.Node name | Value |
---|---|
detail | |
editor | |
nodeType | |
icon | icon-items |
name | mgnl:product |
workspace | products |
Your app edit any kind of content. What you plan to edit determines what fields you need on the form. In this tutorial the items are products so we create a form with three fields: product name, photo and photo credit.
Node name | Value |
---|---|
editor |
|
actions | |
commit | |
save | |
form |
|
tabs |
|
product |
|
fields |
|
name |
|
class | info.magnolia.ui.form.field.definition.TextFieldDefinition |
name | jcrName |
fileUpload | |
allowedMimeTypePattern | image.* |
binaryNodeName | photo |
class | info.magnolia.dam.asset.field.definition.DamUploadFieldDefinition |
photoCredit | |
class | info.magnolia.ui.form.field.definition.TextFieldDefinition |
Commit and cancel are generic reusable actions that save the form data. They are defined under the detail
subapp. The corresponding dialog buttons are in the editor (see above).
Node name | Value |
---|---|
detail |
|
actions |
|
commit |
|
class | info.magnolia.ui.form.action.SaveFormActionDefinition |
implementationClass | info.magnolia.ui.form.action.SaveFormAction |
cancel |
|
class | info.magnolia.ui.form.action.CancelFormActionDefinition |
Create a few items. Verify that you can edit existing items too.
Here are ways to create your own content app:
apple
with orange
.This method works well if one of Magnolia's native apps does almost what you need. You don't need to change much. Extend the native app to get all its functionality and add something special. For example, configure a special Pages app that displays only one website branch. If editors mostly work in that branch the app saves them from having to navigate there.
See also 3.3.5 Create an app in Magnolia Academy.
Here are ideas for enhancing your content app and making it ready for production use:
Add export and import actions so you can export products into XML. See how the actions are implement in the Contacts app. Copy the action configuration to your app. The Magnolia UI framework provides generic export and import actions that you can use out of the box.
/modules/contacts/apps/contacts/subApps/browser/actions/export /modules/contacts/apps/contacts/subApps/browser/actions/import /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/root/groups/importExportActions /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/contact/groups/importExportActions /modules/contacts/apps/contacts/subApps/browser/actionbar/sections/folder/groups/importExportActions
To add publishing actions:
activate
and deactivate
actions so that you can publish products to the public instance. Copy the actions from the Contacts app.activate
and deactivate
actions in the action bar. You can copy these also from the Contacts app.products
workspace so that public instances receive the content. Don't forget to install your module also on the public instance! You may not need the app on the public instance but you will need the
products
workspace so that products can be activated.
Prevent editors from deleting products with a single click. The best practice is to mark an item for deletion and require the editor to publish the change:
See how the Contacts app handles this and replicate the actions in your app. See also how the info.magnolia.ui.api.availability.IsNotDeletedRule
action availability rule is used in the activate
action to make sure that the activatable item is not marked for deletion.
You may want to display product images on the website or in a shop. Add a URI2RepositoryMapping for the products
workspace. The mapping tells Magnolia to serve content from the products
workspace when the request URL contains the /products
prefix.
To add a URI2RepositoryMapping:
/server/URI2RepositoryMapping/mappings
.Map the /products URI prefix to the products
workspace.
Node name | Value |
---|---|
server |
|
URI2RepositoryMapping |
|
mappings |
|
products |
|
URIPrefix | /products |
handlePrefix |
|
repository | products |
products
node and its properties to the public instance.anonymous
role permission to read the products
workspace. This allows visitors to view the images on the public instance.To request an image, use the /products
prefix in the URL:
http://localhost:8080/magnoliaPublic/products/Fiat-Cinquecento/photo/Fiat%20Cinquecento.jpg
Credits: