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.