Navigation mal ganz anders

smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Navigation mal ganz anders

Beitrag von smeusel »

Hi,

ich habe folgende Nuss, die ich einfach nicht knacken kann...
Anzuschauen unter:
http://www.zebraundgras.de/www/cms/

Ich bin dabei zwei Navigationslösungen zu fusionieren.
1. Navi aufteilen in 2 Module (Modul 1 = Ebene 1; Modul 2 = Ebene 2+3)
2. Diese beiden Module duplizieren und zeitgleich in ein und demselben Template benutzen.

Was funktioniert bereits:
- Die Navi in 2 Module aufteilen klappt.

Was funktioniert noch nicht:
- Die beiden Module duplizieren und 2 verschiedene Navibäume auf der selben Seite darstellen.

Was passiert zur Zeit:
- Obwohl der Code an den relevanten Stellen in der duplizierten Version geändert wurde, wird in der duplizierten Version der gleiche Baum wie in der original Version angezeigt.


Anbei mal der Output Code meines Duplizierten Moduls für Darstellung Ebene 1:

Code: Alles auswählen

<?php 

// template klasse includen 
include_once($cfg["path"]["contenido"] . 'classes/class.template.php'); 

/** 
* Array storing alle the 
* navigation data 
*/ 
$nav2items = array(); 


// template instanz 
$tpl = new Template; 

function nav2($idcat) { 

        global $nav2items, $client, $lang, $db, $cfg; 

        //searches for parentid 
        $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='$idcat'"; 

        $db->query($sql); 
        $db->next_record(); 

        $parentid = $db->f("parentid"); 

        // If parentid equals 0 break, 
        // first level reached. 
        if($parentid==0){ 
           if($idcat!=1){ 
              $nav2items=array(); 
              //search for the idcat where I´m the parent 
              $sql = "SELECT A.idcat, C.name 
                      FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C 
                      WHERE A.idcat = B.idcat AND B.idcat = C.idcat AND B.idclient='$client' AND C.idlang='$lang' 
                      AND C.visible='1' AND B.parentid='1' ORDER BY A.idtree"; 

                      $db->query($sql); 

                      while ($db->next_record()) { 

                             $nav2items[$db->f("idcat")] = array("idcat"=>$db->f("idcat"), 
                                                                 "name"=>$db->f("name")); 
                      } 

           } 
           return true; 
        } 

        // select idcats on the same level 
        // they have the same parent id 
        $sql = "SELECT A.idcat, C.name 
        FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C 
        WHERE A.idcat = B.idcat AND B.idcat = C.idcat AND B.idclient='$client' AND C.idlang='$lang' 
        AND C.visible='1' AND B.parentid='$parentid' ORDER BY A.idtree"; 

        $db->query($sql); 

        while ($db->next_record()) { 

               $tmp_nav2[$db->f("idcat")] = array("idcat"=>$db->f("idcat"), 
                                           "name"=>$db->f("name")); 
        } 

        // Add the old navigation array to the new one, 
        // because it is an item of the new one on place $idcat 
        $tmp_nav2[$idcat]["sub"] = $nav2items; 
        $nav2items = $tmp_nav2; 

        nav2($parentid); 

} 


if(!isset($idcat)){ 
     //set the start idcat 
     $idcat = 1; 
} 

//search for the idcat where I´m the parent 
$sql = "SELECT A.idcat, C.name 
        FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C 
        WHERE A.idcat = B.idcat AND B.idcat = C.idcat AND B.idclient='$client' AND C.idlang='$lang' 
        AND C.visible='1' AND B.parentid='$idcat' ORDER BY A.idtree"; 

$db->query($sql); 

while ($db->next_record()) { 

       $nav2items[$db->f("idcat")] = array("idcat"=>$db->f("idcat"), 
                                         "name"=>$db->f("name")); 
} 

nav2($idcat); 

/** 
* array $nav2items enthält alle daten 
* die für das aufbauen der navigation 
* notwendig sind. 
*/ 
echo '<table cellspacing="0" cellpadding="0" border="0"><tr><td><img src="images/button_freihalter-links.jpg" width=41 height=14 alt=""></td>'; 

