Ebenenfrage

Diskussion zum Modul Menu (Automatische Navigation) für ConPresso 4
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 522
Registriert: 22.02.2006 23:00
Wohnort: Berlin
Hat sich bedankt: 199 Mal
Danksagung erhalten: 17 Mal

Ebenenfrage

Beitrag von hscha »

Hallo Markus,
wie schaffe ich es, einen Menübaum mit 2 Ebenen auszugeben? Die oberste Ebene ist kein Problem. Ich habe heute die neue Version mod_menu 4b installiert.
Template für ein horizontales Menü mit Dropdown-Untermenüs

Code: Alles auswählen

<!-- START_MOD_MENU_NAVIGATION -->
<nav class="reframe">
 <div class="topnav" id="myTopnav">
  <a href="index.html">Home</a>   
  <div class="dropdown">
<!-- START_NAVITEM -->
<a href="### NAV_LINK ###" class="dropbtn">☰### NAV_TEXT ###</a>
<!-- ENDE_NAVITEM -->
<a href="javascript:void(0); " class="icon" onclick="myFunction()">☰ </a>
<div class="dropdown"><div class="dropbtn"><form class="suche" method="get" name="suche" action="https://paula-fuerst-gemeinschaftsschule.de/cms/mod_search/index.php?rubric=suche" target="_self" ><input class="suche" type="hidden" name="action" value="search" />
<span>? </span>
<input class="suche" type="hidden" name="rubric" value="suche" /><input class="suche" type="text" name="q" size="10" value="" /></form>
</div>
</div>
</div>
</nav>
<!-- ENDE_MOD_MENU_NAVIGATION --><!-- START_MOD_MENU_NAVIGATION -->
<nav class="reframe">
 <div class="topnav" id="myTopnav">
  <a href="index.html">Home</a>   
  <div class="dropdown">
<!-- START_NAVITEM -->
<a href="### NAV_LINK ###" class="dropbtn">&#9776;### NAV_TEXT ###</a>
<!-- ENDE_NAVITEM -->
<a href="javascript:void(0); " class="icon" onclick="myFunction()">&#9776; </a>
<div class="dropdown"><div class="dropbtn"><form class="suche" method="get" name="suche" action="https://paula-fuerst-gemeinschaftsschule.de/cms/mod_search/index.php?rubric=suche" target="_self" ><input class="suche" type="hidden" name="action" value="search" />
<span>? </span>
<input class="suche" type="hidden" name="rubric" value="suche" /><input class="suche" type="text" name="q" size="10" value="" /></form>
</div>
</div>
</div>
</nav>
<!-- ENDE_MOD_MENU_NAVIGATION -->
Bei Levelwechsel steht ebenfalls <div class="dropdown"> bzw. </div>
Die Stylesheets sind zentral abgelegt.
Kann ich die Anzahl der auszugebenden Ebenen in Seitentemplates übergeben?
Grüße von Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

Ich schreibe das jetzt aus reiner Erinnerung, also ungetestet.

Das Konzept der getrennten Navigationen bestand eigentlich darin entweder eine vertikale Navigation mit mehreren Ebenen zu haben oder davon die erste Ebene in eine horizontale Hauptnavigation auszulagern.

Will man eine einzelne Navigation mit mehreren Ebenen, dann wählt man das Template für die vertikale Navigation, gestaltet sie aber so, dass sie horizontal ausgegeben wird.
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 522
Registriert: 22.02.2006 23:00
Wohnort: Berlin
Hat sich bedankt: 199 Mal
Danksagung erhalten: 17 Mal

Beitrag von hscha »

Danke Markus!
Mein Problem ist eher, dass ich über das Seitentemplate mit <!-- function: ModMenuHorizontal; --> ConPresso nicht dazu bewegen kann, den Menü-Baum komplett oder wahlweise mit Ebene 1 und 2 ausgeben kann. Ich kriege immer nur die 1. Ebene zu sehen. Das ist unabhängig von mod_menu - glaube ich zumindest...
Grüße von Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

Mit <!-- function: ModMenuHorizontal; --> (das ist die horizontale Navigation) kannst Du KEINE komplette Navigation ausgeben und auch keine weiteren Ebenen, da diese IMMER nur die ERSTE Ebene ausgibt.

Nur die vertikale Navigation kann MEHR als die erste Ebene ausgeben.

