- Frontend Application Flow and callback methods
- Customizing Frontend Applications [part 3]: time for pagination
- Customizing Frontend Applications [part 2]: how to load only selected content in a section
- Customizing Frontend Applications [part 1]: divide objects by type in a section
- Embedding multimedia objects
- BEdita shell: introducing command line tools
- How to manage free semantic relations
- Hallo BEdita
Customizing Frontend Applications [part 1]: divide objects by type in a section
Organize your BEdita objects in $section array to have a semantic separation of contents.
In any Frontend Application the standard organization of contents in a section reflects the backend visualization. So, supposing to have a section named "section 1" structured like in figure 1, we'll have in frontend view the array $section with different content types mixed together
Array(
[id] => section 1
[nickname] => section-1
....
[childContents] => Array(
[0] => Array(...)
[1] => Array(...)
..... )
)
This is ok in many situation i.e. when I want to list contents in sequential order, but when I want contents to assume a specific behavior based on their semantic meaning this structure is limited.
In every object array I have a key named object_type that identify the type of the item (Document, Event, Gallery, etc...) so we can iterate the $childContents array and check that key to choose the right behavior. But this is not a good practice in some situations: for example if I want that in a 3 columns layout documents are shown in the first column, events in the second and galleries in the third column. Infact I should iterate the childContents array three times. Another example could be this one: we don't know which types of objects are in a section but we want that everyone behave differently.
In these cases the $sectionOptions attribute of the FrontendController class comes to help us.
The first solution: semantic separation for all sections
In this first case we want that in our frontend application the objects inside every section are divided by type. To do this we will override the $sectionOptions attribute in Pages Controller like this
class PagesController extends FrontendController {
protected $sectionOptions = array("showAllContents" => true, "itemsByType" => true, "childrenParams" => array());
.....
}
setting itemsByType to true we force BEdita objects inside a section to be divided by object type. Instead of "chidContents" we'll have "children" array
Array(
[id] => section 1
[nickname] => section-1
....
[children] => Array(
[Document] => Array(
[0] => Array(...)
[1] => Array(...)
)
[Event] => Array(...)
.....
)
)
The second solution: semantic division only for that section
In this case we'll use the nicknameBeforeFilter callback called automatically before section data are loaded (note that "-" char in nickname is replaced with "_" in method name)
protected function section_1BeforeFilter() {
$this->sectionOptions["itemsByType"] = true;
}
The result will be an array like that above.
With this post we start a series of documents that explain how customize your frontend application for all your needs.


Write a comment