Sauber gegliederte, barrierefreie, validierte navigation

apfel
Beiträge: 5
Registriert: Mo 30. Mai 2005, 10:46
Kontaktdaten:

Sauber gegliederte, barrierefreie, validierte navigation

Beitrag von apfel » Di 7. Jun 2005, 10:21

Hallo!

1. Habe gerade versucht, meine erste Seite mit XHTML / CSS / Contenido barriefrei und Suchmaschinenfreundlich zu machen. Habe mir die Artikel zu Spaw und XHTML (Stichwort: Grossbuchstaben) durchgelesen und bin nun wieder einen Schritt zurückgegangen :? : Ich habe meine Seiten [http://www.tiefblau-design.de/contenido ... 1_24_.html] nun zwar doch in HTML 4.01 codiert, steuere das Layout aber weiterhin komplett über CSS. Wenn es eine befriedigende Lösung zu dem Thema XHTML und Contenido gibt :?: , gebt mir bitte einen Tipp!

2. Ich bin leider noch nicht so fit in pHp :oops: , aber für Euch hier dürfte das ne Kleinigkeit sein: Die an sich klasse funktionierende Listennavigation [http://www.cms-webdesign-service.de/upl ... ss_out.txt.] öffnet immer eine untergeordnete Liste (echo ul) in der Navigation, auch, wenn es keine Unterpunkte für den aktuellen Navigationslink gibt. Das mag nun wiederum der Validator gar nicht. (Wenn Ihr meine Seiten durch den Validator jagt werdet ihr merken, was ich meine...). Das Problem liegt meines Erachtens an folgendem Code:


if (is_array($data['sub'])) {
echo '<ul id="subnavlist">'; <-- dies ist die entscheidende zeile -->
foreach ($data['sub'] as $key => $data) {
/* 2. Navigations Ebene */
if ($data['idcat'] == $idcat) {
echo '<li><a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" id="navactive2" target="'.$data['target'].'">'.$data['name'].'</a></li>';
}

Natürlich kann man die Zeile auch einfach löschen und dann über CSS die Ausgabe der Unternavigation unterschiedlich steuern. Aber dann geht die eigentliche Struktur "Navigation => Unternavigation" in der Liste und damit im HTML-Code verloren, was ich nicht so schön finde (Stichwort: Barrierefreiheit.)

Hat jemand eine Idee, wie man das "ul" nur dann einügt, wenn in der geöffneten Kategorie auch tatsächlich eine Unternavigation besteht?

Wirklich ein klasse Forum hier, bin ganz begeistert... :D

Der Apfel

moshpart
Beiträge: 17
Registriert: Fr 15. Apr 2005, 11:51
Wohnort: Bochum
Kontaktdaten:

Beitrag von moshpart » Mi 8. Jun 2005, 21:06

Hallo,

wenn es um XHTML geht versuch es mal mit http://w3concepts.net/1/1/69.html . Das ist ein sehr gutes Template-System, mit dem du leicht Barrierefreien-Code erstellen kannst.

Gruß
Tim

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag von conradius » Mo 8. Mai 2006, 17:16

schon was gefunden?

Sonst kann ich Dir meine - schnell überarbeitete - Hauptnavigation anbieten, welche von Haus aus mit der Version 4.6.8 mit dabei ist.
Ich habe den output-Bereich insofern überarbeitet, als dass die Navigation eine korrekt verschachtelte Liste ausgibt. Dazu brauchst Du aber auch noch ein paar neue templates. Theoretisch könnte die Navigation so eine endlose Verschachtelungstiefe haben, man müsste das output-Modul dazu aber noch umschreiben (eigentlich macht jetzt nämlich jede Unterhierarchie nur wieder das selbe, weil die Ausgabe CSS-gesteuert ist und keine verschiedenen templates je Navigationsebene gebraucht werden).

Ich häng mal alles hier rein:
Modul: mainnavigation input

Code: Alles auswählen

/***********************************************
* CONTENIDO MODUL - INPUT
*
* Modulname  :      Mainnavigation
* Author(s)   :     Mereo, Conrad Leu
* Copyright   :     Mereo, Conrad Leu
* Created     :     19-04-2006
************************************************/

echo '<p><label style="float:left; width: 8em;" for="'.mi18n("Baum w&auml;hlen").'">'.mi18n("Baum w&auml;hlen").': </label><select name="CMS_VAR[0]">';
if ( "CMS_VALUE[0]" != "0" ) {
	echo '<option value="0">-- '.mi18n("kein").' --</option>';
} else {
	echo '<option value="0" selected>-- '.mi18n("kein").' --</option>';
	} // end if

$sql = "SELECT
	CATTREE.idcat,
	CATLANG.name
FROM
	".$cfg["tab"]["cat_tree"]." AS CATTREE,
	".$cfg["tab"]["cat"]." AS CAT,
	".$cfg["tab"]["cat_lang"]." AS CATLANG
WHERE
	CATTREE.idcat     = CAT.idcat AND
	CAT.idcat     = CATLANG.idcat AND
	CATLANG.idlang    = '".$lang."' AND
	CAT.idclient  = '".$client."' AND
	CATLANG.visible   = 1 AND
	CATTREE.level     = '0'
ORDER BY
	CATTREE.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>';
		} // end if
	} // end while
echo '</select>';
Modul: mainnavigation output

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname  :      Hauptnavigation
* Author(s)   :     Jan Lengowski, Andreas Lindner, 4fb
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     12.08.2005
* Modified on :		18-04-2006
* Modified by :		Mereo, Conrad Leu
************************************************/

#System properties in use:
#Type: navigation, Name: idcat_homepage
#Contains idcat of tree to be displayed in main navigation

#Includes
cInclude("frontend", "includes/functions.navigation.php");

#If no tree is selected, use client setting
$start_cat = "CMS_VALUE[0]";
if ($start_cat=='') {
    $cApiClient = new cApiClient($client);
	$start_cat = $cApiClient->getProperty('navigation','idcat_homepage');
}

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, $start_cat) ) {
    $sel_idcat = $idcat;
} else {
    $sel_idcat = $start_cat;
}

