Page tree
Skip to end of metadata
Go to start of metadata

See: User stories on personalization & content pools

StoryUser/developer actionsImplementation details

Publish and feature an article on a magazine site

(Story 1.1)
As managing editor, I can create and maintain the page tree structure of our site. This simple tree basically consists only of a home page plus a separate page for every section of my magazine site. All section pages possibly use the same page template, but I'm actually free to choose that.


  • Creates ContentApp that stores articles in it's own workspace.
  • It is possible to add a list of such articles in a special content element which will be added to a section page.
  • Creates multiple templates for the editor to choose.

Managing editor:

  • Can add/remove articles from the respective content element on the section page.
  • He can change the template of a section page.
(Story 1.2)
As managing editor, I assign one or more categories to every section page from a pre-defined taxonomy. Depending on these categories, a section page pulls matching articles from a pool of articles. Articles aggregated like this are available as separate pages below the section page. Articles may also show up in overviews or teasers on the section page.


  • Creates content element that get categories from parent content (here: the page) and selects the appropriate articles from the workspace.

Managing editor:

  • Adds categories to a page (as it is possible now already).
  • Adds teasers and overview elements to pages where needed.

NOTE: Content should only be available on one URL!

SELECT e.* FROM [mgnl:articles] AS e WHERE e.categories IN ('page-category-A', 'page-category-B');
(Story 1.3)
As a journalist, I write my articles in a dedicated app. Once written, I tag my articles with "topics" and "interests" by assigning them categories from a predefined taxonomy. These categories may then be used to show my articles on any web page or any channel an editor may want them to show up in.


  • Creates content app where journalist can write articles.
  • Two different parent categories are used for "topics" and "interest" and can be selected in app. They are stored as multi-valued properties using the MultiValueField.
  • A content element selects articles according to the categories set in a poge (see: Story 1.2).


  • Uses content app to write articles and tag them.
(Story 1.4)
As a journalist, I can view my article directly in the same app I write them in. I get a read-only view that applies some basic formatting for easier reading. I actually don't get a preview showing what they will look like on the actual site, since that's typically not of interest to me, but concerns more our staff in the editorial department.


  • Creates subapp that uses standard rendering mechanism + a simple template to show a preview of the article in a separate tab.
(Story 1.5)
As editor, I review and proof read articles in the same app that journalists use to write them. I also use the same read-only view with basic formatting that is available to journalists, but I may also have diff views helping me with my task.


  • Activates workflow for this subapp.
  • Adds an additional action which will show a diff of two versions of an article
(Story 1.6)
As editor, I can preview articles as they will look when published. Since articles may be published in several sections, I can preview them using all the page templates that they may show up in.


  • Creates custom action that will match article's categories to categories of page. Those page are made selectable in dialog. Once selecting a page, the resulting article view will be shown in separate tab using EmbeddedPageSubApp.
(Story 1.7)
As editor, I may edit the structure of our pages using Magnolia's page editor and its areas and components. I do rarely change a page, though, once I've created it, since most publishing is done directly by articles being published from the articles pool.


  • Uses page editor.
(Story 1.8) 
As managing editor, I can feature or otherwise emphasize certain articles in an overview such as those shown on a section page, by flagging such articles in the article pool.


  • Adds property "flagged" to article's app.

Managing editor:

  • Uses that property to flag and highlight certain articles



Show a list of events

(Story 2.1)
As managing editor, I can show a list of events on an events overview page, which are all located inside a particular folder in the pool of events. All events in that folder will then be shown in chronological order, with upcoming events coming first, up to a configurable maximum of events.


  • Creates a content app which stores events in a dedicated workspace.
    • Event requires a date (= mandatory field)
  • The app can also create folders and sub-folders in that workspace.
  • Creates content app that list a (to be defined) maximum number of such events.

Managing editor:

  • Uses that app to manage events.
SELECT e.* FROM [mgnl:events] AS e ORDER BY ASC;
(Story 2.2)
As managing editor, I can show a list of events on an events overview page by selecting one or several event categories. All events with these categories will then be pulled from the pool of events and will be shown in chronological order, with upcoming events coming first, up to a configurable maximum of events.


  • Adds category MultiValueField to those events.
  • Content element is "extended" to be able to select categories that should only be shown.
SELECT e.* FROM [mgnl:events] AS e WHERE e.categories IN ('selected-category-A', 'selected-category-B') ORDER BY ASC;
(Story 2.3)
As author, I can assign topics to events by assigning them one or several categories. I also use categories to mark events as being interesting for users with certain interests or from a specific country.


  • Extends "tagging" capabilities by adding parent categories which sub-categories are bound to MultiValueField.
  • Custom content elements use Trait in AggregationState to select the categories of interest


  • Makes use of this multi-tagging capabilities
SELECT e.* FROM [mgnl:events] AS e WHERE e.categories IN ('selected-category-A', 'selected-category-B') AND e.tagged in ('trait-interest-A') ORDER BY ASC;

Feature certain events in a teaser

(Story 3.1)
As managing editor, I can flag events in the events pool by assigning them a specific category. I can then configure some teasers on the event overview page to only show events with the same category assigned in order to feature them.


  • Creates custom content element that matches selected category with events in workspace.