Willst Du also eine Navigation mit MEHREREN Ebenen über nur einen Platzhalter ausgeben, dann MUSST Du deinen Code in das Feld für die vertikale Navigation einfügen, als Typ "Nur vertikales Menü ohne kolabierende Einträge" auswählen und den Platzhalter <!-- function: ModMenuVertikal; --> im Seitentemplate verwenden.
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 522
Registriert: 22.02.2006 23:00
Wohnort: Berlin
Hat sich bedankt: 199 Mal
Danksagung erhalten: 17 Mal

Beitrag von hscha »

Danke, Markus!
Nun bin ich schon eine Weile mit trial&error damit beschäftigt, das wie oben eingestellte Modul zur Ausgabe folgenden Codes zu bewegen:

Code: Alles auswählen

<div class="dropdown">
    <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=unterricht" class="dropbtn">☰ Alltag</a>
    <div class="dropdown-content">
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=klassen">Klassen</a>
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/detail.php?rubric=unterricht&nr=10250">Stunden- und Pausenzeiten</a>
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=mensa">Speiseplan</a>      
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=ssp">SchulSozialPädagogik</a>
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=ags">AGs</a>            <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=btr">Ergänzende Betreuung</a>                
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=sov">Soziale Verantwortung</a>        
      <a href="https://paula-fuerst-gemeinschaftsschule.de/cms/_rubric/index.php?rubric=faq">FAQs, Dokumente, Hilfe</a>      
    </div>
  </div> 
Ich möchte das Menü mit 2 Ebenen ausgeben. Der erste Link ist auf Ebene 1, dann folgen die Unterpunkte auf Ebene 2. Die aus redaktionellen Gründen ebenfalls vorhandene 3. Ebene möchte ich nicht ausgeben. Das obige Beispiel umfasst einen von fünf Hauptmenü-Punkten.
Wie müsste das Template für eine solche Menüausgabe aussehen?

(P.S.: Danke für deine Geduld)
Grüße von Horst
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

Die 3. Ebene besteht aber nicht aus geschlossenen Rubriken, oder?

Leider kennt mod_menu keine Ausgabe bis zu x-ten Ebene.
Entweder alle oder eben die Über- und Unterpunkte der aktiven Rubrik.

Schade dass die Klassen nicht nach Ebenen nummeriert sind, dann könnte man ### NAV_LEVEL ### benutzen.

Und schade, dass Du keine UL-Liste benutzt, denn dann könnte man printNavigation() leicht anpassen, was ich letztens erst gemacht habe.

Muss mal drüber nachdenken...
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

BTW bevor man Arbeit reinsteckt:
"dropdown" und "&#9776;" (Hamburger) suggerieren ein Mouse-Over-Dropdown

Wie funktioniert das auf Touch-Geräten, die ja kein Mouse-Over kennen?
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

Wie müsste das Template für eine solche Menüausgabe aussehen?
Ist IMHO so nicht möglich, ohne ein neues Menü-Modul zu programmieren.
Das Modul ist so gebaut, dass entweder eine Tabellenkonstruktion oder eine Linkliste (ohne weitere Tags) mit Klassen gestaltet wird.

In deinem Code werden aber HTML-Tags zwischen einzelnen Einträgen benötigt, die aber nicht bei jedem Element benötigt werden.

Da wäre es wie erwähnt deutlich einfacher printNavigation() anzupassen.

Ideal wäre es, wenn Du ein Design hättest, bei dem die heute üblichen UL-Listen verwendet werden.
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 522
Registriert: 22.02.2006 23:00
Wohnort: Berlin
Hat sich bedankt: 199 Mal
Danksagung erhalten: 17 Mal

Beitrag von hscha »

Schau's dir mal an:
https://www.paula-fuerst-gemeinschaftss ... eigenblatt
Auf Mobiltelefonen funktioniert es per Antippen. Das Menü ist statisch. Ich möchte es halt vom CMS generieren lassen...
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

Du könntest in printnavigation.inc.php die Funktion folgendermaßen anpassen:

Code: Alles auswählen

