Backboneit navigation

Aus Contao Community Documentation


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


backboneit_navigation

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.

Navigationsmenü

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

Navigation per Hook erweitern

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;
	}
}
?>
Ansichten
Meine Werkzeuge

Contao Community Documentation

Meiner Meinung nach, sollten zu kleine Webspacepakete entweder Webspaß-Pakete (man beachte die Ironie) oder Horsting-Pakete heißen!

Sascha Müller
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge