ConPressoPlus 4.1.6 Version 4.0c "Wild Horses" als BETA-Version 3 verfügbar (PHP 8.3) »»
9. April 2024 - PHP 8.3, Bugfixes, nützliche Modifikationen und zahlreiche Module... letzte Runde der Fehlersuche!
Diskussion zum Modul Menu (Automatische Navigation) für ConPresso 4
hscha
ConPresso-Experte
Beiträge: 720 Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 219 Mal
Danksagung erhalten: 27 Mal
Beitrag
von hscha » 06.11.2019 18:13
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">☰### 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 -->
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
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 06.11.2019 20:02
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.
hscha
ConPresso-Experte
Beiträge: 720 Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 219 Mal
Danksagung erhalten: 27 Mal
Beitrag
von hscha » 07.11.2019 09:31
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
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 07.11.2019 10:02
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.
hscha
ConPresso-Experte
Beiträge: 720 Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 219 Mal
Danksagung erhalten: 27 Mal
Beitrag
von hscha » 07.11.2019 10:52
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
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 07.11.2019 13:50
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...
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 07.11.2019 14:23
BTW bevor man Arbeit reinsteckt:
"dropdown" und "☰" (Hamburger) suggerieren ein Mouse-Over-Dropdown
Wie funktioniert das auf Touch-Geräten, die ja kein Mouse-Over kennen?
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 07.11.2019 14:39
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.
hscha
ConPresso-Experte
Beiträge: 720 Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 219 Mal
Danksagung erhalten: 27 Mal
Beitrag
von hscha » 07.11.2019 18:24
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...
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 07.11.2019 18:52
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.
hscha
ConPresso-Experte
Beiträge: 720 Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 219 Mal
Danksagung erhalten: 27 Mal
Beitrag
von hscha » 07.11.2019 20:02
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=...
MarkusR
Handbuchversteher
Beiträge: 7369 Registriert: 01.01.1970 01:00
Hat sich bedankt: 112 Mal
Danksagung erhalten: 936 Mal
Beitrag
von MarkusR » 07.11.2019 20:11
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').'">'
hscha
ConPresso-Experte
Beiträge: 720 Registriert: 22.02.2006 22:00
Wohnort: Berlin
Hat sich bedankt: 219 Mal
Danksagung erhalten: 27 Mal
Beitrag
von hscha » 07.11.2019 21:53
Variante 1 funktioniert...
Vielen Dank!