Markup Simple Navigation (ProcessWire)
Modul das die Erstellung von Navigationen erleichtert. Gibt eine verschachtelte Liste zurück die sich über diverse Optionen anpassen läßt. Mit Hooks lässt sich mehr beeinflussen. Allerdings ist es mir nicht gelungen den li Template Teil von Unterpunkten nach meinen Bedürfnissen anzupassen. Der Rest ging einwandfrei.
Siehe auch: Aligator (ProcessWire) vom selben Autor. Dies hat einen etwas flexibleren Ansatz.
MarkupSimpleNavigation
Standardmenü[Bearbeiten]
// DEFAULT liefert einen kompletten Baum
$treeMenu = $modules->get("MarkupSimpleNavigation");
echo $treeMenu->render(); // Ausgabe über render(), kann vorher noch manipuliert werden
// OPTIONS
$options = array(
'parent_class' => 'parent',
'current_class' => 'current',
'has_children_class' => 'has_children',
'levels' => true,
'levels_prefix' => 'level-',
'max_levels' => null,
'firstlast' => false,
'collapsed' => false,
'show_root' => false,
'selector' => '',
'selector_field' => 'nav_selector',
'outer_tpl' => '<ul>||</ul>',
'inner_tpl' => '<ul>||</ul>',
'list_tpl' => '<li%s>||</li>',
'list_field_class' => '',
'item_tpl' => '<a href="{url}">{title}</a>',
'item_current_tpl' => '<a href="{url}">{title}</a>',
'xtemplates' => '',
'xitem_tpl' => '<a href="{url}">{title}</a>',
'xitem_current_tpl' => '<span>{title}</span>',
'date_format' => 'Y/m/d',
'code_formatting' => false,
'debug' => false
);
echo $treeMenu->render($options);
// Weitere Parameter
// $page ist die aktuelle Seite (für current etc.)
// $rootpage ist der Startpunkt des Menüs
render($options, $page, $rootPage)
// anderer Startpunkt
$rootPage = $pages->get("/en/"); // or any other page that has subpages
echo $treeMenu->render(null, null, $rootPage);
// Mehrere Pages als Startpunkt mit Array of Pages (hier im Feld navigation_entries)
$entries = $pages->get("/")->navigation_entries;
echo $treeMenu->render(null, null, $entries);
Feld Platzhalter in Optionen[Bearbeiten]
'inner_tpl' => "
- ||
",
Selectors / Auswahl Filter auf Levelbasis[Bearbeiten]
Man kann für jeden Treelevel festlegen auf welcher Basis die Seiten gefiltert werden Im Code:
$pages->get(1001)->my_selector = "template=projects";
Oder man definiert ein Feld. Wenn dies auf der Seite vorhanden ist wird der Filter dort verwendet.
$options = array( "selector_field" => "my_selector" );
Man kann für jeden Level einen Filter festlegen:
$options = array( "selector_level1" => "template=ressort", "selector_level2" => "start=0, limit=10", "selector_level3" => "template=news|events, sort=-created", "selector_field" => "my_selector" ); selector_field behält auf alle Fälle Priorität.
Platzhalter: Feldwerte als Variablen[Bearbeiten]
- %s definiert wo die Klassen platziert werden (current, parent...)
- Feldplatzhalter können in den item tpl Ausgaben platziert werden.
{anyfield}
{headline|title}
//To output url you just use
{url}.
'list_field_class' => '{template} p{id}'
// will add ' basic-page p1001' to each list_tpl class string.
Hooks[Bearbeiten]
Hook um Klassen in li zu setzen[Bearbeiten]
$nav = $modules->get("MarkupSimpleNavigation");
function hookGetListClass(HookEvent $event){
$child = $event->arguments('page'); // current rendered child page
$class = $event->arguments('class'); // the class string already present
// any check on that child to set your custom class
if($child->id == 1001){
$event->return .= " yourclass"; // add your custom class to the existing
}
}
// setup the hook after on ___getListClass($class, $page) method
$nav->addHookAfter('getListClass', null, 'hookGetListClass');
echo $nav->render();
Hook um den Item (Link) String zu manipulieren[Bearbeiten]
$nav = $modules->get("MarkupSimpleNavigation");
function myItemString(HookEvent $event){
$child = $event->arguments('page'); // current rendered child page
// any logic with $child possible here
if($child->id == 1001){
// set the return value of this hook to a custom string
$event->return .= "<a href='$child->url'><span>Some Text</span>$child->title</a>";
}
}
// setup the hook after on ___getItemString($class, $page) method
$nav->addHookAfter('getItemString', null, 'myItemString');
echo $nav->render();
getTagsString Hook[Bearbeiten]
DEPRECATED instead use getItemString Hook Adding a hook to the link item being constructed and modify it.
function getTagsString(HookEvent $event){
$tpl = $event->arguments[0]; // the template string
$page = $event->arguments[1]; // the page getting rendered
if($page->open_blank){
// $event->return is the complete link you get from the hook, modify to you needs
$event->return = str_replace('href=','target="_blank" href=', $event->return);
}
}
$treeMenu->addHookAfter('getTagsString', null, "getTagsString");
echo $treeMenu->render();