erstmal grosses Lob für Version 4.3.x, habt euch echt was einfallen lassen.
Habe ein Problem, möchte die 1. Navigationsebene des Hauptmenüs oben anzeigen lassen, und bei Aktivierung eines Punktes die 2. und 3. Ebene auf der rechten Seite. Hab schon viel gesucht und ausprobiert, leider hab ich noch keine Lösung gefunden. Vielleicht wisst ihr was. Würde mich über eine Antwort freuen.
genau dasselbe problem habe ich auch. ich bin leider kein php-crack, weshalb mir das auseinanderfummeln schwer fällt.
ich habe das modul dupliziert und die funktionen im output-bereich des zweiten moduls umbenannt, um keinen fatal error beim parsen zu bekommen. das klappt auch. das navimodul links zeigt auch die unterkategorien richtig an, nur leider zeigt das navimodul oben alle kategorien an - inklusive der unterkategorien. man müsste also die unterkategorien rausfiltern und nur die anzeige der kategorien auf der gleichen ebene erlauben. nur - wie geht das?
<?php
// template klasse includen
include_once($cfg["path"]["contenido"] . 'classes/class.template.php');
/**
* Array storing alle the
* navigation data
*/
$navitems = array();
// template instanz
$tpl = new Template;
function nav($idcat) {
global $navitems, $client, $lang, $db, $cfg;
//searches for parentid
$sql = "SELECT parentid FROM ".$cfg["tab"]["cat"]." WHERE idcat='$idcat'";
$db->query($sql);
$db->next_record();
$parentid = $db->f("parentid");
// If parentid equals 0 break,
// first level reached.
if($parentid==0){
if($idcat!=1){
$navitems=array();
//search for the idcat where I´m the parent
$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='1' ORDER BY A.idtree";
$db->query($sql);
while ($db->next_record()) {
$navitems[$db->f("idcat")] = array("idcat"=>$db->f("idcat"),
"name"=>$db->f("name"));
}
}
return true;
}
// select idcats on the same level
// they have the same parent id
$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()) {
$tmp_nav[$db->f("idcat")] = array("idcat"=>$db->f("idcat"),
"name"=>$db->f("name"));
}
// Add the old navigation array to the new one,
// because it is an item of the new one on place $idcat
$tmp_nav[$idcat]["sub"] = $navitems;
$navitems = $tmp_nav;
nav($parentid);
}
if(!isset($idcat)){
//set the start idcat
$idcat = 1;
}
//search for the idcat where I´m the parent
$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='$idcat' ORDER BY A.idtree";
$db->query($sql);
while ($db->next_record()) {
$navitems[$db->f("idcat")] = array("idcat"=>$db->f("idcat"),
"name"=>$db->f("name"));
}
nav($idcat);
/**
* array $navitems enthält alle daten
* die für das aufbauen der navigation
* notwendig sind.
*/
echo '<table class="mittelgrau" cellspacing="0" cellpadding="0" border="0"><tr>';
foreach ($navitems as $key => $data) {
// 1. navi ebene
$tpl->reset();
$tpl->set('d', 'NAME', $data['name']);
$tpl->set('d', 'HREF', $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang));
$tpl->next();
if ($idcat == $data['idcat'] || is_array($data['sub'])) {
$tpl->generate('templates/navfirst_on.html');
} else {
$tpl->generate('templates/navfirst_off.html');
}
} // end foreach
echo '</tr></table>';
?>
<?php
// template klasse includen
include_once($cfg["path"]["contenido"] . 'classes/class.template.php');
/**
* array $navitems enthält alle daten
* die für das aufbauen der navigation
* notwendig sind.
*/
echo '<table cellspacing="0" cellpadding="0" border="0">';
echo '<tr><td height="20" colspan="2"></td></tr>';
foreach ($navitems as $key => $data) {
// ------------ 1. navi ebene mit Ausgabe der aktiven Kategorie----------
$tpl->reset();
$tpl->set('d', 'NAME', $data['name']);
$tpl->set('d', 'HREF', $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang));
$tpl->next();
if ($idcat == $data['idcat'] || is_array($data['sub'])) {
$tpl->generate('templates/navsubfirst_on.html');
}
if (is_array($data['sub'])) {
foreach ($data['sub'] as $key => $data) {
//---------------- 2. navi ebene ---------------------------
$tpl->reset();
$tpl->set('d', 'NAME', $data['name']);
$tpl->set('d', 'HREF', $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang));
$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. navi ebene --------------------
$tpl->reset();
$tpl->set('d', 'NAME', $data['name']);
$tpl->set('d', 'HREF', $sess->url('front_content.php?idcat='.$data['idcat'].'&client='.$client.'&lang='.$lang));
$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
echo '</table>';
?>
Im Prinzip wird beim Container für die 2. und 3. Ebene der gesamte menübaum abgearbeitet, für die Elemente der ersten Ebene erfolgt aber nur eine Ausgabe des aktiven Punktes, als eine Art Überschrift. Du kannst aber diese Ausgabe einfach rausnehmen...
Das Modul für die erste Ebene geht gar nicht in die Unterkategorien rein, (wie du bestimmt auch im direkten Vergleich am Code sehen kannst).
ich habe den obigen Code jeweil in 2 Module als Output inhalte gesteckt. Die input inhalte habe ich von der Hauptnavigation übernommen. Es wird trotzdem nichts angezeigt, egal ob ich nur ein modul anzeigen lasse oder 2.
Also bei der vordefinierten hauptnavigation in der v4.3.2.1 ist ein input bereich drin. Dort kann man auswählen welchen Hauptbaum man auswählen möchte. Da ich 4 Hauptbäume habe möchte ich das schon auswählen, es sei denn das wird dann automatisch gemacht.
Nachdem ich jetzt überall den input bereich gelöscht habe und jeweils Modul1 (ebene 1) und Modul2 (ebenen 2+3) einem anderen Container zugewiesen habe, dauert es ca 1-2 minuten bis die Seite angezeigt wird, die navigation wird jedoch nicht angezigt.
Also es scheint, daß er versuch irgendetwas aus der DB auszulesen macht er aber nix.
Ich habe die Module versucht anders zu schreiben und zwar:
Navi Ebene 1:
(Habe das Standard Navigationsmodul übernommen und die Ausgabe für 2 und 3 Ebene weggelöscht)
OUTPUT:
<?php
if ( !is_object($db2) ) {
$db2 = new DB_Contenido;
}
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."'";
/* 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."'";
$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."'";
$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."'";
(Habe das Standard Navigationsmodul übernommen und die Ausgabe für 1 Ebene weggelöscht)
OUTPUT:
<?php
if ( !is_object($db2) ) {
$db2 = new DB_Contenido;
}
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."'";
/* 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[1] ){
$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[1]'
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."'";
$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."'";
$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."'";
Das funktioniert auch alles wunderbar, wenn ich die Module nicht gleichzeitig in einen Tamplate lade. Dann wird erneut gar nix ausgegeben.
Wahrscheinlich fragt er etwas doppelt aus oder wird bei der Abfrage etwas durcheinander gebracht.
habe deinen code mit den ebenen mal auf einem versuchssystem angewendet, funktioniert wirklich klasse. Ein kleines problem habe ich allerdings dabei: die erste ebene öffnet erstmal ein neues fenster, navigiert man in dem neuen fenster ist alles astrein. gibts da nen tip wie man dies unterdrücken kann, also sich alles in einem browserfenster abspielt?
system und user:
wampp, neueste beta contenido.
php- und contenidofrischling.
da ich anscheinend mit gullis lösung etwas weiter bin hier meine lösung, die bei mir funktioniert.
Im Baum Hauptnavigation 1. und 2. Ebenen definiert--anstatt Hauptnavigation das Modul der ersten Ebene in das Template einbinden, Hauptnavigation weglassen--das Modul der zweiten Ebene an beliebiger Stelle ebenfalls in das Template einfügen. (Sollte funktionieren)
Ich hoffe ich habe es einigermassen beschrieben. Bleibt leider mein Problem, das sich beim erstenmal ein neues Fenster mit der zweiten Ebene öffnet.
Hallo AlexG,
welche Version verwendest Du ? Mit 4.3.2.1b reagiert obiger Code genau wie Du es beschreibst. Du müßtest in diesem Falle für Ebene 2+3 den QT gegen den der aktuellen Hauptnavi austauschen, da steht was von target dabei. Das funzt !
ich habe deine lösung am anfang nicht ganz verstanden, bin jetzt aber erfolgreich. Ich stocher hier einfach nur im code rum, weil ich von php null ahnung habe. Ich habe in den 2 Modulen den Code einfach um die Zeilen Target ergänzt, so funktioniert gullis lösung bei mir unter unter 4.3.2.1b.
danke, alex
Im Modul 1 Ebene Ergänzung TARGET
// ------------ 1. navi ebene mit Ausgabe der aktiven Kategorie----------
$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'].'&client='.$client.'&lang='.$lang));
$tpl->next();
if ($idcat == $data['idcat'] || is_array($data['sub'])) {
$tpl->generate('templates/navsubfirst_on.html');