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 everyone to behave differently.
In these cases the $sectionOptions attribute of the FrontendController class helps us.
The first solution: semantic separation for all sections
In this first case we want in our frontend application the objects inside every section 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.