foreach ($nav2items as $key => $data) { 

    // 1. navi ebene 
    $tpl->reset(); 
    $tpl->set('d', 'NAME',  $data['name']); 
    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang)); 
    $tpl->next(); 

    if ($idcat == $data['idcat'] || is_array($data['sub'])) { 
        $tpl->generate('templates/navfirst_on_2.html'); 
    } else { 
        $tpl->generate('templates/navfirst_off_2.html'); 
    } 

    } // end foreach 

echo '<td><img src="images/button_freihalter-rechts.jpg" width=43 height=14 alt=""></td></tr></table>'; 

?>
Überall wo im Original Modul "Nav" steht, habe ich "Nav2" daraus gemacht. Seitdem wird zwar überhaupt mal was angezeigt, aber leider nur der Baum des Original Moduls.

Wo habe ich Parameter oder Variablen übersehen, die noch geändert werden müssen, damit die duplizierte Navi erkennt, dass sie nicht dasselbe wie die erste anzeigen soll?

Anbei der Link zum Thread mit der "zerteilten Navi". Nur als Quellenhinweis.
http://www.contenido.de/forum/viewtopic.php?t=1413


Wer kann mir weiterhelfen? :-)

Danke,
smeusel
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ähm versteh ich nicht...
was möchtest du genau machen... ?
wie zwei navigationsbäume ?

die aufteilung des moduls das du verwendet ermöglicht es einen navigationsmodul auf 2 container aufzuteilen... was bei dir auch funktioniert...

welche aufgabe hat jetzt die zweite ?
*** make your own tools (wishlist :: thx)
smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Beitrag von smeusel »

:-D

ja, ein wenig verwirrend.
das layout der seite lässt es leider nicht zu die gesamte hauptnavi in einem zug durchzugenerieren, da designtechnisch die hauptnavi auf zwei bereiche aufgeteilt ist. einmal die navi direkt unter dem logo, dann ein wenig platz und dann geht es mit unterbrechung neben dem logo weiter.

da ich leider nicht weiss, wie ich die navi-generierungs-schleife nach genau 4 menüpunkten unterbrechen kann um dann eine graphik zwischen drinnen einzufügen und dann die navi fertig generieren lassen kann, wollte ich es eben auf 2 hauptnavigationen aufteilen.

der 2. part den du auf der seite siehst (neben dem logo) sollte nun eigentlich einen neuen hauptmenübaum zeigen. er stellt aber exakt den 1. dar. und hier ist auch mein problem. ich weiss nicht, welche variablen ich umbenennen muss, damit er nicht den 1. wiederholt, sondern meinen 2. hauptnavibaum verwendet.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ach so...
ähm, das ist etwas kompliziert was du da vorhast...

es wäre einfacher das layout im obrigen bereich anders aufzubauen...

die andere möglichkeit ist die ausgabe des template codes für den ersten level anders vorzunehmen...

man kann die ausgabe die via template gemacht wird in einer variable speichern... !
zb
$html .= $tpl->generate('templates/navfirst_on.html',1);

wenn du dann den ersten level komplett erzeugt hast sprich nach der foreach schleife kannst du diese variable weiterbehandeln...
zb mittels explode einen array erzeugen...
die ausgabe beim ersten container gibt die ersten 4 arrays aus...
und beim rechten bereich die restlichen arrays (das wäre dann ein eigenes modul das nur die verbliebenen arrays ausgibt)
*** make your own tools (wishlist :: thx)
smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Beitrag von smeusel »

leider bin ich kein php crack. besser gesagt, ich einer der typischen php herumstocherer.... :-)

2 hauptnavimodule mit unterschiedlichen bäumen auf einer seite zu verwenden ist ja möglich. das habe ich schon nachgelesen.
daher muss doch mein ansatz auch funktionieren....? ich mache ja eigentlich nichts anderes, nur das mein hauptnavimodul durch die aufspaltung halt anders aussieht. aber sonst ist es das selbe system...

wie würde dein ansatz in codeform aussehen? ich kann mir leider gar nichts unter deiner beschreibung vorstellen. ich habe nur soviel verstanden, dass die navi (ebene 1) dann zwar in einem modul generiert wird, aber auf 2 verschiedenen bereichen der seite ausgegeben werden kann.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

um meine möglichkeit auszuprogrammieren hab ich momentan wirklích keine lust und zeit...

ähm...
bleiben wir mal bei deiner variante...

du verwendest zwei mal das erste modul... für den first level

das erste modul konfigurierst du auf den ersten baum den du haben möchtest...

das zweite modul konfigurierst du auf den zweiten baum...

jetzt kommt der clou
das erste modul erzeugt einen array und zwar -> $navitems

das zweite modul muss einen anderen array erzeugen ! zb -> $navitems2

sonst überschreibt das zweite modul die werte vom ersten !!

für die ausgabe des 2nd und 3rd levels muss der zweite array ebenso berücksichtigt werden...
das heisst im zweiten modul kopierst du den kompletten foreach teil setzt in darunter nochmals hin und benennst die variable $navitems ind $navitems2 um...

das sollte es gewesen sein...
*** make your own tools (wishlist :: thx)
smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Beitrag von smeusel »

habe ich das nicht schon gemacht? (siehe code oben)
die variablen heissen bei mir nur "nav2item", sind aber umbenannt. im original-modul heissen sie auch "navitem".

oder habe ich etwas übersehen?
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

so genau hab ich mir oben das modul nicht angesehen...

ähm...
das modul ist leider für das was du vorhast nicht zu gebrauchen, sorry...

das ergibt sich daraus das keine voreinstellung gegeben ist welchen baum die navigation verwenden soll...

es wird immer die $idcat verwendet...

in der orginalen hauptnavigation gibt es die funktion die überprüft ob $idcat sich wirklich im korrekten baum befindet...

zb:

Code: Alles auswählen

/* Check if a category is child of another category */
if (!function_exists('catIsChildOf')) {

    function catIsChildOf($id, $idparent) {

        global $cfg, $client, $lang;

        $db = new DB_Contenido;

        $parent = $id;

        while ( $parent != 0 ) {

            $sql = "SELECT
                        a.parentid
                    FROM
                        ".$cfg["tab"]["cat"]." AS a,
                        ".$cfg["tab"]["cat_lang"]." AS b
                    WHERE
                        a.idclient  = '".$client."' AND
                        b.idlang    = '".$lang."' AND
                        a.idcat     = b.idcat AND
                        a.idcat   = '".$parent."'";

            $db->query($sql);
            $db->next_record();

            $parent = $db->f("parentid");

            if ($parent == $idparent) {
                return true;
            }

        }

        return false;

    }

}

if ( catIsChildOf($idcat, "CMS_VALUE[0]") ) {
    $sel_idcat = $idcat;
} else {
    $sel_idcat = "CMS_VALUE[0]";
}
und der array der erzeugt wird, wird an sich mittels
nav($sel_idcat);
erzeugt.

es muss dann natürlich einen inputbereich geben der die zu verwendente kategorie definiert oder man setzt "CMS_VALUE[0]" durch die ziffer des baumes der durchsucht werden soll...
*** make your own tools (wishlist :: thx)
smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Beitrag von smeusel »

hab ich es mir doch fast gedacht....

hmm, nun muss ich probieren, wo und wie ich die aktuelle hauptnavi von 4.4.4 aufteile, um den gleichen effekt zu bekommen, wie bei dem modul das ich schon in verwendung habe. hier war es wohl noch ein altes navi modul.

ich werde testen. :-D
danke auf jeden fall für den tipp.
smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Beitrag von smeusel »

so, ich habe jetzt einfach die seite ein wenig umgemodelt und mit den grafiken "beschissen" :-D

die gute alte "quick and dirty" lösung...

vielen dank für deine hilfe, emergency. du hast dir deinen namen verdient :-)

ich werde mich am wochenende mal mit einer "schöneren" lösung befassen.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

gerne

aber emergence hat nichts mit emergency zu tun... ;-)
*** make your own tools (wishlist :: thx)
smeusel
Beiträge: 53
Registriert: Do 18. Mär 2004, 11:27
Kontaktdaten:

Beitrag von smeusel »

Aufgrund der großen Nachfrage möchte ich hier nochmal das Modul der geteilten Navi posten, so wie ich es auf meiner Seite eingebaut habe.

Input Ebene 1:

Code: Alles auswählen

/**
 * Navigation
 *
 * INPUT
 *
 * @autor Jan Lengowski <Jan.Lengowski@4fb.de>
 * @copyright four for business AG 2003
 */

