Seite 1 von 1

Navigationsmodul Problem <li><ul> W3C

Verfasst: So 30. Apr 2006, 21:01
von Sjakie
Hallo,

Im Moment versuche ich meine Contenido Seiten W3C-valide (HTML 4.01 Transitional) zu gestalten, und das hat geklappt bis auf folgende Fehler im Navigations-Modul:

# Error Line 46 column 1246: document type does not allow element "UL" here; assuming missing "LI" start-tag.
...">Sitemap</a></li><ul id="subnavlist"></ul></ul></div><br>

# Error Line 46 column 1251: end tag for "UL" which is not finished.
...emap</a></li><ul id="subnavlist"></ul></ul></div><br>

Dieses Problem ist auch ausführlich in diesem Thread beschrieben, aber nie gelöst worden: http://www.contenido.org/forum/viewtopic.php?t=8520

An sonsten finde ich keine Lösungsansätze zu diesen Problem. Kann jemanden mir dabei weiterhelfen? Der eingebundene Menucode ist:

Code: Alles auswählen

<?php


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
 * ergänzung: ohne Templates, nur css
 *            Frank Hoffmann - www.x28.de
 */
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];
}

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

/**
 * 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 '<div id="navcontainer">';

echo  '<ul>';

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

    /* 1. Navigations Ebene */
    if ($data['idcat'] == $idcat) {
      echo '<li><span class="menubullit">&bull;&nbsp;</span><a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" id="navactive1" target="'.$data['target'].'">'.$data['name'].'</a></li>';   
    }
    else {
      echo '<li><span class="menubullit">&bull;&nbsp;</span><a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" target="'.$data['target'].'">'.$data['name'].'</a></li>';   
    }
    if (is_array($data['sub'])) {
        echo  '<ul id="subnavlist">';
        foreach ($data['sub'] as $key => $data) {
            /* 2. Navigations Ebene */           
            if ($data['idcat'] == $idcat) {
               echo '<li>-&nbsp;<a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" id="navactive2" target="'.$data['target'].'">'.$data['name'].'</a></li>';   
            }
            else {
            echo '<li>-&nbsp;<a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" id="nav2" target="'.$data['target'].'">'.$data['name'].'</a></li>';   
            }
         
            if (is_array($data['sub'])) {
                echo  '<ul id="subsubnavlist">';
                foreach ($data['sub'] as $key => $data) {
                    /* 3. Navigations Ebene */
                   if ($data['idcat'] == $idcat) {
                      echo '<li>-&nbsp;<a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" id="navactive3" target="'.$data['target'].'">'.$data['name'].'</a></li>';   
                   }
                   else {
                      echo '<li>-&nbsp;<a href="'.$sess->url('front_content.php?idcat='.$data['idcat']).'" id="nav3" target="'.$data['target'].'">'.$data['name'].'</a></li>';   
                   }
                } // end foreach
                echo '</ul>';
            } // end if
         } // end foreach
        echo '</ul>';
     } // end if   
} // end foreach

echo '</ul>';
echo '</div>';

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

/* Clean buffer */
ob_end_clean();

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

?>

Verfasst: So 30. Apr 2006, 21:29
von Halchteranerin

Verfasst: So 30. Apr 2006, 21:43
von Sjakie
Nein, das ist ein XHTML Menü. Und da ich TinyMCE eingebunden habe, und bei den Infos bezüglich des Contenido Release 4.6.8 folgende Infos stehen, ist das leider keine Lösung.

========== Quote: ==========

Bekannte Probleme:
- Wird der tinyMCE als WYSIWYG-Editor verwendet, so wird die XHTML-Formatierung verworfen wenn der Content über das Insite Editing gespeichert wird. Dies ist ein Problem der Microsoft DHTML-Editing Komponente, welche die XHTML-Formatierung in entsprechende "Microsoft"-Standards umwandelt. Workarounds: Entweder kein XHTML oder kein Insite-Editing verwenden.

http://www.contenido.org/forum/viewtopic.php?t=12001

========= Endquote. =========

Trotzdem vielen Dank für die schnelle Reaktion!

Verfasst: So 30. Apr 2006, 22:09
von mvf
mal abgeshen dass das nicht zu deinem eigetlichen prob gehört, aber xhtml valid geht doch ;)

http://contenido.org/forum/viewtopic.ph ... html+valid

zu deinem list probin der standard navi:

hier mal der auszug aus ner 4.6.8 standard navioutput gekürzt auf 1 level

Code: Alles auswählen

print ('<ol id="navigation">');

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('front_content.php?idcat='.$data['idcat']));
       

			$tpl->next();
			if ($idcat == $data['idcat']) {
			    $tpl->generate('templates/navi/navi1Open.html');
			}elseif(is_array($data['sub'])){
			    $tpl->generate('templates/navi/navi1Active.html');
			} else {
			    $tpl->generate('templates/navi/navi1Passive.html');
			}


    } // end if
} // end foreach

print ('</ol>');
dazu dann ein html-template beispiel

Code: Alles auswählen

<!-- BEGIN:BLOCK -->
	<li class="menuLev1Active"><a href="{HREF}" class="navi1Active" title="{NAME}">{NAME}</a></li>
<!-- END:BLOCK -->
der rest is css

Verfasst: So 30. Apr 2006, 22:10
von Halchteranerin
aehm, das Modul ist zwar XHTML-konform, aber das heisst nicht, dass du es nicht benutzen kannst, wenn du kein XHTML benutzt. Und da wird nichts von TinyMCE geaendert, weil du ja das Modul nicht mit TinyMCE bearbeitest.
Und bei DEM Modul sind zumindest (nach Darth-Vaders Aussage) UL und LI richtig benutzt worden. Ich wuerd's einfach mal versuchen!

Verfasst: Mi 24. Mai 2006, 09:06
von conradius
Guck mal in diesem Thread vorbei. Da habe ich meine Version der Hauptnavigation vorgestellt, welche eine korrekt verschachtelte, template gesteuerte ul ausgibt: http://contenido.org/forum/viewtopic.php?p=80390#80390

lieber Gruss