Schlaue Navigation

Gesperrt
dosenbrot
Beiträge: 102
Registriert: Fr 27. Aug 2004, 15:37
Kontaktdaten:

Schlaue Navigation

Beitrag von dosenbrot »

Hallo zusammen,

ich bin auf der Suche nach einer Navigation, die etwas spezieller sein soll. Im Forum habe ich leider noch nicht so ganz das richtige gefunden. Vielleicht hat jemand eine Idee. Würde mich sehr freuen!

Was ich suche:
(zur Info: ich habe drei Bäume A, B, C)
- in der 1. Ebene (domain.de/) sollen alle Kategorien der 1. Ebene von Baum A anzeigt werden (domain.de/1/ , domain.de/2/ , domain.de/3/ etc.)
- in der 2. Ebene sollen alle Kategorien der 2. Ebene des Baumes A angezeigt werden (domain.de/1/1/ , domain.de/1/2/ , domain.de/1/3/ etc.)
- in der 3. Ebene sollen alle Kategorien der 2. und 3. Ebene des Baumes A angezeigt werden (domain.de/1/1/ sowie domain.de/1/1/1/ etc.)

Die ersten beiden Spiegelstriche bekomme ich mit Nachfolgender Navigation ja wunderbar hin. Allerdings geht mein dritter "Wunsch" damit so nicht in Erfüllung. Entweder kann diese Navigation nur den kompletten Baum A mit allen Unterkategorien anzeigen (das möchte ich aber nicht) oder immer nur eine Ebene tiefer. Alles was noch tiefer geht, wird damit nicht angezeigt.

Über Hilfe würde ich mich sehr freuen! DANKE!!!
Ich hoffe, dass ihr meine semi-professionelle Erklärung versteht... ;)
Bin da etwas am verzweifeln, weil ich etwas passendes noch nicht gefunden und rausbekommen habe.

Code: Alles auswählen

<?php

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     Navigation 1.1
* Author      :     Jan Lengowski
* Copyright   :     Contenido - four for business
* Created     :     15-05-2003
* Modified    :     26-05-2003
************************************************/

if ( !is_object($db2) ) {
    $db2 = new DB_Contenido;
}

/**
 * Check if a category is child
 * of another category
 *
 * @return boolean true/false
 * @author Jan Lengowski <Jan.Lengowski@4fb.de>
 * @copyright four for business AG 2003
 */
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];
}

/* Include Template Class */
include_once($cfg["path"]["contenido"] . 'classes/class.template.php');

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


/* Template Instance */
$tpl = new Template;

/**
 * Recursive function for creating
 * the navigation array
 * @param Int $idcat Category id
 */
function nav($idcat) {

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

        $db  = new DB_Contenido;
        $db2 = new DB_Contenido;

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

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

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

        if ( $parentid == 0 ) {

           if ( $idcat != CMS_VALUE[0] ){

                $navitems = array();
              
                $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  = 'CMS_VALUE[0]'
                        ORDER
                            BY A.idtree";

                      $db->query($sql);

                      while ($db->next_record()) {

                            /* Check for external redirects... */
                            $sql = "SELECT
                                        a.external_redirect AS ext
                                    FROM
                                        ".$cfg["tab"]["art_lang"]." AS a,
                                        ".$cfg["tab"]["cat_art"]." AS b,
                                        ".$cfg["tab"]["cat"]." AS c
                                    WHERE
                                        b.idcat     = '".$db->f("idcat")."' AND
                                        b.is_start  = '1' AND
                                        c.idclient  = '".$client."' AND
                                        c.idcat     = b.idcat AND
                                        a.idart     = b.idart AND
                                        a.idlang    = '".$lang."'";

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

                            $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';

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

           }
           
           return true;
        }

        $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()) {

                /* Check for external redirects... */
                $sql = "SELECT
                            a.external_redirect AS ext
                        FROM
                            ".$cfg["tab"]["art_lang"]." AS a,
                            ".$cfg["tab"]["cat_art"]." AS b,
                            ".$cfg["tab"]["cat"]." AS c
                        WHERE
                            b.idcat     = '".$db->f("idcat")."' AND
                            b.is_start  = '1' AND
                            c.idclient  = '".$client."' AND
                            c.idcat     = b.idcat AND
                            a.idart     = b.idart AND
                            a.idlang    = '".$lang."'";

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

                $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';
                
                $tmp_nav[$db->f("idcat")] = array("idcat"   => $db->f("idcat"),
                                                  "name"    => $db->f("name"),
                                                  "target"  => $target);
        }

        $tmp_nav[$idcat]["sub"] = $navitems;
        $navitems = $tmp_nav;

        /* Function call */
        nav($parentid);

}  // end function

$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  = '$sel_idcat'
        ORDER BY
            A.idtree";

$db->query($sql);