?>
<table cellspacing="0" cellpadding="0" cellpadding="4">

    <tr>
        <td class="text">Baum wählen:</td>
        <td>
            <select name="CMS_VAR[0]">
            <option value="0">-- kein --</option>
            <?php

                $sql = "SELECT
                            A.idcat,
                            C.name
                        FROM
                            ".$cfg["tab"]["cat_tree"]." AS A,
                            ".$cfg["tab"]["cat"]." AS B,
                            ".$cfg["tab"]["cat_lang"]." AS C
                        WHERE
                            A.idcat     = B.idcat AND
                            B.idcat     = C.idcat AND
                            C.idlang    = '".$lang."' AND
                            B.idclient  = '".$client."' AND
                            C.visible   = 1 AND
                            A.level     = '0'
                        ORDER BY
                            A.idtree";

                $db->query($sql);

                while ( $db->next_record() ) {

                    if ( "CMS_VALUE[0]" == $db->f("idcat") ) {
                        echo '<option selected="selected" value="'.$db->f("idcat").'">'.$db->f("name").'</option>';

                    } else {
                        echo '<option value="'.$db->f("idcat").'">'.$db->f("name").'</option>';

                    }
                }

            ?>
            </select>
        </td>
    </tr>

</table>

<?php

Output Ebene 1:

Code: Alles auswählen

<?php 

// template klasse includen 
include_once($cfg["path"]["contenido"] . 'classes/class.template.php'); 

/** 
* Array storing alle the 
* navigation data 
*/ 
$navitems = array(); 


// template instanz 
$tpl = new Template; 

function nav($idcat) { 

        global $navitems, $client, $lang, $db, $cfg; 

        //searches for parentid 
        $sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='$idcat'"; 

        $db->query($sql); 
        $db->next_record(); 

        $parentid = $db->f("parentid"); 

        // If parentid equals 0 break, 
        // first level reached. 
        if($parentid==0){ 
           if($idcat!=1){ 
              $navitems=array(); 
              //search for the idcat where I´m the parent 
              $sql = "SELECT A.idcat, C.name 
                      FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C 
                      WHERE A.idcat = B.idcat AND B.idcat = C.idcat AND B.idclient='$client' AND C.idlang='$lang' 
                      AND C.visible='1' AND B.parentid='1' ORDER BY A.idtree"; 

                      $db->query($sql); 

                      while ($db->next_record()) { 

                             $navitems[$db->f("idcat")] = array("idcat"=>$db->f("idcat"), 
                                                                 "name"=>$db->f("name")); 
                      } 

           } 
           return true; 
        } 

        // select idcats on the same level 
        // they have the same parent id 
        $sql = "SELECT A.idcat, C.name 
        FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C 
        WHERE A.idcat = B.idcat AND B.idcat = C.idcat AND B.idclient='$client' AND C.idlang='$lang' 
        AND C.visible='1' AND B.parentid='$parentid' ORDER BY A.idtree"; 

        $db->query($sql); 

        while ($db->next_record()) { 

               $tmp_nav[$db->f("idcat")] = array("idcat"=>$db->f("idcat"), 
                                           "name"=>$db->f("name")); 
        } 

        // Add the old navigation array to the new one, 
        // because it is an item of the new one on place $idcat 
        $tmp_nav[$idcat]["sub"] = $navitems; 
        $navitems = $tmp_nav; 

        nav($parentid); 

} 


if(!isset($idcat)){ 
     //set the start idcat 
     $idcat = 1; 
} 

//search for the idcat where I´m the parent 
$sql = "SELECT A.idcat, C.name 
        FROM ".$cfg["tab"]["cat_tree"]." AS A, ".$cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C 
        WHERE A.idcat = B.idcat AND B.idcat = C.idcat AND B.idclient='$client' AND C.idlang='$lang' 
        AND C.visible='1' AND B.parentid='$idcat' ORDER BY A.idtree"; 

$db->query($sql); 

while ($db->next_record()) { 

       $navitems[$db->f("idcat")] = array("idcat"=>$db->f("idcat"), 
                                         "name"=>$db->f("name")); 
} 

nav($idcat); 

/** 
* array $navitems enthält alle daten 
* die für das aufbauen der navigation 
* notwendig sind. 
*/ 
echo '<table cellspacing="0" cellpadding="0" border="0"><tr>'; 

foreach ($navitems as $key => $data) { 

    // 1. navi ebene 
    $tpl->reset(); 
    $tpl->set('d', 'NAME',  $data['name']); 
    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang)); 
    $tpl->next(); 

    if ($idcat == $data['idcat'] || is_array($data['sub'])) { 
        $tpl->generate('templates/navfirst_on.html'); 
    } else { 
        $tpl->generate('templates/navfirst_off.html'); 
    } 

    } // end foreach 

echo '<td><img src="images/button_freihalter-rechts.jpg" width=43 height=14 alt=""></td></tr></table>'; 

?>


Input Ebene 2+3:
Gibt es nicht.

Output Ebene 2+3:

Code: Alles auswählen

<?php 

// template klasse includen 
include_once($cfg["path"]["contenido"] . 'classes/class.template.php'); 


/** 
* array $navitems enthält alle daten 
* die für das aufbauen der navigation 
* notwendig sind. 
*/ 
echo '<table cellspacing="0" cellpadding="0" border="0">'; 
echo '<tr><tr><td witdth="15"><img src="images/spacer.gif" width="1" height="10"></td><td></td></tr>'; 

foreach ($navitems as $key => $data) { 

    // ------------ 1. navi ebene mit Ausgabe der aktiven Kategorie---------- 
    $tpl->reset(); 
    $tpl->set('d', 'NAME',  $data['name']); 
    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang)); 
    $tpl->next(); 
        if ($idcat == $data['idcat'] || is_array($data['sub'])) { 
        $tpl->generate(''); 
    }      
    if (is_array($data['sub'])) { 

        foreach ($data['sub'] as $key => $data) { 

            //---------------- 2. navi ebene --------------------------- 

            $tpl->reset(); 
            $tpl->set('d', 'NAME',  $data['name']); 
            $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang)); 
            $tpl->next(); 
                 if ($idcat == $data['idcat'] || is_array($data['sub'])) { 
                        $tpl->generate('templates/navsecond_on.html'); 
                    } else { 
                        $tpl->generate('templates/navsecond_off.html'); 
                    } 

            
            if (is_array($data['sub'])) { 

                foreach ($data['sub'] as $key => $data) { 

                    // -------------- 3. navi ebene -------------------- 

                    $tpl->reset(); 
                    $tpl->set('d', 'NAME',  $data['name']); 
                    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang)); 
                    $tpl->next(); 

                    if ($idcat == $data['idcat']) { 
                        $tpl->generate('templates/navthird_on.html'); 
                    } else { 
                        $tpl->generate('templates/navthird_off.html'); 
                    } 

                } // end foreach 

            } // end if 

        } // end foreach 

    } // end if 

} // end foreach 

echo '</tr></table>'; 

?>
Die Graphiken habe ich folgendermaßen in die erste Ebene der Navi gebracht:
templates/navifirst_on.html

Code: Alles auswählen

<!-- BEGIN:BLOCK -->
	 
    <td><a href="{HREF}" target="_self" ><img src="navi_images/{NAME}.jpg" border="0"></a></td>
	  
<!-- END:BLOCK -->
Die Graphiken einfach so benennen, wie ihr die Kategorie in der Navi benannt habt. Ich habe die Bilder für die Navi im Ordner "navi_images" abgelegt.
Um einen Highlight Effekt zu bekommen, einfach "Highlight-Grafiken" erstellen und im "navifirst_on.html" statt "navi_images/{NAME}.jpg" "navi_images/{NAME}2.jpg" schreiben.

Die Graphik dazu heisst dann z.B.:
"ueber_uns2.jpg" (Highlight)
"ueber_uns.jpg" (normal)
wenn die Kategorie "ueber_uns" heisst.

Ich hoffe ich konnte weiterhelfen.
:-)
smeusel
baumpaul
Beiträge: 346
Registriert: Mo 1. Mär 2004, 12:59
Kontaktdaten:

Problem

Beitrag von baumpaul »

Hallo,

funktioniert das nur mit Bildern für die Navigation? Ich möchte normalen Text.

Ich habe es mal für ein Projekt eingebaut aber es wird kein Menü angezeigt.

http://cms.nickel-wohntextil.de/
CyberDan
Beiträge: 204
Registriert: Mo 15. Dez 2003, 13:01
Wohnort: Saarland
Kontaktdaten:

Beitrag von CyberDan »

funktioniert das Modul bei jemandem? Bei mir wied auch nichts angezeigt :(
matt-d
Beiträge: 28
Registriert: Do 4. Nov 2004, 12:22
Kontaktdaten:

Beitrag von matt-d »

Steht etwas im ErrorLog?

Gruß,
matt-d
Gesperrt