Komplexer fetch über mehrere Nodes mit RelatedObjects

05.03.2010 | eZ Publish

wie umgesetzt für die Accordion-Newsbox beim Linux-Magazin

Die Newsbox wird eingebunden vom extension/lnm/design/linux_magazin/override/templates/pagelayout_themengebiete.tplwie folgt:

 {include uri='design:content/news_box.tpl' box_node=$module_result.node_id}

Die Variable $box_node steht dann ohne weitere Referenzierung sofort zur Verfügung! Ihr wird der Node des Themengebietes übergeben.Merke: unter diesem Node sind keine News abgelegt, sondern nur die Kategorien (category). Diese sind eine eigene Content-Klasse, aber KEINE Container! Die News selbst liegen als untergeordnete Objekte unter dem News-Node (207). Da eine Mehrfachzuordnung möglich sein sollte, war dies nur über Objektrelationen zu verwirklichen.

Die News-Klasse enthält ein Content-Attribut "Thema" (Datentyp: Objektverknüpfung). Diese können komfortabel über eine Tabelle von Checkboxen ausgewählt werden (vermutlich Override-Template im Adminbereich!).

Das Newsbox-Template liegt unter extension/lnm/design/linux_magazin/templates/content/news_box.tpl

 {set-block scope=root variable=cache_ttl}0{/set-block}
{def     $start_node_id = 207
    $newsItems=array()
    $allIDs=array()
    $news=array()
    $list_items_count=0
    $news_limit=6
}
{set     $news=fetch('content', 'list', hash( 'parent_node_id', $box_node,  
        'class_filter_type',  'include',
        'class_filter_array', array('category')
        ) )
}
{*set    $list_items_count=fetch('content', 'list_count', hash( 'parent_node_id', $box_node,  
                            'class_filter_type',  'include',
                            'class_filter_array', array('category')
                ) )
*}
<h1>Aktuelle News zum Thema: </h1>
    <div id="accordion">
{foreach $news as $item}
    {set $newsItems=fetch('content', 'tree', hash( 'parent_node_id', $start_node_id,
                            'limit', $news_limit,
                            'sort_by', array( 'published', false() ),
                            'class_filter_type',  'include',
                            'class_filter_array', array('news'),
                            'extended_attribute_filter', hash(
                            'id', 'RelationFilter',
                            'params',hash( 'relations',  array($item.contentobject_id))
)     )   )

}
<h3 class="toggler">{$item.name}</h3>
    <div class="element">
<ul style="list-style-type:square;margin-left:20px;">
{foreach $newsItems as $news }
<li class="small"><a href={$news.url_alias|ezurl}>{$news.name|wash}</a></li>
 {/foreach}
 </ul> 
 </div> 
{/foreach}
<div id="ivw"></div>
</div>

Hier passiert folgendes:

als erstes wird die TTL-Variable auf 0 gesetzt, damit immer die neuesten News angezeigt werden (kein Caching).

Die $start_node_id wird manuell auf 207 gesetzt, das ist wie erwähnt, der News-Folder unter dem alle News abgelegt werden.Der erste Fetch ('list') holt aus dem $box_node , z.B. 332 für "Netzwerk" (übergeordneter Themenbereich) die untergeordneten Kategorien. Diese liegen dort tatsächlich als untergeordnete Objekte. Eigentlich sollte der Array besser "subkategorien" heißen statt "news", weil hier ja noch keine News gefetcht wurden...

Pro gefundener Subkategorie muß dann ein zweiter Fetch die Newsobjekte ($newsItems) selber holen. Dieser braucht dazu die start_node_id (s.o.), den Ort wo die News liegen und die contentojekt-Id der Kategorie ($item.contentobject_id) selber. Dieser Fetch wäre wahrscheinlich nicht sehr perfomant, allerdings wird nach Publikationsdatum sortiert und es werden nur die neuesten 6 News geholt.

Objektrelationen können über den 'extended_attribute_filter' abgefragt werden. Relations können pro News mehrere vorhanden sein.

Die abschließende Loop gibt dann die News pro Kategorie aus.

Nice work. Immer wieder schön anzusehen.