Probleme mit 3ter Navigationsebene mit mod rewrite

Gesperrt
llaron
Beiträge: 133
Registriert: Mi 14. Jul 2004, 12:54
Kontaktdaten:

Probleme mit 3ter Navigationsebene mit mod rewrite

Beitrag von llaron »

hi,

ich habe das untenstehende mod rewrite von nikolis bei mir verbaut. funktioniert soweit auch ganz gut. nur ein problem gibt es - die dritte ebene in der navigation funktioniert nicht. es wird bei allen menüpunkten von ebene 3 die url vom darüberliegenden punkt der ebene 2 angezeigt! ich benutze die geteilte navigation - ebene eins ist horizontal in einem container, ebene 2 + 3 sind zusammen, untereinander in einem container (dürfte aber keine rolle spielen)

bsp:

punkt 1 (horizontal)

punkt 1.1 (url bsp. 2-Produkte.html)
> punkt 1.1.1 (url bsp. 2-Produkte.html = gleiche url wie punkt 1.1!)

hat jemand ne idee woran das liegen könnte?

merci,
Nico
schöner thread, hat mir den Anfang sehr erleichtert.

@laurisilva: Ich hatte das gleich Problem, bei mir sind das allerdings sehr wenige links und da ist es einfacher diese manuell zu aktualisieren. Das einzige was ich aber gemacht habe, ist den enstprechenden part in htmlarea zu aktualisieren so dass alle neuen Links so eingefügt werden wie es gewollt ist. In der Datei dialogs/insert_link.php kannst du das an einer Stelle ändern damit der "Interne Link" in Zukunft richtig gesetzt wird.

Um es im nachhinein zu machen müsstest du glaub ich die db per script aktualisieren und ich denke mal in der Datenbank-Tabelle namens content die entsprechenden Werte des Feldes namens "value" editieren. Ich bin aber noch nicht so contenido erfahren, und weiss nicht ob es noch andere Fälle gibt wo das wo anderes gespeichert wird.

Ich persönlich finde FrankHoffmann's Lösung am besten obwohl ich das "Skript" nirgendwo gefunden habe zum Download, und Kunde will ich bei ihm nicht werden. Ich weiss nicht ob du es der Communitiy hier angeboten hast, oder es nicht anbieten möchtest. Wie auch immer, es ist ja auch nichts dabei das selber zu machen. Und aus SEO Sicht ist es auf jeden Fall die bessere Lösung, den Dateinamen nach dem Kategorienamen zu benennen. Da das Skript aber statische Seiten erzeugt, finde ich es als nicht so optimale Lösung. Ich habe mich für eine Kombination entschieden zwischen laurisilva's Ansatz und FrankHoffmann's:

Ich habe laurisilvas Ansatz umgesetzt und einfach etwas erweitert. Meine Zeile(n) in der .htaccess lautet:

RewriteRule ^([0-9]*)-(.*).html$ /front_content.php?idcat=$1

Somit habe ich das Format :

26-Buchhandlung.html

was man sicher noch optimieren kann. Dabei ist 26 die id, das minus nur ein Trennzeichen, und Buchhandlung der zur ID 26 gehörende Kategorie-Name, der aber ignoriert wird, das erkennt man daran das ich kein $2 verwende.

An den von laurisilva erwähnten Stellen für die Navigationslinks habe ich einfach "sein":
$data['idcat'].
ersetzt/erweitert durch:
$data['idcat'].'-'.$data['name'].

Ich weiss natürlich nicht ob es da Fälle gibt wo das nicht so richtig klappt, aber soweit ich das bisher sehe, sollten die auch lösbar sein.
Der Vorteil ist dass man das weiterhin im contenido style hat und keine statischen Seiten erzeugen brauch, ein Nachteil ist das die ID (mit dem Bindestrich) dazwischen ist.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

die generierten links sind ident ? dort müsste zumindestens ne andere idcat stehen...
wie sieht das modul aus ?
*** make your own tools (wishlist :: thx)
llaron
Beiträge: 133
Registriert: Mi 14. Jul 2004, 12:54
Kontaktdaten:

Beitrag von llaron »

hi emergence,

ja, die sind absolut identisch. bzw. die links funktionieren dann klar auch nicht. beim klick wird nur die gleiche url angezeigt und es tut sich nix. das navi-modul sieht folgendermaßen aus:

container ebene 1
eingabe:

Code: Alles auswählen

?>
<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


AUSGABE:

<?php
// Hauptnav
/***********************************************
* 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 cellspacing="0" cellpadding="0" border="0"><tr><td>';

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($data['idcat'].'-'.$data['name'].'.html'));
$tpl->next();

if ($idcat == $data['idcat'] || is_array($data['sub'])) {
$tpl->generate('templates/navfirst_h_on.html');
} else {
$tpl->generate('templates/navfirst_h_off.html');
}
if (is_array($data['sub'])) {
$tmp_data = array();
$tmp_data = $data;
} // end if
} // end foreach
echo '</td></tr></table>';

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

/* Clean buffer */
ob_end_clean();

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

?>
container ebene 2+3 ausgabe:

Code: Alles auswählen

<?php
if (is_array($tmp_data['sub'])) {
$data = $tmp_data;
echo '<table cellspacing="0" cellpadding="0" border="0"><tr><td>';
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($data['idcat'].'-'.$data['name'].'.html'));
$tpl->next();

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

echo '<table cellspacing="0" cellpadding="0" border="0"><tr><td>';
foreach ($data['sub'] as $key2 => $data2) {

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

if ($idcat == $data2['idcat']) {
$tpl->generate('templates/navthird_h_on.html');
} else {
$tpl->generate('templates/navthird_h_off.html');
}
} // end foreach
echo '</td></tr></table>';
} // end if 

} // end for each
echo '</td></tr></table>';
} // end if ?>
merci für deine hilfe :)

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

Beitrag von emergence »

/* 3. Navigations Ebene */
$tpl->reset();
$tpl->set('d', 'NAME', $data2['name']);
$tpl->set('d', 'TARGET', $data2['target']);
$tpl->set('d', 'HREF', $sess->url($data['idcat'].'-'.$data['name'].'.html'));
$tpl->next();
fällt dir was auf ?

du solltest beim HREF ebenso $data2 verwenden... $data wird bei der zweiten verwendet...

->

Code: Alles auswählen

$tpl->set('d', 'HREF', $sess->url($data2['idcat'].'-'.$data2['name'].'.html'));
*** make your own tools (wishlist :: thx)
llaron
Beiträge: 133
Registriert: Mi 14. Jul 2004, 12:54
Kontaktdaten:

Beitrag von llaron »

es sind wohl immer die kleinigkeiten die einem nicht auffallen!

super, jetzt gehts...dank dir :lol:

Gruß,
Nico
Gesperrt