Page 2 of 2

Posted: Sun 26. Aug 2007, 10:07
by Oliver Georgi
Man kann auch in einem CMS nicht alles automatisieren!

Manche Menülösung lässt sich nur über Custom Logik umsetzen.

Wichtig aber - nach Möglichkeit KEIN inline PHP nutzen. Für Deinen Fall geht es wie folgt:

Im Template füge an der Stelle, an der das vertikale Menü erscheinen soll ein

Code: Select all

{VERTMENU}
Neues Script in frontend_render:

Code: Select all

<?php

$_vertmenu = '';

if(isset($LEVEL_ID[1])) {

  $_vertmenu = trim(   buildCascadingMenu( 'F,' . $LEVEL_ID[1] . ',' )   ); 
  // this is exactly the same as {NAV_LIST_UL: F,start_level_id, }
  // but built with php function behind
  if( $_vertmenu ) {
    
    $_vertmenu = '<div class="menu">' . $_vertmenu . '</div>';

  } else {
    $_vertmenu = '';
  }

}

$content['all'] = str_replace( '{VERTMENU}', $_vertmenu, $content['all'] );

?>
Oliver

P.S. Habs nicht getestet, sollte es aber tun.

Posted: Sun 26. Aug 2007, 11:05
by flip-flop
Funktioniert natürlich. :D

Vom Prinzip her brauch er eine frühe Abfrage ob eine gültige Sub-Ebene existiert. Denn mit diesem hier gezeigten Verfahren kann kein weiterer RT wie z.B. SHOW_CONTENT ein oder ausgeblendet (gesteuert) werden. Die Navi funktioniert natürlich (kaum anderes zu erwarten) aber darum ging es im Kernpunkt nicht.

So eine Funktion halte ich für sehr interessant.
(Vom Prinzip her auch für Artikel: "Existiert eine Detailausgabe für einen Artikel?" Denn ich habe keine unterschiedlichen Templates um z.B. {BROWSE:PREV - NEXT} ein/auszublenden wenn CPs dranhängen. - Ist aber ein anderes Thema.)

Knut

Posted: Sun 26. Aug 2007, 11:40
by Oliver Georgi
Da kommst Du um bestimmte Custom Entwicklung nicht drum herum.

Höhere Logik verlangt nun mal mehr Aufwand. In aller Regel ist die Contentlogik/Struktur im Vorfeld bekannt. Und da läufts am besten mit frontend_render

Oliver

Posted: Mon 27. Aug 2007, 16:00
by Marphy
Hallo Leute,
danke für die vielen neuen Antworten! :)

@betabi:
Tut mir leid, wenn das aus den Postings nicht so eindeutig hervorging, aber ein solches Replacement-Tag bringt mir nichts, da ich auch für die bedingte Anzeige anderer Elemente (z.B. die umgebende Tabelle) wissen muss, ob ein Untermenü angezeigt werden soll oder nicht.

@Oliver:
Also ich finde Inline-PHP in Vorlagen eine sehr komfortable und elegante Lösung, da ich nicht den Umweg über Datei-Anlegen + FTP machen muss. 8) Wüsste nicht, was dagegen sprechen sollte?
Trotzdem nehme ich deinen Vorschlag dankend zur Kenntnis und werde ihn so auch verbauen, wenn es der Weisheit letzter Schluss bleiben sollte.

@flip-flop:
Sehr schön, genau so habe ich es gewollt! :) Dachte aber nicht, dass das so eine schwere Geburt würde... :wink:


:arrow: Ansatz: Wenn eine globale Variable (-> $GLOBALS['...']) existieren würde, weche die Menüstruktur enthält, könnte man doch ganz einfach (auch inline) prüfen, ob es nach $GLOBALS['LEVEL_ID'][1] noch Unterpunkte gäbe... Ideen?

Grüße,
Marco

Posted: Thu 30. Aug 2007, 22:20
by Marphy
Also Leute, gibt es so eine globale Variable, die die Menüstruktur enthält?

Oder weiß jemand, wo ich eine Liste mit allen $GLOBALS-Variablen finden kann?
Das brächte uns doch schon fast zum Ziel... :)

Posted: Thu 30. Aug 2007, 22:51
by Oliver Georgi
Du bist ein Lustigbold!

Da Du ja auf Inline-PHP stehst:

Code: Select all

[PHP]dumpVar($GLOBALS);[/PHP]
Die Strukturelemente findest Du in:

Code: Select all

$content['struct']
Die aktuell aufgerufene Menütiefe:

Code: Select all

$LEVEL_ID
$LEVEL_KEY
Oliver

Posted: Mon 3. Sep 2007, 17:14
by Marphy
Oliver Georgi wrote:Du bist ein Lustigbold!
Ich fühle mich geehrt, Sir Georgi! :D

Du bist genial!! Nachdem ich die dumpVar-Ausgabe studiert hatte, war die Lösung nicht mehr weit:

Code: Select all

