Backboneit navigation: Unterschied zwischen den Versionen
Aus Contao Community Documentation
K (Aufbereitung) |
Toflar (Diskussion | Beiträge) (Anpassung Version und ER-Link) |
||
(3 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
| Dev=Oliver Hoff | | Dev=Oliver Hoff | ||
| DevSite=http://www.hofff.com/ | | DevSite=http://www.hofff.com/ | ||
− | | ExtVersion=1. | + | | ExtVersion=1.1.0 |
| Version=ab 2.9 | | Version=ab 2.9 | ||
| TLVersion=2.7.0 - 2.8.4 | | TLVersion=2.7.0 - 2.8.4 | ||
− | | ERLink=http://www.contao.org/erweiterungsliste/view/backboneit_navigation | + | | TrackerLink=http://www.contao-forge.org/projects/backboneitnavigation/issues |
+ | | ERLink=http://www.contao.org/erweiterungsliste/view/backboneit_navigation.html | ||
}} | }} | ||
Zeile 70: | Zeile 71: | ||
} | } | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === Beispiel === | ||
+ | |||
+ | ''Danke an Christoph Wiechert a.k.a. psi'' | ||
+ | |||
+ | Folgendes Beispiel fügt einen Level_1 Eintrag und dazu mehrere Level_2 Einträge zum aktuellen Level_0 Eintrag hinzu: | ||
+ | |||
+ | - Level_0<br> | ||
+ | -- Level_1 (wird eingefügt)<br> | ||
+ | --- Level_2.0 (wird eingefügt)<br> | ||
+ | --- Level_2.1 (wird eingefügt)<br> | ||
+ | --- Level_2.2 (wird eingefügt)<br> | ||
+ | |||
+ | <source> | ||
+ | <?php | ||
+ | |||
+ | /** | ||
+ | * Helperclass to insert navigation-items | ||
+ | * @author psi | ||
+ | */ | ||
+ | class Brands_BackboneNavi extends Controller | ||
+ | { | ||
+ | |||
+ | public function hook($objNav, $arrRoots) | ||
+ | { | ||
+ | $this->import('Database'); | ||
+ | |||
+ | // Eine contao-seite enthält ein modul mit "virtuellen" unterseiten | ||
+ | // Bsp: http://example.com/module-page/item1.html | ||
+ | // Bsp2: http://example.com/module-page/item1/subitem1.html | ||
+ | // herrausschneiden von "item1" | ||
+ | if(!preg_match("~^".preg_quote($GLOBALS['objPage']->alias,'~')."/([a-z0-9_-]+).*\.html$~i",$this->Environment->request,$erg)) return; | ||
+ | |||
+ | // level_1 Eintrag anhand von "item1" einfügen | ||
+ | $objDesigner = $this->Database->prepare('SELECT id,title,alias FROM tl_brand WHERE alias=? AND published=?')->execute($erg[1],'1'); | ||
+ | if(!$objDesigner->numRows) return; | ||
+ | |||
+ | // Seite in den Navigations-Pool hinzufügen | ||
+ | $objNav->arrItems[$objDesigner->alias.'-'.$objDesigner->id] = array | ||
+ | ( | ||
+ | 'link' => $objDesigner->title, | ||
+ | 'href' => $this->generateFrontendUrl($GLOBALS['objPage']->row(),'/'.$objDesigner->alias), | ||
+ | // 'isTrail' => (preg_match("~".preg_quote($objDesigner->alias,'~')."\.html$~i",$this->Environment->request)) | ||
+ | 'isTrail' => true // wir zeigen ohnehin immer nur einen Eintrag des level_1 an, deshalb immer true | ||
+ | ); | ||
+ | |||
+ | // als Unterseite von level_0 zuweisen | ||
+ | $objNav->arrSubpages[$GLOBALS['objPage']->id][] = $objDesigner->alias.'-'.$objDesigner->id; | ||
+ | |||
+ | |||
+ | // level_2 Einträge einfügen | ||
+ | $objCats = $this->Database->prepare('SELECT category,categoryAlias FROM tl_brand_product WHERE pid=? AND published=? GROUP BY category')->execute($objDesigner->id,'1'); | ||
+ | while($objCats->next()) | ||
+ | { | ||
+ | // Seite in den Navigations-Pool hinzufügen | ||
+ | $objNav->arrItems[$objDesigner->id.'-'.$objCats->categoryAlias] = array | ||
+ | ( | ||
+ | 'link' => $objCats->category, | ||
+ | 'href' => $this->generateFrontendUrl($GLOBALS['objPage']->row(),'/'.$objDesigner->alias.'/'.$objCats->categoryAlias), | ||
+ | 'isTrail' => (preg_match("~".preg_quote($objCats->categoryAlias,'~')."(/.+|.html)$~i",$this->Environment->request)) | ||
+ | ); | ||
+ | // Seite als Unterseite des level_1 Eitnrags zuweisen | ||
+ | $objNav->arrSubpages[$objDesigner->alias.'-'.$objDesigner->id][] = $objDesigner->id.'-'.$objCats->categoryAlias; | ||
+ | } | ||
+ | |||
+ | return $arrRoots; | ||
+ | } | ||
+ | } | ||
+ | ?> | ||
</source> | </source> |
Aktuelle Version vom 28. August 2011, 12:20 Uhr
Erweiterungs-Übersicht | |
---|---|
Name des Entwicklers | Oliver Hoff |
Entwickler Webseite | http://www.hofff.com/ |
Version der Erweiterung | 1.1.0 |
Kompatibilität mit Contao Version | ab 2.9 |
Kompatibilität mit TYPOlight Version | 2.7.0 - 2.8.4 |
Link zum Extension Repository | http://www.contao.org/erweiterungsliste/view/backboneit_navigation.html |
Link zum Tracker | http://www.contao-forge.org/projects/backboneitnavigation/issues |
Inhaltsverzeichnis
Erweiterung bestehend aus einer Sammlung von Navigationselementen (vorerst nur ein erweitertes Navigationsmodul).
Anmerkungen zum Bestimmen der Sichtbarkeit einer Seite:
- Der Veröffentlichungsstatus gilt ausschließlich für eine Seite selbst. Das heißt zum Beispiel, dass eine Navigation durchaus dargestellt wird, selbst wenn die Referenzseite nicht veröffentlicht ist.
- Der Seitenschutz für bestimmte Mitgliedergruppen vererbt sich auf alle Unterseiten, außer denjenigen die selbst explizit einen Seitenschutz für Mitgliedergruppen definieren und deren Unterseiten.
- Die Einstellung "Nur Gästen anzeigen" gilt nur für die Seite selbst. Tatsächlich ist die Seite für angemeldete Benutzer auch noch verfügbar, soll nur in keiner Navigation angezeigt werden. (Anders als zum Beispiel Artikel, die nur Gästen angezeigt werden. Diese werden gar nicht mehr gerendert.)
- "Im Menü verstecken" gilt nur für die Seite selbst.
Ein Multitalent: Es ist alles möglich was mit einem Navigationsmenü oder einer Individuellen Navigation möglich ist, Kombinationen aus beiden und noch einiges mehr. Einfach ausprobieren.
Funktionen:
- Kompatibel zu den Templates für das Standard-Navigationsmenü (einziger Unterschied ist, das Seiten die CSS-Klasse "submenu" tatsächlich auch nur dann bekommen, wenn dieses Untermenü gerendert wird)
- Mehrere Referenzseiten (Wurzeln der Navigation)
- Aktuelle Seite als Referenzseite
- Startebene wird relativ zu den Referenzseiten berechnet (negative Startebene möglich)
- Hardlimit flexibel (Anmerkung: Stopebene und Hardlimit beziehen sich relativ zur Startebene &endash; diessollte auch durch die geänderten Labels der Moduleinstellungen hervorgehen.
- Versteckte und geschützte Seiten anzeigen
- Als Sitemap verwendbar
- Optimierte Algorithmen: Zum Beispiel wird pro Navigationsebene nur noch eine Datenbankabfrage durchgeführt, was vorallem bei einer sehr verzweigten Navigation Vorteile bringen sollte.
- Erweiterbar per Hook
config.php
$GLOBALS['TL_HOOKS']['backboneit_navigation_menu'][] = array('MyNavigationHook', 'hook');
MyNavigationHook.php
class MyNavigationHook { // ... singleton dummy code ... public function hook($objThis, $arrRoots) { $intParentID = 1; // the ID of the parent node, were your new node should be appended/inserted to. if(!isset($objThis->arrItems[$intParentID])) // test if the parent should be rendered (to avoid my hook, if it is not needed) return; $strMyNewNodeID = 'MyNavigationHook' . 1; // to avoid collision do not use plain numbers (reservered for tl_page dataset IDs) // and prefix the ID with something specific to your hook $objThis->varActiveID = $strMyNewNodeID; // set my new node as active navigation item $objThis->arrSubpages[$intParentID][] = $strMyNewNodeID; // append the my new node to the end of $intParentIDs childs $arrRoots[] = $strMyNewNodeID; // additionally add my new node to the end of the first level $objThis->arrItems[$strMyNewNodeID] = array( 'class' => 'myclass', 'isTrail' => true, // whether this node is in the trail path of the active page // ... more rendering information for the navigation template (see class AbstractNavigationMenu for all fields) ... ); return $arrRoots; // return the modified first navigation level (not needed if unmodified) } }
Beispiel
Danke an Christoph Wiechert a.k.a. psi
Folgendes Beispiel fügt einen Level_1 Eintrag und dazu mehrere Level_2 Einträge zum aktuellen Level_0 Eintrag hinzu:
- Level_0
-- Level_1 (wird eingefügt)
--- Level_2.0 (wird eingefügt)
--- Level_2.1 (wird eingefügt)
--- Level_2.2 (wird eingefügt)
<?php /** * Helperclass to insert navigation-items * @author psi */ class Brands_BackboneNavi extends Controller { public function hook($objNav, $arrRoots) { $this->import('Database'); // Eine contao-seite enthält ein modul mit "virtuellen" unterseiten // Bsp: http://example.com/module-page/item1.html // Bsp2: http://example.com/module-page/item1/subitem1.html // herrausschneiden von "item1" if(!preg_match("~^".preg_quote($GLOBALS['objPage']->alias,'~')."/([a-z0-9_-]+).*\.html$~i",$this->Environment->request,$erg)) return; // level_1 Eintrag anhand von "item1" einfügen $objDesigner = $this->Database->prepare('SELECT id,title,alias FROM tl_brand WHERE alias=? AND published=?')->execute($erg[1],'1'); if(!$objDesigner->numRows) return; // Seite in den Navigations-Pool hinzufügen $objNav->arrItems[$objDesigner->alias.'-'.$objDesigner->id] = array ( 'link' => $objDesigner->title, 'href' => $this->generateFrontendUrl($GLOBALS['objPage']->row(),'/'.$objDesigner->alias), // 'isTrail' => (preg_match("~".preg_quote($objDesigner->alias,'~')."\.html$~i",$this->Environment->request)) 'isTrail' => true // wir zeigen ohnehin immer nur einen Eintrag des level_1 an, deshalb immer true ); // als Unterseite von level_0 zuweisen $objNav->arrSubpages[$GLOBALS['objPage']->id][] = $objDesigner->alias.'-'.$objDesigner->id; // level_2 Einträge einfügen $objCats = $this->Database->prepare('SELECT category,categoryAlias FROM tl_brand_product WHERE pid=? AND published=? GROUP BY category')->execute($objDesigner->id,'1'); while($objCats->next()) { // Seite in den Navigations-Pool hinzufügen $objNav->arrItems[$objDesigner->id.'-'.$objCats->categoryAlias] = array ( 'link' => $objCats->category, 'href' => $this->generateFrontendUrl($GLOBALS['objPage']->row(),'/'.$objDesigner->alias.'/'.$objCats->categoryAlias), 'isTrail' => (preg_match("~".preg_quote($objCats->categoryAlias,'~')."(/.+|.html)$~i",$this->Environment->request)) ); // Seite als Unterseite des level_1 Eitnrags zuweisen $objNav->arrSubpages[$objDesigner->alias.'-'.$objDesigner->id][] = $objDesigner->id.'-'.$objCats->categoryAlias; } return $arrRoots; } } ?>