[gelöst] Navi-Startartikel nicht anzeigen, wenn kein Inhalt

Wie verwendet man Templates oder erstellt Navigationen und passt diese an.

[gelöst] Navi-Startartikel nicht anzeigen, wenn kein Inhalt

Beitragvon argon » 28. Mär 2009, 11:00

Betr.:
Navigation: 3 Ebenen / Liste mit li-Tags
Thomas Blum [blumbeet - web.studio]
http://www.redaxo.de/168-Templatedetails.html?template_id=14

Guten Tag,

seit gestern versuche ich nun dieses Navi-Template anzupassen und die Startartikel zu verbergen wenn kein Artikel-Inhalt vorhanden ist.

Bisher konnte ich dieses Template erfolgreich meinen Bedürfnissen anpassen und erweitern. Habe es nun auch auf 4 Unterpunkte erweitert und es funktioniert wunderbar. (siehe Code).

Nun mein Problem:
----------------------
Ich möchte, wenn die Navigation aufklappt und der jeweilige angeklickte Menüpunkt (Startartikel) keinen Inhalt hat, im Conten-Bereich die aktuelle Ansicht erhalten bleibt.

Noch kürzer: Navigation klappt auf ohne den Startartikel aufzurufen.

Kann mir bitte jemand einen Hinweis geben wo ich ansetzen muss, ich bin am verzweifeln. Ist es überhaupt möglich mit diesem Navi-Template?

Über einen kleinen Hinweis würde ich mich sehr freuen.

Hier der aktuelle Code:

Code: Alles auswählen
<?php
//Navigation mit 4 Ebenen


// EXPLODE PATH
$PATH = explode("|",$this->getValue("path").$this->getValue("article_id")."|");

// GET CURRENTS
$path1 = $PATH[1];
$path2 = $PATH[2];
$path3 = $PATH[3];


/* START 1st level categories */
$nav .= '<ul class="nav1st">';
foreach (OOCategory::getRootCategories() as $lev1) {
     
   if ($lev1->isOnline(true)):
      if ($lev1->getId() == $path1) {
         $nav .= '<li class="active"><a class="current" href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
      }
      // 2nd level - no active link
      else {
         $nav .= '<li><a href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
      }
       
      // 1st level had categories? -> go on
      $lev1Size = sizeof($lev1->getChildren());
   
      if ($lev1->getId() == $path1) {
         if ($lev1Size != "0") {
            $nav .= '<ul class="nav2nd">';

            // START 2nd level categories
            foreach ($lev1->getChildren() as $lev2):
               if ($lev2->isOnline(true)) {
                  // 2nd level - active link
                  if ($lev2->getId() == $path2) {
                     $nav .= '<li class="active"><a class="current" href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
                  }
                  // 2nd level - no active link
                  else {
                     $nav .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
                  }
                 
                  // 2nd level had categories? -> go on
                  $lev2Size = sizeof($lev2->getChildren());
   
                  if ($lev2->getId() == $path2) {
                     if ($lev2Size != "0") {
                        $nav .= '<ul class="nav3rd">';

                  
                   // START 3rd level categories
                        foreach ($lev2->getChildren() as $lev3):
                           if ($lev3->isOnline(true)) {
                              // 3rd level - active link
                              if ($lev3->getId() == $path3) {
                                 $nav .= '<li class="active"><a class="current" href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
                              }
                              // 3rd level - no active link
                              else {
                                 $nav .= '<li><a href="'.$lev3->getUrl().'">'.$lev3->getName().'</a>';
                              }
                      
                       // **********  neu ************
                       //*****************************
                      
                       // 3nd level had categories? -> go on
                       $lev3Size = sizeof($lev3->getChildren());
                      
                       if ($lev3->getId() == $path3) {
                         if ($lev3Size != "0") {
                           $nav .= '<ul class="nav4th">';
                           
                           // START 4th level categories
                           foreach ($lev3->getChildren() as $lev4):
                              if ($lev4->isOnline(true)) {
                                // 4th level - active link
                                if ($lev4->getId() == $path4) {
                                  $nav .= '<li class="active"><a class="current" href="'.$lev4->getUrl().'">'.$lev4->getName().'</a></li>';
                                }
                                // 4th level - no active link
                                else {
                                  $nav .= '<li><a href="'.$lev4->getUrl().'">'.$lev4->getName().'</a></li>';
                                }

                               }
                                    endforeach;
                                 // END 4th level categories   
                           $nav .= '</ul>';
                          } // END by if ($lev3Size != "0"):
                        } // END by if ($lev3->getId() == $path3)
                      
                      
                       // **********  neu ************   
                       // ****************************                   

                           $nav .= '</li>'; /*ergänzt*/

                           }
                        endforeach;
                        // END 3rd level categories
                  
                        $nav .= '</ul>';
                     } // END by if ($lev2Size != "0"):
                  }
                  $nav .= '</li>';
               }
            endforeach;
            // END 2nd level categories
      
            $nav .= '</ul>';
         } // END by if ($lev1Size != "0"):
      }
      $nav .= '</li>';

   endif; // END by if ($lev1->isOnline())
}
$nav .= '</ul>';
// END 1st level categories