SELECT e.* FROM [mgnl:events] AS e WHERE e.categories IN ('featured-category-A', 'featured-category-B') ORDER BY ASC;

(Story 3.2)
As managing editor, I can ask a teaser on the events overview page to e.g. only show the 5 most liked events in the pool of events. I can combine such a filter with other filtering and sorting options. E.g. I could only show the 5 best liked and featured events, or the last 10 added events of a particular category.


  • Creates custom content element that orders tagged/categorized events by its "likes".
  • Those additional fields are not mandatory for the editor to be able to choose what to display.
  • The content element will create correct SELECT statements according to what is set in the element.

The personalized home page

(Story 4.1)
As a marketing manager, I'd like to offer two specialized alternatives of our home page: one should be of better use for our more business-oriented, one for our technology-focused users. For all other visitors, I'd like to keep our otherwise convincing home page. I thus create two variants of that page for my new audiences. I then make the necessary changes to both and finally specify for every variant, to which audience it should mainly show.


  • Creates two segments (one for business, one for technologie)


  • Assign both new segments to the master homepage and thus creates two page variants by that
  • He now edits both variants to his needs by going to edit-mode and switching inbetween segments with the segment-switcher
Developer has to create two segments by using the TraitVoters that have been made available in the system. He has to combine the voters with other to get the resulting segements.
(Story 4.2)
As known user with business interests, I get to see the business-oriented home page variant.
As known user with a focus on technology, I get to see the home page written for a technical audience.
As regular visitor, I get to see the home page as it was originally written.


  • Has created an InterestDetector that reads selected interests from user in session an stores them in the AggregationState.
  • The create SegmentDecider will choose the appropriate segment and thus page variant to render for the user and will render it to the user. A non-registered user will see the master page.
(Story 4.3)
As a regular visitor, I can register with the site and then become a known user. In my user profile, I can specify my interests as well as my position in the company I work for. This allows the site owner to target content to me specifically - I'm informed by the site's privacy policy about all possible uses of that information.


  • Creates the respective form (module-form) and uses PUR (module-public-user-registration) to achieve the requirement.

The localized campaign page

(Story 5.1)
As a marketing manager, I'm planning a new campaign for the relaunch of our main product line. Since we have adapted the product to work in several regions of the planet, I create a localized campaign page variant for every major market area, then specify for every variant to which visitors it should only show.


  • Creates the segments according to the requirements.

Marketing manager:

  • Creates multiple page variant by associating the afore mentioned segment to his master page.
  • He then customizes his page variants according to his needs.

The segments will have to be created by using TraitVoters.

The respective Trait and its Voters (in this case GeoIP-enabled) have to be created beforehand.

(Story 5.2)
As a visitor coming from a particular country, I only get to see the localized variant of the campaign page advertising the relaunched product.


  • TraitDetector in the filter chain adds the country of a visitor to the AggregationState by using i.e. GeoIP.
Developer creates a TraitVoter that adds the country of a visitor to the AggregationState by using i.e. GeoIP.

A page with localized content

(Story 6.1)
As a marketing manager, I want to make sure our existing home page shows content relevant to our visitors. Our list of customers on that page is currently static, however. I want to change that in order to show customers that are relevant to the geographic region a visitor is coming from. I enable geo localization on the page or the list of customers directly and get clear signals everywhere informing me that the home page now hosts and shows personalized content.

See Story 5.1


  • Create custom content element that shows a text if a page variant is currently selected and adds information about the segment and the user.
(Story 6.2)
As an asset editor, I add a set of company logos representing some customers that are using our product. I mark these image assets with geo tags - only rough "region" tags that tell what country or region the corresponding company is located in. That allows us to only show these logos to selected visitors later on.


  • Extends the assets dialog in his module to add a field for region if not available yet.
  • Create a custom template / template model that uses checks the AggregationState for the respective region and show the logo accoringly (with fallback)

Asset editor:

  • Edits the assets with the new dialog and adds the information required.

Seeing mainly events that may interest me

(Story 7.1)
As registered user, I get to see a list of events in the events overview page, which could be of interest to me. This is determined by matching the interests stored in my personal profile with the interests that an event has been flagged with. I can still decide to see other events as well, but I get to see a personalized list by default.


  • Creates custom content element that is able to select events according to users interests (those traits will be available in the AggregationState).
  • As a user it is possible to select to display all events.

SELECT e.* FROM [mgnl:events] AS e WHERE e.tags IN ('tag-A', 'tag-B', 'tag-C');

Where the tags will be selected from AggregationState's trait.

(Story 7.2)
As author, I can flag an event as being of interest to a particular audience, or I can manually pick a set of interests and assign these to an event in the pool.


  • Tags content with categories/subcategories/custom content elements

Show me all events near me

(Story 8.1)
As a visitor of the events overview page, I can filter the list of events being shown there to only include events which are closed to where I currently am. I can also pick a range to further narrow down or extend that list.


  • Implements custom localization services (third party services) that resolve location in specified bounds.
  • Those are matched to trait of current request, i.e. the user's location, which was previously resolved by GeoIP.
  • Custom content element respects both parameters
  • No labels