while ( $db->next_record() ) {

        /* Check for external redirects... */
        $sql = "SELECT
                    a.external_redirect AS ext
                FROM
                    ".$cfg["tab"]["art_lang"]." AS a,
                    ".$cfg["tab"]["cat_art"]." AS b,
                    ".$cfg["tab"]["cat"]." AS c
                WHERE
                    b.idcat     = '".$db->f("idcat")."' AND
                    b.is_start  = '1' AND
                    c.idclient  = '".$client."' AND
                    c.idcat     = b.idcat AND
                    a.idart     = b.idart AND
                    a.idlang    = '".$lang."'";

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

        $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';

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


/* Create Navigation Array */
nav($sel_idcat);

/* Start Output buffer */
ob_start();

// echo '<table width="180" cellspacing="0" cellpadding="0" border="0">';


echo ' ';

// eingefügt um in oberste Zeile die Auswahl Kategorie anzuzeigen:





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

    /* 1. Navigations Ebene */
    $tpl->reset();
    $tpl->set('d', 'NAME',  $data['name']);
    $tpl->set('d', 'TARGET', $data['target']);
   $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat'])); 
/* $tpl->set('d', 'HREF', $sess->url($data['idcat'].'.html')); */


    $tpl->next();

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

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

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

            /* 2. Navigations Ebene */
            $tpl->reset();
            $tpl->set('d', 'NAME',  $data['name']);
            $tpl->set('d', 'TARGET', $data['target']);
      $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
/* $tpl->set('d', 'HREF', $sess->url($data['idcat'].'.html')); */
            $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. Navigations Ebene */
                    $tpl->reset();
                    $tpl->set('d', 'NAME',  $data['name']);
                    $tpl->set('d', 'TARGET', $data['target']);
                    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
/* $tpl->set('d', 'HREF', $sess->url($data['idcat'].'.html')); */
                    $tpl->next();

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

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

                    /* 4. Navigations Ebene */
                    $tpl->reset();
                    $tpl->set('d', 'NAME',  $data['name']);
                    $tpl->set('d', 'TARGET', $data['target']);
                    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
/* $tpl->set('d', 'HREF', $sess->url($data['idcat'].'.html')); */
                    $tpl->next();

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

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

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

                    /* 5. Navigations Ebene */
                    $tpl->reset();
                    $tpl->set('d', 'NAME',  $data['name']);
                    $tpl->set('d', 'TARGET', $data['target']);
                    $tpl->set('d', 'HREF',  $sess->url('front_content.php?idcat='.$data['idcat']));
/* $tpl->set('d', 'HREF', $sess->url($data['idcat'].'.html')); */
                    $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

            } // end if

        } // end foreach

    } // end if

} // end foreach

echo ' ';

/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;

?>
wosch

Re: Schlaue Navigation

Beitrag von wosch »

dosenbrot hat geschrieben:Hallo zusammen,

ich bin auf der Suche nach einer Navigation, die etwas spezieller sein soll.
Hm, Navigation, - für mich klingt das eher nach Sitemap.
Kann es sein das du das meinst?
Im Beispiel-Mandaten ist ein Modul Sitemap enthalten, hat du das mal angesehen?
dosenbrot
Beiträge: 102
Registriert: Fr 27. Aug 2004, 15:37
Kontaktdaten:

Beitrag von dosenbrot »

Hallo und danke, NEIN, eine Sitemap meine ich natürlich nicht, sondern ganz klar eine Navigation! Im Prinzip ist meine gepostete auch perfekt! Einziger Haken ist halt nur, dass entweder nur der gesamte Baum mit allen Unterordnern angezeigt werden kann oder wenn ich auf eine Unterkategorie über das Input-Modul dies einstelle, dann geht immer nur eine Ebene tiefer. Eine zweite Ebene tiefer und evtl. eine dritte Ebene tiefer wäre an dieser Stelle für mich aber wichtig und von Interesse!

Also nochmal:

- Seite domain.de mit contenido 4.6.15 vorhanden (mod rewrite version)
- drei Navigationsbäume eingerichtet, wobei ich jetzt nur von dem ersten Baum, der Hauptnavigation rede (die anderen sind für Ansteuerung von Impressum, Sitemap etc.), also ist nur die Rede von der Navigation, die links angezeigt werden soll (nur der erste Baum "Hauptnavigation")

Das sieht also so aus, um sich die Struktur vorzustellen:

1. Hauptnavigation (domain.de)
1.1 Neuigkeiten (domain.de/neuigkeiten/)
1.1.1 Februar (domain.de/neuigkeiten/februar/)
1.1.1.1 Presse (domain.de/neuigkeiten/februar/presse/)
1.1.2 März (domain.de/neuigkeiten/maerz/)
1.2 Profil (domain.de/profil/)
etc. pp.

So, was ich möchte:
- domain.de -> alle 2. Ebenen erscheinen ("Neuigkeiten" und "Profil"), aber noch nicht die Unterkategorien die evtl. darin stecken
- domain.de/neuigkeiten/ -> alle 3. Ebenen erscheinen im Menü ohne Unterkategorien oder Oberkategorien (also nur "Februar" und "März")
- domain.de/neuigkeiten/februar/ -> alle 3. Ebenen sowie die 4. Ebene erscheinen im Menü ohne andere Unterkategorien oder Oberkategorien (also "Februar" und "März" sowie dann als Unterkategorie von neuigkeiten/februar/ die Kategorie "Presse")

Mit dem oben genannten Modul und dem gleich noch aufgeführten INPUT-Modul kann man es bis domain.de/neuigkeiten/ auch so gewünscht lösen wie ich es möchte. Das Problem tritt mit dem Modul jedoch leider auf, wenn ich noch eine eben tiefer möchte. Dann geht damit nur entweder den kompletten ersten Baum anzuzeigen mit allen Oberkategorien (was ich da nicht möchte) oder wenn ich es so im Input einstelle wie es theoretisch richtig wäre, dann erscheint die Ebene tiefer gar nicht im Navigationsmenü.

Ich hoffe ich konnte damit etwas mehr Klarheit über den Sachverhalt und mein Problem schaffen und würde mich riesig freuen, wenn jemand weiterhelfen könnte! Ich vermute, dass man evtl. sogar das Modul weiter verwenden kann, nur irgendwo noch ein paar Zeilen hinzufügen oder ändern muss. Bin aber leider nicht der super Programmierer und habe daher keine Ahnung.

Hier noch nachgereicht das Input-Modul, das ich dazu verwende:

Code: Alles auswählen

// selected category
$selected = "CMS_VALUE[0]";
$selected2 = "CMS_VALUE[1]";
echo "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\">
        <tr valign=\"top\">
          <td>Kategorie f&uuml;r Verlinkung w&auml;hlen:</td>
          <td>
            <select name=\"CMS_VAR[0]\">";
            if($selected!="0" && $selected!=""){
             echo"<option value=\"0\">--- kein ---</option>";

            }else{
            echo"<option selected=\"selected\" value=\"0\">--- kein ---</option>";
            }

            // fetch all categorys
            $query = "SELECT A.idcat, A.level, 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 ORDER BY A.idtree";
            // execute query
            $db->query($query);

            // loop result and build the options
            while ($db->next_record()) {

              // indent spacer
              $spaces = "|";

              // how many levels
              $levels = $db->f("level");

              for ($i = 0; $i < $levels; $i ++) {
                // add 2 spaces for every level
                $spaces = $spaces . "--";

              } // end for
              
              $spaces .= ">";


              if ($selected == $db->f("idcat")) {
                // selected category
                echo "<option selected=\"selected\" value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";

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

              } // end if

            } // end while

echo "      </select>";

echo "    </td>
        </tr>
        <tr valign=\"top\">
          <td>Kategorieanzeige wählen:</td>
          <td>
            <select name=\"CMS_VAR[1]\">";
            if($selected2!="0" && $selected!=""){
             echo"<option value=\"0\">--- kein ---</option>";

            }else{
            echo"<option selected=\"selected2\" value=\"0\">--- kein ---</option>";
            }

            // fetch all categorys
            $query = "SELECT A.idcat, A.level, 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 ORDER BY A.idtree";
            // execute query
            $db->query($query);

            // loop result and build the options
            while ($db->next_record()) {

              // indent spacer
              $spaces = "|";

              // how many levels
              $levels = $db->f("level");

              for ($i = 0; $i < $levels; $i ++) {
                // add 2 spaces for every level
                $spaces = $spaces . "--";

              } // end for
              
              $spaces .= ">";


              if ($selected2 == $db->f("idcat")) {
                // selected category
                echo "<option selected=\"selected2\" value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";

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

              } // end if

            } // end while

echo "      </select>";

echo "    </td>
        </tr>

      </table>";
dosenbrot
Beiträge: 102
Registriert: Fr 27. Aug 2004, 15:37
Kontaktdaten:

Beitrag von dosenbrot »

Hallo,

falles es jemanden interessiert, der die Navigation auch so gestalten möchte.
Ich habe jetzt selbst durch ausprobieren eine Lösung gefunden. Sicher nicht die sauberste vom Programmieren her, aber der Code wird sauber ausgegeben und es funktioniert exakt so, wie ich es mir vorgestellt habe:

Das Modul von oben habe ich beibehalten, nur habe ich die beiden Templates der 1. Navigationsebene ausgeklammert. Das habe ich dann als weiteres Modul für alles ab der 2. Ebene integriert und gebe in den Kategorien immer an, dass die Hauptnavigation komplett angezeigt werden soll.

Feine Sache! :)
Gesperrt