print $nav;
?>


Vielen Dank!!!
Zuletzt geändert von argon am 4. Apr 2009, 15:34, insgesamt 4-mal geändert.
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon argon » 28. Mär 2009, 19:50

Hier in diesem Thread...:
http://forum.redaxo.de/ftopic7817.html
...ist ein ähnliches Thema, da hat leider auch niemand etwas dazu geschrieben.... außer der Thread-Ersteller selber und das hat bei mir nicht funktioniert.

Hat denn niemand eine Vorschlag?

VG... argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon argon » 29. Mär 2009, 09:45

Ist denn niemand dabei der mal vor dem gleichen Problem stand, oder ist dieses Problem einfach zu trivial, oder zu kompliziert?

Ooooder ist jemand nur bereit zu helfen wenn ich Geld dafür bezahle?
Ok, habe ich kein Problem damit.

Möge sich bitte dieser jemand bei mir melden und mir mitteilen was er für diese Hilfe haben möchte.

Es ist sehr dringend und ich bin auch bereit meine Dankbarkeit nicht nur in Worte zu fassen. ... :wink:

Vielen Dank!

argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon flipps » 29. Mär 2009, 11:49

Hallo argon,

wenn ich dich richtig verstehe, dann möchtest du überprüfen ob der Startartikel der Kategorie der ersten Ebene Inhalt hat, und wenn nicht, dann soll ein Link wie href="#" eingesetzt werden.

Dafür ist mein php leider zu schlecht, aber wenn alle deine Startartikel der ersten Ebene leer sind, dann könnte das anders funktionieren.