function printNavigation($navi = '', $activeRubric = 0, $levels = 99, $parent = 0, $activeOnly = false, $target = '')
{

    if ($navi=='') $navi = getNavigation();
    if (empty($navi)) return false;

    if ($activeRubric==0) $activeRubric = $GLOBALS['cpoRubric']['id'];

    $actLevels = getActiveElements($navi, $activeRubric);

    $level = 0;
    if ($parent==0) $level = 1; // start with first level

    $ulstart = '<div class="'.($parent==0)?'dropdown':'dropdown-content'.'">';
    $ulend  = '';
    foreach ($navi as $k=>$v) {
        if ($v['level']<$level) $level = 0;            // printed all childs of active parent => clear $level
        if ($v['id']==$parent) $level = $v['level']+1; // found active parent => save $level
        if ($v['level']!=$level) continue;             // not the active level => continue
        if ($v['rubric']['seclevel']==SECLEVEL_CLOSED) {
            if (empty($_SESSION['SID_user']['id'])) continue;
            $db = new DB;
            $db->query("SELECT COUNT(*) FROM ".CPO_RUBRIC_PERMISSION." "
                      ."WHERE rubric_id='".(int)$v['rubric']['id']."' "
                      ."AND usergroups_id='".(int)$_SESSION['SID_user']['usergroups_id']."'");
            $db->next_record();

            if ($db->v('COUNT(*)')<=0 && $_SESSION['SID_user']['admin']!=ROLE_ADMIN) continue;
        }

        echo $ulstart;
        $ulstart = '';
        $ulend = '</div>';

        // build link
        $link = $v['navigation']['externalURL'];

        $_target = $target;
        // externalURLTarget can be used to override the setting
        if (!empty($v['navigation']['externalURLTarget']))
            $_target = $v['navigation']['externalURLTarget'];

        if (isset($v['rubric']['directory']) && $GLOBALS['cpoSystem']['PATH_INFO']) {
            $link = BASE_ABS.$v['rubric']['directory'].'/index.php/'.urlencode($v['rubric']['name']);
        }

        if (isset($v['rubric']['directory']) && !$GLOBALS['cpoSystem']['PATH_INFO']) {
            $link = BASE_ABS.$v['rubric']['directory'].'/index.php?rubric='.urlencode($v['rubric']['name']);
        }

        // mark active list elements
        //if ($actLevels[$level]==$v['id']) echo '<li class="active">';
        //else 				              echo '<li>';

        // print caption 
        if (empty($link)) echo htmlspecialchars($v['caption'], ENT_COMPAT, 'ISO-8859-15');
        else {
            echo '<a ';
            echo 'href="'.htmlspecialchars($link, ENT_COMPAT, 'ISO-8859-15').'"';
            if ($_target!='') echo ' target="'.htmlspecialchars($_target, ENT_COMPAT, 'ISO-8859-15').'"';
            if ($parent==0) echo ' class="dropbtn"';
            echo '>'.htmlspecialchars($v['caption'], ENT_COMPAT, 'ISO-8859-15').'</a>';
        }

        if ($activeOnly===true) $activeOnly = 0;

        // RECURSION!
        if (
            ($activeOnly===false || $activeOnly>0 || $actLevels[$level]==$v['id']) && // print only active sublevels
            $levels-1>0 // maximum number of levels to print
        ) { 
            $newActiveOnly = $activeOnly;
            if (!is_bool($activeOnly)) $newActiveOnly = $activeOnly - 1 ;
            printNavigation($navi, $activeRubric, $levels-1, $v['id'], $newActiveOnly, $target); 
        }

        //echo '</li>';
    }
    echo $ulend;
}
Ungetestet! Ob die Abfrage von $parent schon das gewünschte Ergebnis liefert, weiß ich nicht, hängt ein wenig von Deiner Navigation ab.
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 522
Registriert: 22.02.2006 23:00
Wohnort: Berlin
Hat sich bedankt: 199 Mal
Danksagung erhalten: 17 Mal

Beitrag von hscha »

Das sieht schon ganz gut aus! Ich frage mich, wie diese Zeile funktioniert:

Code: Alles auswählen

$ulstart = '<div class="'.($parent==0)?'dropdown':'dropdown-content'.'">'
Denn ausgegeben wird nur "dropdown" ohne <div class=...
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7100
Registriert: 01.01.1970 02:00
Hat sich bedankt: 102 Mal
Danksagung erhalten: 916 Mal

Beitrag von MarkusR »

Sollte eigentlich funktionieren.

Kannst es aber auch mal ändern zu:

Code: Alles auswählen

$ulstart = ($parent==0) ? '<div class="dropdown">' : '<div class="dropdown-content">';
oder wir versuchen es mit Klammersetzung:

Code: Alles auswählen

$ulstart = '<div class="'.(($parent==0)?'dropdown':'dropdown-content').'">'
Benutzeravatar
hscha
ConPresso-Experte
Beiträge: 522
Registriert: 22.02.2006 23:00
Wohnort: Berlin
Hat sich bedankt: 199 Mal
Danksagung erhalten: 17 Mal

Beitrag von hscha »

Variante 1 funktioniert...

Vielen Dank!