[PHP]
  if(isset($GLOBALS['LEVEL_ID'][2])) {  // [2] <--- hier liegt der Hund begraben!
    $level_id = $GLOBALS['LEVEL_ID'][1];

    echo '
<table ...>
...
<div class="nlu_navi1">{NAV_LIST_UL:F,'.$level_id.',,act_path,active}
...
</table>';
 }
[/PHP]
Wenn man per Weiterleitung der Hauptrubrik-Indexseite arbeitet (so wie ich das eh schon getan habe: sobald die Index-Seite einer Hauptrubrik aufgerufen wird, wird automatisch zur ersten Unterrubrik weitergeleitet), kann man über LEVEL_ID prüfen, wie tief man sich in der Seitenstruktur gerade befindet. Ab Ebene [2] befindet man sich nicht mehr innerhalb der Hauptrubrik, also muss ein Untermenü angezeigt werden.

Alternativ ginge es auch über Durchlauf der $content['struct'] und Abfrage von acat_struct:

Code: Select all

for ($i=0; $i<count($GLOBALS['content']['struct']); $i++) {
  if (isset($GLOBALS['content']['struct'][$i]) &&
      ($GLOBALS['content']['struct'][$i]['acat_struct'] == 
       $GLOBALS['LEVEL_ID']['1'])) {
    echo 'Ein Menü muss her!'; // Unterpunkt(e) vorhanden
    break;
  }
}
Wie dem auch sei, es funktioniert und ich bin glücklich! Die dumpVar-Geschichte kann man nur jedem empfehlen, das sollte glatt in die FAQ oder ins Manual oder als sticky ins Board gestellt werden....

Grüße,
Marco

Re:

Posted: Fri 11. Jan 2008, 14:05
by Jensensen
Marphy wrote:...Alternativ ginge es auch über Durchlauf der $content['struct'] und Abfrage von acat_struct:

Code: Select all

for ($i=0; $i<count($GLOBALS['content']['struct']); $i++) {
  if (isset($GLOBALS['content']['struct'][$i]) &&
      ($GLOBALS['content']['struct'][$i]['acat_struct'] == 
       $GLOBALS['LEVEL_ID']['1'])) {
    echo 'Ein Menü muss her!'; // Unterpunkt(e) vorhanden
    break;
  }
}
Wie dem auch sei, es funktioniert und ich bin glücklich!....

Hi Marco,
ich bin damit noch nicht glücklich...obiger Code knallt und liefert --> SYNTAX ERROR!!

Kannste das noch mal genauer anschauen, erklären, korrigieren....

Vielen Dank
Greetz

Re: Untermenü nur bedingt anzeigen [solved]

Posted: Fri 11. Jan 2008, 14:21
by flip-flop
Hallo Jensensen,

das Script funktioniert syntaktisch. Das Ergebnis ist eine andere Sache.

Knut

Re: Untermenü nur bedingt anzeigen [solved]

Posted: Fri 11. Jan 2008, 14:43
by Jensensen
flip-flop wrote:...das Script funktioniert syntaktisch....
Hallo Knut,

Code: Select all

<div id="subnav">[PHP] 
for ($i=0; $i<count($GLOBALS['content']['struct']); $i++) {
  if (isset($GLOBALS['content']['struct'][$i]) &&
      ($GLOBALS['content']['struct'][$i]['acat_struct'] ==
       $GLOBALS['LEVEL_ID']['1'])) {
    echo 'Ein Menü muss her!'; // Unterpunkt(e) vorhanden
    break;
  }
}
[/PHP]</div>
in meinem Template funktioniert nicht!
flip-flop wrote:...Das Ergebnis ist eine andere Sache...
ich würd's ja gerne mal sehen, das Ergebnis.... :cry:

Greetz

Re: Untermenü nur bedingt anzeigen [solved]

Posted: Fri 11. Jan 2008, 14:56
by flip-flop
Das Snippet schmeißt einfach nur den Text "Ein Menü muss her!" raus, obwohl keine Unterebene mehr existiert.
[EDIT]Doch funktioniert, hatte es in der falschen Ebene[/EDIT]

Re: Untermenü nur bedingt anzeigen [solved]

Posted: Fri 11. Jan 2008, 15:25
by Jensensen
Weiß der Geier warum - es klappt jetzt. SORRY für die Umstände...
Grüße

Re: Untermenü nur bedingt anzeigen [solved]

Posted: Wed 13. Feb 2008, 13:57
by update
Probiert - studiert - klappiert!
Super Sache - kein verstecktes div mehr da, wenn keine Menüunterpunkte vorhanden sind :lol:

Re: Untermenü nur bedingt anzeigen [solved]

Posted: Tue 19. Jul 2011, 02:07
by phalancs
Okay, es ist ein bischen her, aber keine eurer Lösungen funktioniert bei mir. Ich verstehe auch nicht so recht, weshalb das so kompliziert sein muss.
Meine Lösung ist dieses hier und das gibt genau die Anzahl der Unterebenen an. Mit dieser Zahl kann man dann machen was man will.

Code: Select all

echo count(getStructureChildData($GLOBALS['content']['cat_id']));
Fertig ist der Lack.