Schau dir den folgenden Codeschnipsel an:
Code: Alles auswählen
/* START 1st level categories */
$nav .= '<ul class="nav1st">';
foreach (OOCategory::getRootCategories() as $lev1) {
     
   if ($lev1->isOnline(true)):
      if ($lev1->getId() == $path1) {
         $nav .= '<li><a class="current" href="'.$lev1->getUrl().'">'.$lev1->getName().'</a>';
      }


Wenn hier statt
Code: Alles auswählen
href="'.$lev1->getUrl().'"

Das hier eingibst
Code: Alles auswählen
href="#"


Dann müsste das meiner Meinung nach klappen.

Ist halt keine Überprüfung drin, ob der Startartikel leer ist oder nicht.

Grüße
Phil
flipps
 
Beiträge: 28
Registriert: 12. Mär 2009, 16:26

Beitragvon argon » 29. Mär 2009, 14:03

Hi Phil,

vielen Dank für Deine Antwort... :D

Deinen Vorschlag habe ich umgesetzt, leider ohne Erfolg.

Ich habe folgendes für die zweite Ebene probiert:

1. Startartikel-Inhalt in eine Variable schreiben
2. Abfragen ob Startartikel Inhalt vorhanden
3. Wenn Startartikel nicht vorhanden diesen Link erzeugen:
Code: Alles auswählen
$nav .= '<li><a class="current" href="#">'.$lev2->getName().'</a>';

4. Wenn Startartikel vorhanden diesen Link erzeugen:
Code: Alles auswählen
$nav .= '<li><a class="current" href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';


Es funktioniert so leider nicht.

Folgendes passiert:

1.
klick auf die erste Ebene
--> zweite Ebene klappt auf

2.
klick auf den ersten Menü-Punkt der zweiten Ebene (der keinen Inhalt für Startartikel hat)
--> dritte Ebene klappt auf und es erscheint im Content-Bereich eine leere Seite, diese soll nicht sein.

3.
Beim erneuten klick auf die zweite Ebene, lande ich auf der Startseite des Projekts, weil die Seite mit
Code: Alles auswählen
... href="#" ...
nicht existiert.

Es ist zum verrückt werden.... :cry:

Hier der Code:

Code: Alles auswählen

...

// START 2nd level categories
foreach ($lev1->getChildren() as $lev2):
   if ($lev2->isOnline(true)) {

     //2nd level - active link
     if ($lev2->getId() == $path2) {
         
         $content = $this->getArticle(); // Startartikel in Variable schreiben
         
         if ($content == ''){ // Abfrage ob Startartikel-Inhalt vorhanden
            echo "Artikel-Inhalt ist leer"; // TEST Ausgabe
            $nav .= '<li><a class="current" href="#">'.$lev2->getName().'</a>';
         }else{
            $nav .= '<li><a class="current" href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
         }   
               
     }
    
     //2nd level - no active link
     else {
      $nav .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
     }

...




Trotzdem, vielen Dank für Deine Bemühung...


schöne Grüße

argon

:)
Zuletzt geändert von argon am 29. Mär 2009, 15:22, insgesamt 1-mal geändert.
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon flipps » 29. Mär 2009, 14:16

Hm ok, du hast recht. Der Link so geht nicht.
Code: Alles auswählen
... href="#" ...


Und was passiert wenn du statt
Code: Alles auswählen
<li><a class="current" href="#">'.$lev2->getName().'</a>

einfach
Code: Alles auswählen
<li><span class="klasse">'.$lev2->getName().'</span>

einsetzt?

Klappt das dann?

Dann wird kein link erzeugt, aber die nächste Ebene müsste ja durch das :hover in der css trotzdem aufgehen. Eventuell musst du dort dann noch was anpassen.

Sind alles nur Vermutungen wie es klappen könnte. Ich kanns gerade selbst nicht testen.

Gruß
Phil
flipps
 
Beiträge: 28
Registriert: 12. Mär 2009, 16:26

Beitragvon argon » 29. Mär 2009, 14:42

also, habe Deinen Vorschlag ausprobiert....

Folgendes passiert:

Die Unterebene (3.Ebene) klappt auf und die Verlinkung, im Menü-Punkt den ich angeklickt habe (zweite Ebene), verschwindet . Im Content-Bereich erscheint wieder die leere Seite.

Mehr passiert leider nicht.

Ich vermute fast das es so einfach nicht zu lösen ist, da ich auch nicht der "PHP-Crack" bin hoffe ich noch auf einen entscheidenden Hinweis.

Trotzdem, Danke Phil... :wink:


Gruß

argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon flipps » 29. Mär 2009, 18:04

Hm...schade. Dann muss sich das wirklich ein PHP Crack mal anschauen.

Grüße
Phil
flipps
 
Beiträge: 28
Registriert: 12. Mär 2009, 16:26

Beitragvon darwin » 30. Mär 2009, 07:48

HI,
probiers mal damit:
Code: Alles auswählen
// START 2nd level categories
foreach ($lev1->getChildren() as $lev2):
    if ($lev2->isOnline()):
        // 1st Slice des Artikels holen
        $firstSlice = OOArticleSlice::getFirstSliceForArticle($lev2->getId(), $clang);
        if($firstSlice == null) {
              // Hier Ausgabe wenn Slice leer ist
              print "Artikel hat keinen Slice";
        } else {
               // wenn vorhanden, dann weiter
              // 2nd level - active link
              if ($lev2->getId() == $path2) {
                   $navLeftCol .= '<li class="active"><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a></li>';
              } else {
                   $navLeftCol .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a></li>';
              }
endif;


*ungetestet*...

grz. Chris
Benutzeravatar
darwin
 
Beiträge: 1261
Registriert: 2. Jan 2007, 16:10
Wohnort: LA

Beitragvon argon » 30. Mär 2009, 09:31

Guten Morgen Chris,

vielen Dank für Deinen Vorschlag.

habe es ein wenig angepasst und ausprobiert, leider ohne Erfolg.
Also, die Idee von Dir abzufragen ob es einen Slice gibt oder nicht finde ich gut, das scheint aber leider auch nicht der richtige Weg zu sein.

Folgendes passiert:
----------------------


1.
klick auf die erste Ebene --> zweite Ebene klappt auf und es erscheint der Hinweis "Artikel hat keinen Slice". Hinweis taucht dann so oft auf wie es Unterpunkte in der zweiten Ebene gibt (wegen foreach...).

2.
Alle Punkte auf der zweiten Ebene erhalten dann den Link den ich vorgegeben habe. hier (zum test) mit href="#".

3.
Wenn ich auf diese Links klicke lande ich natürlich wieder auf der Startseite, da diese Seiten nicht existieren.

Ich vermute fast das es an dieser Stelle gar nicht möglich ist, diese Art von Navigation zu realisieren, da hier nur die Links erzeugt werden.
Ein Startartikel hängt aber immer an einer Kategorie.
Ich denke es würde nur funktionieren, wenn man es schaffen würde diese beiden voneinander zu trennen.

Oder verstehe ich da etwas falsch?


Hier nochmal der Code von Dir den ich angepasst habe:

Code: Alles auswählen
...
          
// START 2nd level categories
foreach ($lev1->getChildren() as $lev2):
   if ($lev2->isOnline(true)) {
      
      // 1st Slice des Artikels holen
      $firstSlice = OOArticleSlice::getFirstSliceForArticle($lev2->getId(), $clang);
      
      if($firstSlice == null) {
         print "Artikel hat keinen Slice"; // Test-Ausgabe
         $nav .= '<li><a href="#">'.$lev2->getName().'</a>';      
      } else {  // wenn vorhanden, dann weiter
         // 2nd level - active link
         if ($lev2->getId() == $path2) {
               $nav .= '<li><a class="current" href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
         // 2nd level - no active link
         }else{
            $nav .= '<li><a href="'.$lev2->getUrl().'">'.$lev2->getName().'</a>';
         }
      }

...



schöne Grüße

argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon darwin » 30. Mär 2009, 10:24

Hi...
probier mal
Code: Alles auswählen
$nav .= '<li><a href="'.$lev2->getParentId().'">'.$lev2->getName().'</a>';


*ungetestet*
grz.Chris

PS: Schau Dir mal das Redaxo CheatSheet von Thomas durch ...
evtl, finest du da nen Hinweis
Benutzeravatar
darwin
 
Beiträge: 1261
Registriert: 2. Jan 2007, 16:10
Wohnort: LA

Beitragvon argon » 30. Mär 2009, 10:43

habe ich ausprobiert, es wird nun die article_id des übergeordneten Menüpunkts (hier Ebene 1) in alle Unterpunkte* geschrieben.

*z.B steht jetzt überall :
www.meinprojekt.xy/12

leider klappt das auch nicht.... :(
Code: Alles auswählen
...
// 1st Slice des Artikels holen
$firstSlice = OOArticleSlice::getFirstSliceForArticle($lev2->getId(), $clang);

if($firstSlice == null) {
   print "Artikel hat keinen Slice"; // Test-Ausgabe
   $nav .= '<li><a href="'.$lev2->getParentId().'">'.$lev2->getName().'</a>';      
} else {  // wenn vorhanden, dann weiter
...



schöne Grüße

argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon argon » 30. Mär 2009, 13:19

Also, das Redaxo CheatSheet habe ich mir grad ausgedruckt, es ist sicherlich sehr hilfreich um einen Überblick über die Methoden zu bekommen, aber ich glaube für die Lösung meines Problems muss ich an anderer Stelle eingreifen.

Trotzdem Danke für den Link und vielen Dank an Thomas für die tolle Arbeit. ...werde ich sicherlich öfter mal reinschauen, habe ich gleich mal an die Wand "getackert" ... :wink:

Die "deadline" kommt immer näher und ich habe immer noch keine Lösung...
:cry: .... Mir würde schon reichen wenn mir jemand sagt das es absoluter Blödsinn ist was ich hier versuche, dann könnte ich mir weitere Mühe sparen.

Ich habe auf einigen Redaxo-Seiten gesehen das die Leute einfach die Unterpunkte in den Inhaltsbereich reinkopiert haben, damit dort überhaupt etwas steht. Finde aber diese Variante total blöd, da sich dann einfach nur die Unterpunkte im Content-Bereich befinden und alles doppelt ist.

Daraus schließe ich das ich mit diesem Problem nicht alleine dastehe.

Schade nur das keiner von den erfahrenen Entwicklern versucht zu helfen.


schöne Grüße...

argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Beitragvon Thomas.Blum » 30. Mär 2009, 16:07

Hej,

lege doch einfach eine Weiterleitung in den Artikel. Die zeigt dann auf den entsprechenden Artikel.

vg Thomas
blumbeet - web.studio - Dresden - 0351 217 6225
webbude - Blog über CSS.XHTML.REX
Ein Wunschzettel
Benutzeravatar
Thomas.Blum
Entwickler
 
Beiträge: 4670
Registriert: 24. Aug 2004, 21:11
Wohnort: Dresden

Beitragvon argon » 30. Mär 2009, 17:23

Hi Thomas, vielen Dank für Deinen Hinweis.

Das hilft mir weiter... :D :D :D

Es ist nicht genau das was ich wollte, aber damit lässt sich mein Problem lösen. Oh man, bin natürlich nicht auf die Idee gekommen nach "Weiterleitung" zu recherchieren, wenn ich ein Navi-Klappmenü vor mir habe.

Nun sehe ich plötzlich etliche Threads die sich mit fast dem gleichen Thema befassen.... :oops:

Falls jemand vor dem gleichen Problem steht, ich habe folgendes Modul von Jan Goldacker eingebunden:
http://www.redaxo.de/165-Moduldetails.html?module_id=385
funktioniert wunderbar.

folgendes passiert:
---------------------


Beim Klick auf eine Kategorie, wird, wenn das Modul dieser Kategorie zugewiesen wurde, intern auf einen Unterpunkt weitergeleitet und angezeigt.

Hmm.... So einfach kann eine Lösung sein.
Hartnäckigkeit zahlt sich manchmal aus... :lol:

@Thomas
Ich würde Dir gerne ein kleines "Dankeschön" zukommen lassen. Nicht nur für diesen Hinweis, sondern auch für Deine anderen tollen Arbeiten.
Ich benutze ja mittlerweile ziemlich viel von Dir.... :wink:
Schick mir bitte Deine E-Mail für PayPal.

Ach ich bin so happy.... 8)

schöne Grüße

argon
Benutzeravatar
argon
 
Beiträge: 85
Registriert: 13. Sep 2007, 05:44
Wohnort: Berlin

Nächste

Zurück zu Templates/Navigationen [R4]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast