Skip to content

Instantly share code, notes, and snippets.

@hirbod
Last active June 22, 2016 09:14
Show Gist options
  • Save hirbod/3912816 to your computer and use it in GitHub Desktop.
Save hirbod/3912816 to your computer and use it in GitHub Desktop.
Redaxo Advanced Navigation MULTIPLE
<?php
$nav = new advanced_rex_navigation();
$main_navigation = $nav->get(0,3,FALSE,TRUE,'main');
// 'main' ist der name des navigationstyps
// bitte anpassen je nach einstellung im meta-info-addon
/* weitere setter methoden:
$nav->setClasses(array('menu_item'));
$nav->setSeperator('/');
*/
/* setSeperator() fügt nach jedem Menüpunkt ein echtes <li class="seperator">WERT</li> hinzu */
$nav = new advanced_rex_navigation();
$footer_navigation = $nav->get(0,1,FALSE,TRUE,'footer'); // z.B. footer
?>
<div id="navigation_main">
<?php echo $main_navigation; ?>
</div>
<div id="navigation_footer">
<?php echo $footer_navigation; ?>
</div>
<?php
class advanced_rex_navigation extends rex_navigation {
var $navigation_type;
var $seperator;
var $seperator_class;
// überschreibe methode
function _getNavigation($category_id, $depth = 1){
static $depth = 0;
if($category_id < 1){
$nav_obj = OOCategory::getRootCategories($ignore_offlines);
}else{
$nav_obj = OOCategory::getChildrenById($category_id, $ignore_offlines);
}
$return = "";
if(count($nav_obj)>0){
$return .= '<ul class="rex-navi'. ($depth+1) .'[count_elements]">';
}
$counter = 0;
foreach($nav_obj as $nav){
$navigation_type_db = explode('|', $nav->getValue('cat_navigationstyp'));
if(!in_array($this->navigation_type, $navigation_type_db, true)){
continue;
}
$counter++;
$liClass = '';
$linkClass = '';
// classes abhaengig vom pfad
if($nav->getId() == $this->current_category_id){
$liClass .= ' rex-current';
$linkClass .= ' rex-current';
}elseif(in_array($nav->getId(),$this->path)){
$liClass .= ' rex-active';
$linkClass .= ' rex-active';
}else{
$liClass .= ' rex-normal';
}
$liClass .= ' nav_'.$counter;
// classes abhaengig vom level
if(isset($this->classes[$depth])){
$liClass .= ' '. $this->classes[$depth];
}
if(isset($this->linkclasses[$depth])){
$linkClass .= ' '. $this->linkclasses[$depth];
}
$liClass = $liClass == '' ? '' : ' class="'. ltrim($liClass) .'"';
$linkClass = $linkClass == ' class="level'.($depth+1).'"' ? '' : ' class="'. ltrim($linkClass) .' level'.($depth+1).'"';
$linkUrl = $this->_getUrl($nav);
$return .= '<li '. $liClass .'>';
$return .= '<a'. $linkClass .' href="'.$linkUrl.'">'.htmlspecialchars($nav->getName()).'</a>';
$depth++;
if(($this->open || $nav->getId() == $this->current_category_id || in_array($nav->getId(),$this->path)) && ($this->depth > $depth || $this->depth < 0)){
$return .= $this->_getNavigation($nav->getId(),$ignore_offlines);
}
$depth--;
$return .= '</li>';
}
if(count($nav_obj)>0){
$return .= '</ul>';
}
if($this->seperator != '' && $depth == 0){
$return = str_replace('</li><li','</li><li'.(trim($this->seperator_class) != '' ? ' class="'.$this->seperator_class.'"' : '').'>'.$this->seperator.'</li><li',$return);
}
$return = str_replace('[count_elements]', ' count_'.$counter, $return);
return $return;
}
// überschreibe methode
function get($category_id = 0,$depth = 3,$open = FALSE, $ignore_offlines = FALSE, $navigation_type = 'main'){
if(!$this->_setActivePath()){
return '';
}
$this->depth = $depth;
$this->open = $open;
$this->ignore_offlines = $ignore_offlines;
$this->navigation_type = $navigation_type;
return $this->_getNavigation($category_id,$this->ignore_offlines);
}
// gibt erste Kategorie mit Inhalt zurück
function _getUrl($category){
global $REX;
$url = $category->getUrl();
$url_id = $category->getId();
$cached_file_to_check = $REX['INCLUDE_PATH'].'/generated/articles/'.$url_id.'.'.$REX['CUR_CLANG'].'.content';
if(!file_exists($cached_file_to_check)){
// cached file existiert noch nicht. Deswegen müssen wir diese erstmal erstellen.
include_once ($REX["INCLUDE_PATH"]."/functions/function_rex_generate.inc.php");
$generate_article = rex_generateArticleContent($url_id, $REX['CUR_CLANG']); // OOArticle-Call erstellt automatisch Cache-File
}
if(file_exists($cached_file_to_check)){
$content_to_check = rex_get_file_contents($cached_file_to_check);
// leere Artikel beinhalten nur das schließende php
if($content_to_check == "?>"){
$children = $category->getChildren(true);
if(sizeof($children) > 0){
$url = $this->_getUrl($children[0]);
}
}
}
return $url;
}
// Trennzeichen zwischen Navigationspunkten setzen
function setSeperator($seperator = '|', $seperator_class = 'pipe'){
$this->seperator = $seperator;
$this->seperator_class = $seperator_class;
}
}
?>
Als erstes rufst du das Meta Infos-AddOn in Redaxo auf. Navigiere zu "Kategorien" und erstelle einen neuen Eintrag. Trage in die erste Spalte "navigationstyp" ein (genau so). Als Bezeichnung hab ich immer "Menüpunkt anzeigen in: (manchmal auch nur "Navityp" stehen)".
Feldtyp stellst du auf "select". Das sind meine Basis-Eintragungen:
main:Hauptnavigation|header:Header|footer:Footer|hidden:verstecken
Du kannst die Liste unendlich erweitern oder bearbeiten.
Als letztes bitte unter Feldattribute "multiple=multiple" eintragen, damit ein Navigationstyp auch an mehreren Stellen ausgegeben werden kann.
Bitte daran denken, die Anführungszeichen zu entfernen.
Die navigations-class die weiter unten folgt, bitte so einbinden, das diese global zur Verfügung steht (z.B. in einem AddOn config.inc.php include, oder direkter include im Template)
@hirbod
Copy link
Author

hirbod commented Jan 23, 2014

Update für PHP 5.4 eingespielt, keine Strict Standard Errors mehr

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment