Modul verändert: Ausgabe der Hauptnavigation

Gesperrt
sept00
Beiträge: 7
Registriert: Mi 3. Mär 2004, 16:33
Kontaktdaten:

Modul verändert: Ausgabe der Hauptnavigation

Beitrag von sept00 » Sa 6. Mär 2004, 15:20

Nach etlichem drehen und schrauben funktioniert nun endlich meine CSS-basierte hierarchische Menü-Ausgabe. Ich würde den Contenido-Codern empfehlen, diese oder eine ähnliche Methode bei den nächsten Releases zu benutzen, da sie standardmäßig einen flexibleren Aufbau des Menüs ermöglicht. Was noch nicht eingebaut ist ist die Template-Unterstützung, die $depth-Variable in der create_menu-Funktion verhindert böse Unendlich-Schleifen, obwohl die nie vorkommen dürften.

Das umgeschriebene Modul gibt nun das Menü in folgendem Markup aus:

Code: Alles auswählen

<h1>Menu-Name</h1>
  <ul>
    <li><a href="link1.html">Link-Descr. 1</a></li>
    <li><a href="link2.html">Link-Descr. 1</a></li>
    <li><a href="link3.html">Link-Descr. 1</a>
    <ul>
        <li><a href="link3_1.html">Link-Descr. 3_1</a></li>
        <li><a href="link3_2.html">Link-Descr. 3_2</a></li>
        <li><a href="link3_2.html">Link-Descr. 3_2</a></li>
    </ul></li>
    <li><a href="link4.html">Link-Descr. 1</a></li>
    <li><a href="link5.html">Link-Descr. 1</a></li>
</ul> 
Das hat drei Vorteile:
1. Mit den Listen bildet sich die Menühierarchie korrekt ab.
2. Die Menütiefe kann beliebig groß sein, da der Abstand vom linken Rand über das <ul>-Tag geregelt wird.
3. Es geht besser durch Accessability-Richtlinien durch (Barrierefreiheit)

Hier ist der Code für das geänderte Modul:

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
 */
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]";
}

/* 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


function create_menu($depth, $d) {
	global $sess;
	for ($i = 1; $i <= $depth; $i++) {
    	$indent_string .= '	';
	}
	foreach ($d as $k => $data) {
		echo $indent_string . '		<li><a href="'. $sess->url('front_content.php?idcat='.$data['idcat']) .'" target="'. $data['target'] .'">'. $data['name'] .'</a>';
		if (is_array($data['sub']) and $depth < 20) {
			echo "\n" . $indent_string . "			<ul>\n";
			create_menu($depth+1, $data['sub']);
			echo $indent_string . "			</ul>\n" . $indent_string . '		';
		}
		echo "</li>\n";
	} //foreach
}


$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 '<h1>Menuetitel</h1>' . "\n";
echo "	<ul>\n";
create_menu(0, $navitems);
echo "	</ul>\n";

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

/* Clean buffer */
ob_end_clean();

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

?>
Der ganze Krimskrams mit der $indent_string ist für das Aussehen des HTML-Markups und kann weggelassen werden. Es stellt so oder so in den Browsern gleich dar.

PHP ist saucool.

Gruß,
Thomas

Poooky
Beiträge: 12
Registriert: Sa 6. Mär 2004, 17:41
Wohnort: München
Kontaktdaten:

geht bei mir nicht

Beitrag von Poooky » Sa 6. Mär 2004, 17:48

servus! die lösung wäre genial! ich hab mich auch gewundert warum die hauptnavi nicht über css gestaltet wird. aber ich hab deinen code eingebaut und er geht leider nicht...? ist ein rotes lämpchen beim modulfenster in contenido. ich bin leider kein programmierer deshalb weiß ich nicht was ich falsch gemacht habe. der INPUT-code ist der gleiche wie vom contenido hauptnavi oder?

danke für hilfe

gruß poooky
Ein schlauer Mann hat einmal gesagt: Ess niemals gelben Schnee!

sept00
Beiträge: 7
Registriert: Mi 3. Mär 2004, 16:33
Kontaktdaten:

Beitrag von sept00 » Sa 6. Mär 2004, 20:14

Ja, der Input-Bereich ist der gleiche wie für das Original-Hauptnavigationsmodul.

Wenn ich den PHP-Code in meinen Output-Bereich einfüge klappt alles gut. Du musst von <?php bis ?> einfügen, nicht mehr und nicht weniger, dann klappt das schon.

Zu den Templates: die habe ich jetzt nicht mehr benutzt weil ich mich mit dem Template-System gar nicht auskenne und mit PHP eigentlich auch nicht. aber Du kannst das, was das Modul ausspuckt einfach im Quelltext bearbeiten. Hier ist die vereinfachte Version der Funktion:

Code: Alles auswählen

function create_menu($depth, $d) {
	global $sess;

	foreach ($d as $k => $data) {
		echo '		<li><a href="'. $sess->url('front_content.php?idcat='.$data['idcat']) .'" target="'. $data['target'] .'"';
		echo '>'. $data['name'] .'</a>';
		if (is_array($data['sub']) and $depth < 20) {
			echo "\n			<ul>\n";
			create_menu($depth+1, $data['sub']);
			echo "			</ul>\n		";
		}
		echo "</li>\n";
	} //foreach
}
Wenn Du genau hinsiehst kannst Du die HTML-Tags im Code erkennen und nach Deinen Wünschen verändern.

Viel Glück,
Thomas

stony
Beiträge: 360
Registriert: Di 10. Jun 2003, 09:02
Wohnort: Berlin
Kontaktdaten:

Beitrag von stony » Mo 8. Mär 2004, 14:41

sept00 wenn das jetzt noch klappen würde das ich der ersten nav ebend eine andere class als der zweiten zuweisen kann wäre das modul echt superklasse :lol:

stony
Beiträge: 360
Registriert: Di 10. Jun 2003, 09:02
Wohnort: Berlin
Kontaktdaten:

Beitrag von stony » Mo 8. Mär 2004, 14:56

schon gut kann ja dem ul ne klasse sagen und dann dem li davon abhänig das zuweisen *smile*

Gesperrt