/* 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, $start_cat;

        $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 != $start_cat ){

                $navitems = array();

                $sql = "SELECT
                            A.idcat,
                            C.name,
				            C.public,
	        			    C.idcatlang
                        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  = '".$start_cat."'
                        ORDER
                            BY A.idtree";

                      $db->query($sql);

                      while ($db->next_record()) {

                            /* Check for external redirects... */
                            $sql = "SELECT
                                        a.external_redirect AS ext,
                                        a.idartlang AS idartlang
                                    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
                                        c.idclient  = '".$client."' AND
                                        c.idcat     = b.idcat AND
                                        a.idart     = b.idart AND
                                        a.idlang    = '".$lang."'";

                            $db2->query($sql);
                            $flag = false;
							while ($db2->next_record()&&!$flag) {
	                            if (isStartArticle($db2->f("idartlang"), $db->f("idcat"), $lang))
	                            {
									$flag = true;
	                                $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';

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

           }

           return true;
        }

        $sql = "SELECT
                    A.idcat,
                    C.name,
		            C.public,
       			    C.idcatlang
                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,
                            a.idartlang AS idartlang
                        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
                            c.idclient  = '".$client."' AND
                            c.idcat     = b.idcat AND
                            a.idart     = b.idart AND
                            a.idlang    = '".$lang."'";

                $db2->query($sql);
				$flag = false;
                while ($db2->next_record() && !$flag) {
	                if (isStartArticle($db2->f("idartlang"), $db->f("idcat"), $lang))
	                {
						$flag = true;
	                    $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';

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

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

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

}  // end function

$sql = "SELECT
            A.idcat,
            C.name,
		    C.public,
       		C.idcatlang
        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,
                    a.idartlang AS idartlang
                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
                    c.idclient  = '".$client."' AND
                    c.idcat     = b.idcat AND
                    a.idart     = b.idart AND
                    a.idlang    = '".$lang."'";

        $db2->query($sql);
        #$db2->next_record();
		$flag = false;
		while ($db2->next_record()&&!$flag) {
	        if (isStartArticle($db2->f("idartlang"), $db->f("idcat"), $lang))
	        {
				$flag = true;
	            $target = ( $db2->f("ext") == 0 ) ? '_self' : '_blank';

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

/* Create Navigation Array */
if(($sel_idcat=='')||($sel_idcat=='0')){
    $cApiClient = new cApiClient($client);
    $sel_idcat = $cApiClient->getProperty('navigation', 'idcat_homepage');
}

nav($sel_idcat);

/* Start Output buffer */
ob_start();

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

    /* 1. Navigation level */
	if (checkCatPermission($data['idcatlang'],$data['public'])) {
	    $tpl->reset();
	    $tpl->set('d', 'NAME',  $data['name']);
	    $tpl->set('d', 'TARGET', $data['target']);
	    $tpl->set('d', 'HREF',  $sess->url('index.php?idcat='.$data['idcat']));

	    $tpl->next();
	    if ($idcat == $data['idcat'] && empty($data['sub'])) {
	        $tpl->generate('templates/mainnav_on.html', 0, 0);
		}elseif($idcat == $data['idcat'] && !empty($data['sub'])){
	        $tpl->generate('templates/mainnav_open.html', 0, 0);
		}elseif($idcat != $data['idcat'] && is_array($data['sub']) && catIsChildOf($sel_idcat, $data['idcat'])){
	        $tpl->generate('templates/mainnav_open.html', 0, 0);
	    } else {
	        $tpl->generate('templates/mainnav_off.html', 0, 0);
	    }

		// BEGIN:ADDED
		$second_subdata = $data['sub'];
		// END:ADDED

    	/* 2. Navigation level */
	    if (is_array($data['sub'])) {
	        foreach ($data['sub'] as $key => $data) {
				if (checkCatPermission($data['idcatlang'],$data['public'])) {
		            $tpl->reset();
		            $tpl->set('d', 'NAME',  $data['name']);
		            $tpl->set('d', 'TARGET', $data['target']);
		            $tpl->set('d', 'HREF',  $sess->url('index.php?idcat='.$data['idcat']));
		            $tpl->next();
		            if ($idcat == $data['idcat'] && empty($data['sub'])) {
		                $tpl->generate('templates/subnav_on.html', 0, 0);
					}elseif($idcat == $data['idcat'] && !empty($data['sub'])){
				        $tpl->generate('templates/subnav_open.html', 0, 0);
					}elseif($idcat != $data['idcat'] && is_array($data['sub']) && catIsChildOf($sel_idcat, $data['idcat'])){
	    			    $tpl->generate('templates/subnav_open.html', 0, 0);
		            } else {
		                $tpl->generate('templates/subnav_off.html', 0, 0);
		            }

					// BEGIN:ADDED
					if ( is_array( $second_subdata ) ) {
						$last_cat = end( $second_subdata );
		            	if ( $data['idcat'] == $last_cat['idcat'] ) {
		            	    $tpl->generate('templates/subnav_end.html', 0, 0);
		            		} // end if
		            	} // end if

					$third_subdata = $data['sub'];
					// END:ADDED

				    /* 3. Navigation level */
		            if (is_array($data['sub'])) {
		                foreach ($data['sub'] as $key => $data) {
							if (checkCatPermission($data['idcatlang'],$data['public'])) {
			                    $tpl->reset();
			                    $tpl->set('d', 'NAME',  $data['name']);
			                    $tpl->set('d', 'TARGET', $data['target']);
			                    $tpl->set('d', 'HREF',  $sess->url('index.php?idcat='.$data['idcat']));
			                    $tpl->next();

			                    if ($idcat == $data['idcat'] && empty($data['sub'])) {
			                        $tpl->generate('templates/subnav_on.html', 0, 0);
								}elseif($idcat == $data['idcat'] && !empty($data['sub'])){
							        $tpl->generate('templates/subnav_open.html', 0, 0);
								}elseif($idcat != $data['idcat'] && is_array($data['sub']) && catIsChildOf($sel_idcat, $data['idcat'])){
	    						    $tpl->generate('templates/subnav_open.html', 0, 0);
			                    } else {
			                        $tpl->generate('templates/subnav_off.html', 0, 0);
			                    }

								// BEGIN:ADDED
								if ( is_array( $third_subdata ) ) {
									$last_cat = end( $third_subdata );
		            				if ( $data['idcat'] == $last_cat['idcat'] ) {
		            				    $tpl->generate('templates/subnav_end.html', 0, 0);
		            					} // end if
		            				} // end if

								$forth_subdata = $data['sub'];
		            			// END:ADDED

			                    /* 4. Navigation level */
					            if (is_array($data['sub'])) {
					                foreach ($data['sub'] as $key => $data) {
										if (checkCatPermission($data['idcatlang'],$data['public'])) {
						                    $tpl->reset();
						                    $tpl->set('d', 'NAME',  $data['name']);
						                    $tpl->set('d', 'TARGET', $data['target']);
						                    $tpl->set('d', 'HREF',  $sess->url('index.php?idcat='.$data['idcat']));
						                    $tpl->next();

			                    			if ($idcat == $data['idcat'] && empty($data['sub'])) {
			                    			    $tpl->generate('templates/subnav_on.html', 0, 0);
											}elseif($idcat == $data['idcat'] && !empty($data['sub'])){
							    			    $tpl->generate('templates/subnav_open.html', 0, 0);
											}elseif($idcat != $data['idcat'] && is_array($data['sub']) && catIsChildOf($sel_idcat, $data['idcat'])){
	    									    $tpl->generate('templates/subnav_open.html', 0, 0);
			                    			} else {
			                    			    $tpl->generate('templates/subnav_off.html', 0, 0);
			                    			}

											// BEGIN:ADDED
											if ( is_array( $forth_subdata ) ) {
												$last_cat = end( $forth_subdata );
		            							if ( $data['idcat'] == $last_cat['idcat'] ) {
		            							    $tpl->generate('templates/subnav_end.html', 0, 0);
		            								} // end if
		            							} // end if

											$fith_subdata = $data['sub'];
		            						// END:ADDED

						                    /* 5. Navigation level */
								            if (is_array($data['sub'])) {
								                foreach ($data['sub'] as $key => $data) {
													if (checkCatPermission($data['idcatlang'],$data['public'])) {
									                    $tpl->reset();
									                    $tpl->set('d', 'NAME',  $data['name']);
									                    $tpl->set('d', 'TARGET', $data['target']);
									                    $tpl->set('d', 'HREF',  $sess->url('index.php?idcat='.$data['idcat']));
									                    $tpl->next();

			                    						if ($idcat == $data['idcat'] && empty($data['sub'])) {
			                    						    $tpl->generate('templates/subnav_on.html', 0, 0);
			                    						} else {
			                    						    $tpl->generate('templates/subnav_off.html', 0, 0);
			                    						}

														// BEGIN:ADDED
														if ( is_array( $fith_subdata ) ) {
															$last_cat = end( $fith_subdata );
		            										if ( $data['idcat'] == $last_cat['idcat'] ) {
		            										    $tpl->generate('templates/subnav_end.html', 0, 0);
		            											} // end if
		            										} // end if
		            									// END:ADDED
										            } // end if
								                } // end foreach
								            } // end if
							            } // end if
					                } // end foreach
					            } // end if
				            } // end if
		                } // end foreach
		            } // end if
	            } // end if
	        } // end foreach
	    } // end if
    } // end if
} // end foreach

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

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;
?>
template mainnav_off.html

Code: Alles auswählen

<!-- BEGIN:BLOCK -->			<li><a href="{HREF}" title="{NAME}">{NAME}</a></li>
<!-- END:BLOCK -->
template mainnav_on.html

Code: Alles auswählen

<!-- BEGIN:BLOCK --><li><a href="{HREF}" title="{NAME}" class="selected">{NAME}</a></li>
<!-- END:BLOCK -->
template mainnav_open.html

Code: Alles auswählen

<!-- BEGIN:BLOCK --><li><a href="{HREF}" class="selected" title="{NAME}">{NAME}</a>
			<ul class="subnav">
<!-- END:BLOCK -->
template subnav_off.html

Code: Alles auswählen

<!-- BEGIN:BLOCK -->				<li><a href="{HREF}" title="{NAME}">{NAME}</a></li>
<!-- END:BLOCK -->
template subnav_on.html

Code: Alles auswählen

<!-- BEGIN:BLOCK -->				<li><a href="{HREF}" title="{NAME}" class="selected">{NAME}</a></li>
<!-- END:BLOCK -->
template subnav_open.html

Code: Alles auswählen

<!-- BEGIN:BLOCK -->				<li><a href="{HREF}" title="{NAME}" class="selected">{NAME}</a>
				<ul class="subnav">
<!-- END:BLOCK -->
template subnav_end.html (schliesst jede verschachtelte subnav-Liste wieder)

Code: Alles auswählen

<!-- BEGIN:BLOCK -->			</ul></li>
<!-- END:BLOCK -->
Gruss & Danke für feedbacks!

Phiga
Beiträge: 23
Registriert: Mi 3. Mai 2006, 09:16
Wohnort: Bonn
Kontaktdaten:

Sauber gegliederte, barrierefreie, validierte navigation

Beitrag von Phiga » Mo 22. Mai 2006, 09:35

Hallo Conradius,

gerne schreibe ich Dir ein Feedback, denn Deine Lösung ist nicht nur gut, sondern längst überfällig. Genau an dieser Stelle scheitern die mir bisher bekannten CMS (auch lizenpflichtige), weil sie zu inflexibel sind.

Ich würde Deine Lösung gerne noch etwas verfeinern:
die Templates mainnav_off+subnav_off.html , mainnav_on.html+subnav_on.html sowie mainnav_open.html+subnav_open.html sind inhaltlich identisch. Ich fasse Sie zu nav_default.html, nav_selected.html und nav_open.html zusammen.

Darüber hinaus, würde ich gerne die rein optische Auszeichnung (class="selected") durch eine semantische ersetzen:
Aufgeklappte Menüs bekommen eine Betonung (<em>), ausgewählte Menüpunkte eine starke Betonung (<strong>).

(Bitte jetzt keine BF-Diskussion über die Sinnhaftigkeit ausgewählter und gleichzeitig verlinkter Menüpunkte starten. Das kann man je nach Bedürfnis leicht anpassen.)

Hier das Ergebnis:

nav_default.html

Code: Alles auswählen

<!-- BEGIN:BLOCK --><li><a href="{HREF}">{NAME}</a></li><!-- END:BLOCK -->
nav_selected.html

Code: Alles auswählen

<!-- BEGIN:BLOCK --><li><strong><a href="{HREF}">{NAME}</a></strong></li><!-- END:BLOCK -->
nav_open.html

Code: Alles auswählen

<!-- BEGIN:BLOCK --><li><em><a href="{HREF}">{NAME}</a></em><ul><!-- END:BLOCK -->
nav_close.html

Code: Alles auswählen

<!-- BEGIN:BLOCK --></ul></li><!-- END:BLOCK -->
Die Templates sind dann schon so einfach, dass man die vielleicht gleich in den Quelltext schreiben könnte.

Ansonsten fände ich es schicker, das Modul könnte eine vollständige Liste ausgeben – sprich auch den umschließenden <ul>-Tag über die gesamte Liste liefern.

Was meinst Du bzw. meinen die anderen Leser?

Danke & Gruß
Phiga

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag von conradius » Mo 22. Mai 2006, 10:18

hallo Phiga,
besten Dank für Dein Weiterdenken. Mir ist gar nicht in den Sinn gekommen, die einzelnen templates zusammenzufassen - und zwar glaube ich, weil ich zur (unnützen) und wie ich jetzt gerade gelesen habe tückischen Quellcodegestaltung (siehe http://www.w3.org/People/Raggett/tidy bei "Layout style") die einzelnen Zeilen mit Tabulatoren eingerückt habe. Was dementsprechend keinen Sinn macht, und die Navi ja sowieso mehr als nur zwei Ebenen schafft.

Das umfassende ul-tag kann man natürlich auch grad ins Modul einbinden - sowieso, wenn man die templates weglässt und direkt ins Modul codet. In meinem post, war das nur modul-historisch begründet.
Ich denke, für die Navigation kann man die templates eh weglassen, weil man eine Linkansammlung, wie es eine Navigation immer ist, sowieso nur als Liste darstellen sollte. (Literatur und CSS-Gestaltungstipps hierzu: http://www.alistapart.com/articles/taminglists).

Ich werde mal das Hauptnavigationsmodul und die dazugehörigen vier templates überarbeiten und bei Erfolg hier posten.

Besten Dank für die Entwicklungszusammenarbeit :-)

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

rekursive Hauptnavigation ab 4.6.x als ungeordnete-Liste ul

Beitrag von conradius » Mo 22. Mai 2006, 19:46

also, unter der folgenden Adresse habe ich eine Zip-Datei bereitgestellt, welche das In- und Outputmodul und 6 templates beinhaltet. Das Outputmodul der Hauptnavigation der 4.6.8er Version habe ich insofern überarbeitet, als dass es nun keine Beschränkung in der Navigationstiefe mehr gibt, resp. der Navigationsaufbau rekursiv durchläuft - somit wurde die Redundanz in diesem Modul entfernt:
http://www.mereo.ch/_support/con_ul_mainnavigation.zip

Ich habe es nun doch bei templates belassen, und deren Inhalte nicht ins Modul codiert, damit auch weniger Versierte z.B. CSS-Klassen einfach in den templates anpassen/einfügen können. Aber das ganze ohne templates zu machen, als standalone Modul, ist jetzt ja nur noch ein Kleines.

Die 6 templates: nav_default.html, nav_selected.html, nav_open.html und nav_close.html (wie oben genannt http://contenido.org/forum/viewtopic.php?p=80299#80299) zusätzlich nun noch nav_start.html und nav_end.html mit dem öffnenden und schliessenden, umfassenden ul-tag.

Anmerkung: Der Komma-Fehler in einem der SQL-Statements aus dem original 4.6.8er Hauptnavigations-Modul wurde im obigen Modul korrigiert (... C.name, ...).

smail
Beiträge: 1
Registriert: Sa 3. Jun 2006, 15:55
Kontaktdaten:

Beitrag von smail » Sa 3. Jun 2006, 16:05

Hallo zusammen,

hab ein paar kurze Fragen zur Navigation:

- hat jemand von Euch sie schon erfolgreich eingebunden?
- wo kann ich einstellen, wie viele Ebenen nach unten durchsucht werden?

Folgendes Problem:
ich krieg kein öffnendes <ul> in der Ausgabe, und anscheinend werden an dieser Stelle im Output überhaut keine Templates bearbeitet... Einfaches "echo" geht jedoch...

Code: Alles auswählen

/* Start Output buffer */
ob_start();

// start the nav-surrounding ul
$tpl->generate('templates/nav_start.html', 0, 0);
Sorry, aber ich blick im Moment noch nicht so durch.


----
Kleine Erläuterung: Habe bisher mit dem Dirigenten gearbeitet (kenn hier vielleicht irgendwer :roll: ) aber contenido scheint mit deutlich sicherer und stabiler, würd daher gern wechseln.
Aber wenn ich schon an der xhtml-konformen Navigation scheitere..??
Sie Seiten sollten xhtml-konform sein! Geht das --problemlos-- (evtl. auch mit TinyMCE)?

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag von conradius » Di 6. Jun 2006, 08:34

hallo smail,
- hat jemand von Euch sie schon erfolgreich eingebunden?
- wo kann ich einstellen, wie viele Ebenen nach unten durchsucht werden?
Eingebunden: z.B. bei http://www.minggmbh.ch
Wie meinst Du das mit den Ebenen? Dieses Navigationsmodul erfordert lediglich im Input-Bereich die Angabe des Baumes der anzuzeigenden Navigationshierarchie. Ist dieser Angegeben, listet die Navigation alle darin vorkommenden Kategorien auf, respektive diejenigen, die online sind und einen online geschalteten Startartikel haben. Wenn Du in Contenido also eine Kategoriehierarchie von z.B. 6 Ebenen erstellt hast (was eher nicht zu empfehlen wäre), dann gibt Dir das Modul eine ungeordnete Liste mit 5 verschachtelten "Unter-Listen" aus.
ich krieg kein öffnendes <ul> in der Ausgabe...
Hast Du die templates ins Verzeichnis /templates/ entzippt und sind dort alle sechs genannten templates vorhanden?

Gruss

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag von conradius » Do 8. Jun 2006, 11:50

hey smail,

sorry, der Bock lag bei mir: Das template-Objekt war zum Zeitpunkt von nav_start.html noch nicht gänzlich vorbereitet.

Ich habe das Modul soweit angepasst, dass jetzt das öffnende ul-tag ausgegeben wird und im template nav_start.html habe ich einen übriggebliebenen Test-Komentar entfernt.

Die aktualisierte Version ist nach wie vor zu finden unter: http://www.mereo.ch/_support/con_ul_mainnavigation.zip

Gruss

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf » Do 8. Jun 2006, 21:54

conradius hat geschrieben: Die aktualisierte Version ist nach wie vor zu finden unter: http://www.mereo.ch/_support/con_ul_mainnavigation.zip
Gruss
bei mir wills noch ned richtig hab dir mal dreist ne pm geschickt :?
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag von conradius » Fr 9. Jun 2006, 11:07

hm, also liebe Leute, die neu dazukommen; wartet noch schnell einen Moment, wir sind daran die Sache zu überarbeiten.

In Planung ist eine aufteilbare Navigation und eine einfache, geordnete ul. Mal mit mehr templates, mal mit weniger, aber immer korrekt verschachtelt. Hinzu kommt noch modRewrite. Wer inputs hat, soll sich bitte melden.

Besten Dank!

nonano
Beiträge: 43
Registriert: Do 13. Apr 2006, 17:45
Kontaktdaten:

Sehr fein!

Beitrag von nonano » Sa 10. Jun 2006, 09:07

Ich bin echt froh, dass sich Leute darüber gedanken machen. Super!

Bin gerade dabei, eine Web Site zu entwickeln, wo sich der Kunde eine ganz spezielle Navigation vorstellt.

Ich habe mir dazu das Finder-Menu von alistapart angepasst (ein wahnsinns-herumgetüftel - modif-by-Vermerk bitte drinlassen …), so dass ich jetzt nur noch das Modul für Contenido benötige.
Hier ist mal ein Beispiel, wie meine Anpassung aussieht – Das Beispiel zeigt, wie es aussieht wenn Punkt I.I.I.I geöffnet ist …

Das geht im wesentlichen mit einer verschachtelten ungeordneten Liste,
Dazu werden Breadcrumbs gestreut:

Code: Alles auswählen

<span class="breadCrumb">Dieses Thema ist in der Hierachie über dem aktuell angezeigten</span>
Und dann wird das aktuelle Thema wie folgt ausgezeichnet:

Code: Alles auswählen

<li class="currentTopic"><a href="order.php?a=1">aktuell geöffnete Seite</a></li>
Wobei es eine Stilfrage ist, ob man beim {aktuellen Thema} noch einen Link zum {aktuellen Thema} anbieten soll ...

Ich denke, das Modul müsste ich so anpassen können, dass es einen derartigen Quellcode generiert …

nonano
Beiträge: 43
Registriert: Do 13. Apr 2006, 17:45
Kontaktdaten:

anpassung an 4.6.8 ?

Beitrag von nonano » Sa 10. Jun 2006, 09:51

Hi,

Ich bekomm die folgende Fehlermeldung:

Code: Alles auswählen

Fatal error: Cannot redeclare catischildof() (previously declared in /(blahblah)/contenido/cms/front_content.php(792) : eval()'d code:178) in /(blahblah)/contenido/cms/front_content.php(792) : eval()'d code on line 720
Liegt das an der Version? Weiss jemand Abhilfe?

Danke!

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Re: anpassung an 4.6.8 ?

Beitrag von mvf » Sa 10. Jun 2006, 12:14

immer wieder das selbe, leuteln leuteln nicht imer gleich los fragen erst die suche benutzen ;)

http://contenido.org/forum/viewtopic.ph ... highlight=
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

nonano
Beiträge: 43
Registriert: Do 13. Apr 2006, 17:45
Kontaktdaten:

Beitrag von nonano » Sa 10. Jun 2006, 12:57

danke, ist gelöst.

Gesperrt