Seite 5 von 25

Verfasst: Di 28. Aug 2007, 09:48
von kummer
derSteffen hat geschrieben:In meinem Menü soll man sehen wie man sich durch das Menü durchgeklickt hat. Das funktioniert mit dem Menü ja auch super, da ja die offenen Kategorien mit dem maskSelected
maskSelectedSub deklariert werden. Also werden bei mir alle offenen Kategorie-Punkt fett dargestellt. Allerdings bekomme ich es nicht hint zu sagen, dass nur der aktuelle Punkt rot dargestellt werden soll. Wenn ich das mit dem maskSelected
maskSelectedSub deklariere werden ja alle offenen Punkte rot dargestellt. Gibt es noch eine Art Zusatz-Beschreibung für aktive Punkte?
zurzeit habe ich diese möglichkeit direkt in der klasse nicht vorgesehen. aber du kannst mal folgendes versuchen (wird halt immer ein bisschen komplizierter):

Code: Alles auswählen

<?php

cInclude('classes', 'atelierq.navigation.class.inc.php');

$cApiClient = new cApiClient($client);
$aQnavigation = new aQnavigation($cApiClient->getProperty('navigation', 'idcat_hauptnavigation'));

/*
 * Ausgabe 3. Stufe
 */
$aQnavigation->before(2, '<ul>');
$aQnavigation->after(2, '</ul>');
$aQnavigation->between(2, '');
$aQnavigation->maskNormal(2, '<li><a href="{link}" class="subsub">{name1}</a></li>');
$aQnavigation->maskNormalSub(2, '<li><a href="{link}" class="subsubsub">{name1}</a></li>{sub}');
$aQnavigation->maskSelected(2, '<li><a href="{link}" class="subsubaktiv">1››{name1}</a></li>');
$aQnavigation->maskSelectedSub(2, '<li><a href="{link}" class="subsubsubaktiv">1›››{name1}</a></li>');

/*
 * Ausgabe 2. Stufe
 */
$aQnavigation->between(1, '');
$aQnavigation->maskNormal(1, '<li><a href="{link}" class="subsub">{name1}</a></li>');
$aQnavigation->maskSelected(1, '<li><a href="{link}" class="subsubaktiv">1››{name1}</a></li>');

$tmpOut = $aQnavigation->showNavigation(2);
$aQnavigation->setSub(1, $tmpOut);

if (empty($tmpOut)) {
	/*
	 * Ausgabe ROT
	 */
	$aQnavigation->maskSelectedSub(1, '<li><a href="{link}" class="subsubsubaktivROT">1›››{name1}</a></li>{sub}');
	$aQnavigation->maskNormalSub(1, '<li><a href="{link}" class="subsubsubROT">{name1}</a></li>{sub}');
} else {
	/*
	 * Ausgabe Normal
	 */
	$aQnavigation->maskSelectedSub(1, '<li><a href="{link}" class="subsubsubaktiv">1›››{name1}</a></li>{sub}');
	$aQnavigation->maskNormalSub(1, '<li><a href="{link}" class="subsubsub">{name1}</a></li>{sub}');
}

/*
 * Ausgabe 1. Stufe
 */
$aQnavigation->between(0, '');
$aQnavigation->maskNormal(0, '<li><a href="{link}">{name1}</a></li>');
$aQnavigation->maskSelected(0, '<li><a href="{link}" class="aktiv">0››{name1}</a></li>');

$tmpOut = $aQnavigation->showNavigation(1);
$aQnavigation->setSub(0, $tmpOut);

if (empty($tmpOut)) {
	/*
	 * Ausgabe ROT
	 */
	$aQnavigation->maskNormalSub(0, '<li><a href="{link}" class="subROT">{name1}</a></li>{sub}');
	$aQnavigation->maskSelectedSub(0, '<li><a href="{link}" class="subaktivROT">0›››{name1}</a></li>{sub}');
} else {
	/*
	 * Ausgabe Normal
	 */
	$aQnavigation->maskNormalSub(0, '<li><a href="{link}" class="sub">{name1}</a></li>{sub}');
	$aQnavigation->maskSelectedSub(0, '<li><a href="{link}" class="subaktiv">0›››{name1}</a></li>{sub}');
}

/*
 * hier erfolgt die ausgabe an den browser
 */
echo $aQnavigation->showNavigation(0);
?>
achtung: das ist nicht geprüft. ist nur so ne idee... :roll:

Verfasst: Di 28. Aug 2007, 19:13
von _Marc
kummer hat geschrieben:wie bereits gesagt: das problem ist bekannt und wir behoben werden. allerdings wird das noch eine woche oder zwei dauern.
Lass Dir Zeit, hab Deinen ersten Beitrag dazu gelesen und gespeichert.

Wollte Dir nur das genaue Szenario beschreiben, wanns geht und wann nicht, damit das Debugging schneller geht.

Grüße
Marc

Verfasst: Mi 29. Aug 2007, 06:58
von derSteffen
Hallo Kummer,

vielen Dank für die schnelle Antwort.
Leider klappt das nicht :-(

Code: Alles auswählen

if (empty($tmpOut)) {
bedeutet doch wenn in der offenen Kategorie keine weiteren Punkte existieren, oder?

Danke

Verfasst: Mi 29. Aug 2007, 08:03
von kummer
derSteffen hat geschrieben:

Code: Alles auswählen

if (empty($tmpOut)) {
bedeutet doch wenn in der offenen Kategorie keine weiteren Punkte existieren, oder?
genau. was kriegst du denn für eine ausgabe? gar keine? fehler? oder ein ansonsten unerwartetes ergebnis?

Verfasst: Mi 29. Aug 2007, 10:02
von derSteffen
mhm - also ich habe den Code mal für meine Bedürfnisse leicht angepasst:

Code: Alles auswählen

<?php

cInclude('classes', 'atelierq.navigation.class.inc.php');

$cApiClient = new cApiClient($client);
$aQnavigation = new aQnavigation($cApiClient->getProperty('navigation', 'idcat_hauptnavigation'));

/*
 * Ausgabe 3. Stufe
 */
$aQnavigation->before(2, '');
$aQnavigation->after(2, ''); 
$aQnavigation->between(2, '');
$aQnavigation->maskNormal(2, '<li><a href="{link}" class="subsubsub">{name1}</a></li>');
$aQnavigation->maskNormalSub(2, '<li><a href="{link}" class="subsubsubsub">{name1}</a></li>{sub}');
$aQnavigation->maskSelected(2, '<li><a href="{link}" class="subsubsubaktiv">{name1}</a></li>');
$aQnavigation->maskSelectedSub(2, '<li><a href="{link}" class="subsubsubsubaktiv">{name1}</a></li>');

/*
 * Ausgabe 2. Stufe
 */
$aQnavigation->between(1, '');
$aQnavigation->maskNormal(1, '<li><a href="{link}" class="subsub">{name1}</a></li>');
$aQnavigation->maskSelected(1, '<li><a href="{link}" class="subsubaktiv">{name1}</a></li>');

$tmpOut = $aQnavigation->showNavigation(2);
$aQnavigation->setSub(1, $tmpOut);

if (empty($tmpOut)) {
   /*
    * Ausgabe ROT
    */
$aQnavigation->maskSelectedSub(1, '<li><a href="{link}" class="subsubaktiv">RED {name1}</a></li>{sub}');
$aQnavigation->maskNormalSub(1, '<li><a href="{link}" class="subsubsub">RED {name1}</a></li>{sub}');
} else {
   /*
    * Ausgabe Normal
    */
$aQnavigation->maskSelectedSub(1, '<li><a href="{link}" class="subsubaktiv">{name1}</a></li>{sub}');
$aQnavigation->maskNormalSub(1, '<li><a href="{link}" class="subsubsub">{name1}</a></li>{sub}');
}

/*
 * Ausgabe 1. Stufe
 */
$aQnavigation->before(0, '');
$aQnavigation->after(0, ''); 
$aQnavigation->between(0, '');
$aQnavigation->maskNormal(0, '<li><a href="{link}">{name1}</a></li>');
$aQnavigation->maskSelected(0, '<li><a href="{link}" class="aktiv">{name1}</a></li>');

$tmpOut = $aQnavigation->showNavigation(1);
$aQnavigation->setSub(0, $tmpOut);

if (empty($tmpOut)) {
   /*
    * Ausgabe ROT
    */
$aQnavigation->maskNormalSub(0, '<li><a href="{link}" class="sub">RED {name1}</a></li>{sub}');
$aQnavigation->maskSelectedSub(0, '<li><a href="{link}" class="subaktiv">RED {name1}</a></li>{sub}');
} else {
   /*
    * Ausgabe Normal
    */
$aQnavigation->maskNormalSub(0, '<li><a href="{link}" class="sub">{name1}</a></li>{sub}');
$aQnavigation->maskSelectedSub(0, '<li><a href="{link}" class="subaktiv">{name1}</a></li>{sub}');
}

/*
 * hier erfolgt die ausgabe an den browser
 */
echo $aQnavigation->showNavigation(0);
?>
Es funktioniert hier alles wie gewohnt. Keine Fehlermeldung, allerdings wird der eine aktive Punkt nicht mit dem Zusatz "RED" angezeigt. Ich habe auch schon viel rumgetestet aber es hat noch keine Früchte getragen.

PS: Mit dem Code den Du mir vorher bereit gestellt hast, hat es ebenfalls nicht funktioniert.

Verfasst: Mi 29. Aug 2007, 10:23
von kummer
ich sehe schon, auf diese weise wird das nix. ich schaue mal, was sich direkt in der klasse machen lässt und publiziere dann hier den code. habe in paar stunden geduld.

Verfasst: Mi 29. Aug 2007, 10:27
von derSteffen
Ach, na ich will ja jetzt nicht, dass du jetzt so viel Arbeit hast. Ich wollte ja nur Fragen ob es sowas schon gab oder gibt. Aber Danke Dir. Wäre natürlich noch eine praktische Geschichte, wenn man den aktiven Punkt nochmals expliziet hervorheben kann.

MfG

Verfasst: Mi 29. Aug 2007, 10:48
von kummer
so, verwende mal diese klasse (siehe code).

die if-prüfungen werden nicht mehr benötigt. das aktive element braucht einfach nun folgende masken (analog selected):

Code: Alles auswählen

$this->maskActive(1, 'meine Maske');
$this->maskActiveSub(1, 'meine Maske');
hier die klasse (noch ungeprüft):

Code: Alles auswählen

<?php


/**
 * @author Andreas Kummer
 * @copyright Copyright &copy; 2007 atelierQ
 */

class aQnavigation {

	/**
	 * Konstruktor der Klasse.
	 * @param Integer  Primärschlüssel der Startkategorie.
	 */
	function aQnavigation($startId) {

		global $client, $lang, $idcat, $db;

		$this->startId = $startId;

		$this->client = $client;
		$this->lang = $lang;

		$this->idcat = (isset ($_GET['pretend'])) ? ($_GET['pretend']) : ($idcat);

		$this->before = '';
		$this->beforeEach = '';
		$this->between = '';
		$this->after = '';

		$this->excludeItemsStartingWith = '__';

		$this->db = $db;

		$this->setStartIds();

		$this->getNavigation();
	}

	/**
	 * Auslesen der Navigationsstruktur aus der Datenbank.
	 */
	function getNavigation() {

		global $cfg, $auth;

		if ($this->startId != $this->id[0]) {
			/*
			 * Wenn die StartId nicht identisch ist mit der höchsten Ebene der
			 * aktuell selektierten Kategorie, dann liegt die gewählte Kategorie
			 * folgerichtig ausserhalb des für die Navigation gewählten Baumes.
			 * In diesem Fall ist nur die Hauptnavigation einzublenden.
			 */
			$this->id[0] = $this->startId;
			for ($i = 1; $i <= 3; $i++) {
				$this->id[$i] = -1;
			}
		}

		if ($auth->auth['uid'] == '' || !$this->isNumeric($auth->auth['uid'])) {
			/*
			 * Login nicht erfolgt
			 */
			$user = 0;
		} else {
			/*
			 * Benutzer ist eingeloggt
			 */
			$user = $auth->auth['uid'];
		}

		$this->db->query("" .
		"SELECT DISTINCT " .
		"a.idcat, " .
		"a.parentid, " .
		"a.preid, " .
		"a.postid, " .
		"a.parentid, " .
		"b.name, " .
		"b.idlang, " .
		"IF (b.visible = 1 && (b.public = 1 || c.idfrontendpermission IS NOT NULL), 1, 0) AS visible " .
		"FROM {$cfg['tab']['cat']} AS a " .
		"LEFT JOIN {$cfg['tab']['cat_lang']} AS b ON a.idcat = b.idcat " .
		"LEFT JOIN {$cfg['tab']['frontendpermissions']} AS c ON (c.item = b.idcatlang AND c.idlang = b.idlang AND plugin ='category') " .
		"LEFT JOIN {$cfg['tab']['frontendgroupmembers']} AS d ON c.idfrontendgroup = d.idfrontendgroup " .
		"WHERE " .
		"   a.idclient = {$this->client} " .
		"   AND (" .
		"      a.parentid = {$this->id[0]} " .
		"      OR a.parentid = {$this->id[1]} " .
		"      OR a.parentid = {$this->id[2]} " .
		"      OR a.parentid = {$this->id[3]} " .
		"   ) " .
		"   AND (" .
		"      d.idfrontenduser = {$user} " .
		"      OR d.idfrontenduser IS NULL" .
		"   )" .
		"");

		$this->navigationTree = array ();

		$this->firstId[0] = 0;
		$this->firstId[1] = 0;
		$this->firstId[2] = 0;
		$this->firstId[3] = 0;

		while ($this->db->next_record()) {

			for ($i = 0; $i <= 3; $i++) {
				if (($this->firstId[$i] == 0 && $this->db->f('parentid') == $this->id[$i] && $this->db->f('preid') == 0 && $this->db->f('idlang') == $this->lang) || ($this->firstId[$i] == 0 && $this->db->f('parentid') == $this->id[$i] && $this->db->f('preid') == 0 && $this->db->f('idlang') == null)) {
					$this->firstId[$i] = $this->db->f('idcat');
				}
			}
			/*
			 * Das Einfügen in den Navigationsbaum darf nur erfolgen, wenn noch kein Eintrag existiert
			 * oder - wenn bereits einer existiert - der neue Eintrag der aktuell gewählten Sprache
			 * entspricht.
			 */
			if (!isset ($this->navigationTree[$this->db->f('parentid')][$this->db->f('idcat')]) || $this->db->f('idlang') == $this->lang) {
				$this->navigationTree[$this->db->f('parentid')][$this->db->f('idcat')] = array (
					'preid' => $this->db->f('preid'
				), 'postid' => $this->db->f('postid'), 'visible' => $this->db->f('visible'), 'name' => $this->db->f('name'), 'idlang' => $this->db->f('idlang'));
			}
		}

	}

	/**
	 * Ausgabe der Navigation an die Standardausgabe.
	 * @param String  Navigationstyp
	 */
	function showNavigation($type, $next = -1) {

		static $first;
		static $output = array (
			false,
			false,
			false,
			false,
			false,
			false,
			false
		);

		$returnValue = "";

		if ($next == 0) {
			if ($output[$type]) {
				return $this->after[$type];
			} else {
				return false;
			}
		}

		if ($next == -1) {
			$returnValue .= $this->before[$type];
			$next = $this->firstId[$type];
			$first[$type] = true;
		}

		$parentId = $this->id[$type];

		$link = 'front_content.php?idcat=' . $next;

		if ($this->navigationTree[$parentId][$next]['visible'] == 1 && $this->navigationTree[$parentId][$next]['idlang'] == $this->lang && $this->isVisble($this->navigationTree[$parentId][$next]['name'])) {
			if (!$first[$type]) {
				$returnValue .= $this->between[$type];
			}

			if (strstr($this->navigationTree[$parentId][$next]['name'], '$$$') == true) {
				$name = explode('$$$', $this->navigationTree[$parentId][$next]['name']);
				$name1 = $name[0];
				$name2 = $name[1];
			} else {
				$name1 = $this->navigationTree[$parentId][$next]['name'];
				$name2 = '';
			}

			$sub = (isset ($this->sub[$type])) ? ($this->sub[$type]) : ('');

			if ($this->isActive($next) &! empty($this->maskActive[$type]) &! empty($this->maskActive[$type])) {
				$returnValue .= $this->beforeSelected[$type];
				$returnValue .= str_replace('{sub}', $sub, str_replace('{name2}', $name2, str_replace('{name1}', $name1, str_replace('{link}', $link, ($sub == '') ? ($this->maskActive[$type]) : ($this->maskActiveSub[$type])))));
			} elseif ($this->isSelected($next)) {
				$returnValue .= $this->beforeSelected[$type];
				$returnValue .= str_replace('{sub}', $sub, str_replace('{name2}', $name2, str_replace('{name1}', $name1, str_replace('{link}', $link, ($sub == '') ? ($this->maskSelected[$type]) : ($this->maskSelectedSub[$type])))));
			} else {
				$returnValue .= $this->beforeEach[$type];
				$returnValue .= str_replace('{sub}', $sub, str_replace('{name2}', $name2, str_replace('{name1}', $name1, str_replace('{link}', $link, $this->maskNormal[$type]))));
			}

			$first[$type] = false;
			$output[$type] = true;
		}
		elseif (!$output && $this->navigationTree[$parentId][$next]['postid'] == 0) {
			/*
			 * Die Navigation enthält nichts.
			 */
		}

		return $returnValue . $this->showNavigation($type, $this->navigationTree[$parentId][$next]['postid']);
	}

	function setExcludeStart($start) {
		$this->excludeItemsStartingWith = $start;
	}

	function isVisble($name) {
		if (substr($name, 0, strlen($this->excludeItemsStartingWith)) == $this->excludeItemsStartingWith) {
			return false;
		}
		return true;
	}

	/**
	 * Ausgabe vor der Navigation
	 * @param String  Ausgabe vor der Navigation.
	 */
	function before($level, $text) {
		$this->before[$level] = $text;
	}

	/**
	 * Ausgabe vor jedem Eintrag
	 * @param String  Ausgabe vor jedem Eintrag.
	 */
	function beforeEach($level, $text) {
		$this->beforeEach[$level] = $text;
	}

	/**
	 * Ausgabe vor jedem selektierten Menueintrag
	 * @param String  Ausgabe vor jedem selektierten Menueintrag.
	 */
	function beforeSelected($level, $text) {
		$this->beforeSelected[$level] = $text;
	}

	/**
	 * Ausgabe zwischen zwei Hauptmenupunkten
	 * @param String  Ausgabe zwischen zwei Hauptmenupunkten.
	 */
	function between($level, $text) {
		$this->between[$level] = $text;
	}

	/**
	 * Ausgabe nach der Navigation
	 * @param String  Ausgabe nach der Navigation.
	 */
	function after($level, $text) {
		$this->after[$level] = $text;
	}

	function maskNormal($level, $text) {
		$this->maskNormal[$level] = $text;
	}

	function maskNormalSub($level, $text) {
		$this->maskNormalSub[$level] = $text;
	}

	function maskSelected($level, $text) {
		$this->maskSelected[$level] = $text;
	}

	function maskSelectedSub($level, $text) {
		$this->maskSelectedSub[$level] = $text;
	}

	function maskActive($level, $text) {
		$this->maskActive[$level] = $text;
	}

	function maskActiveSub($level, $text) {
		$this->maskActiveSub[$level] = $text;
	}

	function setSub($level, $content) {
		$this->sub[$level] = $content;
	}

	/**
	 * Gibt das Level der Kategorie zurück.
	 * @param Integer  Primärschlüssel der Kategorie.
	 * @return Integer Level der spezifizierten Kategorie.
	 */
	function getLevel($idcat) {

		global $cfg;

		if (empty ($idcat)) {
			return 0;
		}

		$this->db->query("" .
		"SELECT level FROM {$cfg['tab']['cat_tree']} " .
		"WHERE " .
		"   idcat = $idcat" .
		"");
		if ($this->db->next_record()) {
			return $this->db->f('level');
		} else {
			return 0;
		}
	}

	/**
	 * Gib die Tiefe relativ zum Hauptmenu an.
	 * @param Integer  Primärschlüssel der Kategorie
	 * @return Integer Level relativ zum Hauptmenu
	 */
	function getNetLevel($idcat) {

		return $this->getLevel($idcat) - $this->getLevel($this->startId);
	}

	/**
	 * Ermittlung des jeweils ersten Kategorieeintrages jeder Ebene. Die
	 * Speicherung dieser Daten erfolgt in das Klassenattribut id.
	 */
	function setStartIds() {

		$id = $this->idcat;

		$level = $this->getNetLevel($id);
		$this->id[$level] = $id;

		while ($level > 0) {
			$this->id[$level -1] = $this->getParentId($id);
			$id = $this->id[$level -1];
			$level = $this->getNetLevel($id);
		}

		if (empty ($this->id)) {
			$this->id[0] = $this->startId;
		}
		for ($i = 1; $i <= 3; $i++) {
			if (empty ($this->id[$i])) {
				$this->id[$i] = -1;
			}
		}
		ksort($this->id);
	}

	/**
	 * Ermittlung des Elternelementes der Kategorie mit dem Primärschlüssel
	 * idcat
	 * @param Integer  Primärschlüssel des Kindelementes, dessen Elternelement
	 * ermittelt werden soll.
	 * @return Integer Primärschlüssel des Elternelementes.
	 */
	function getParentId($idcat) {

		global $cfg;

		$this->db->query("" .
		"SELECT parentid FROM {$cfg['tab']['cat']} " .
		"WHERE " .
		"   idcat = $idcat " .
		"");
		if ($this->db->next_record()) {
			return $this->db->f('parentid');
		} else {
			return 0;
		}
	}

	/**
	 * Anzeige, ob eine Navigationsebene Elemente enthält oder nicht.
	 * @param Integer  Navigationsstufe.
	 * @return Boolean True, wenn die Navigationsstufe leer ist (keine Elemente
	 * enhält). Sonst false.
	 */
	function navigationEmpty($level) {

		if ($this->firstId[$level] == 0) {
			return true;
		}

		return false;
	}

	/**
	 * Anzeige, ob eine Kategorie selektiert ist oder nicht. Eine Kategorie gilt
	 * als selektiert, wenn sie die aktuelle Kategorie ist oder ein direktes
	 * oder indirektes Elternelement der aktuellen Kategorie.
	 * @param Integer  Primärschlüssel der Kategorie, deren Status gefragt ist.
	 * @return Boolean True, wenn die gefragte Kategorie mit der aktuellen
	 * Kategorie übereinstimmt oder ein direktes oder indirektes Elternelement
	 * der aktuellen Kategorie darstellt.
	 */
	function isSelected($idcat) {

		return in_array($idcat, $this->id);
	}

	/**
	 * Anzeige, ob es sich bei der Kategorie um die aktive Kategorie handelt oder nicht.
	 * @param Integer Primärschlüssel der Kategorie, deren Status gefragt ist.
	 * @return Boolean True, wenn die gefragte Kategorie aktiv ist.
	 */
	function isActive($idcat) {

		return $idcat == $this -id;
	}

	function isNumeric($parameter) {
		return !preg_match("/[^0-9]/", $parameter);
	}
}
?>
ich hoffe es funktioniert. gib mir doch bitte kurz bescheid.

gruss,
andreas

Ich bekomme das nicht hin

Verfasst: Do 30. Aug 2007, 13:25
von kenzo
Ich glaube alles richtig gemacht zu haben, bekomme aber immer wieder diesen Fehler. Die Navi ist nicht zu sehen.
Ich bin bestimmt kein DAU aber nun auch nicht so fit.

Fatal error: Call to a member function on a non-object in /home/www/web711/html/front_content.php(884) : eval()'d code on line 231

Kann mir noch geholfen werden?

Danke

Verfasst: Do 30. Aug 2007, 13:51
von kummer
die klasse ist am richtigen ort und im modul auch tatsächlich eingebunden?

sollte richtig sein

Verfasst: Do 30. Aug 2007, 14:14
von kenzo
Hallo Kummer,

Die Datei liegt in contenido\classes


cInclude('classes', 'navi.class.php');

Module sind aktiv, zwar nur in einem Template, aber das kann es eigentlich nicht sein.

kenzo

Verfasst: Do 30. Aug 2007, 14:24
von derSteffen
Hallo Andreas,

danke für den Code. Allerdings wirft die Klasse folgende Fehlermeldung raus:
Fatal error: Unsupported operand types in C:\Programme\xampp\htdocs\test\contenido\classes\atelierq.navigation.class.inc.php on line 405
So, nun weiß ich aber auch nicht ob ich den Modul-Output richtig gesetzt habe?!

Ich habe die If-abfragen rausgenommen, ich habe das

Code: Alles auswählen

$tmpOut = $aQnavigation->showNavigation(1); $aQnavigation->setSub(0, $tmpOut);
wieder in das

Code: Alles auswählen

$aQnavigation->setSub(0, $aQnavigation->showNavigation(1));
zurück geändert und ich habe

Code: Alles auswählen

$this->maskActive(1, 'meine Maske');
$this->maskActiveSub(1, 'meine Maske');
so zusätzlich unter der selected-Geschichte eingebunden

Code: Alles auswählen

$aQnavigation->maskActive(0, '<li><a href="{link}" class="aktiv">RED {name1}</a></li>');
$aQnavigation->maskActiveSub(0, '<li><a href="{link}" class="subaktiv">RED {name1}</a></li>{sub}');


Liegt vielleicht hier der Fehler?

Nachtrag:

Wenn ich anstatt

Code: Alles auswählen

$aQnavigation->maskActive(0, '<li><a href="{link}" class="aktiv">RED {name1}</a></li>');
$aQnavigation->maskActiveSub(0, '<li><a href="{link}" class="subaktiv">RED {name1}</a></li>{sub}');

Code: Alles auswählen

$this->maskActive(0, '<li><a href="{link}" class="aktiv">RED {name1}</a></li>');
$this->maskActiveSub(0, '<li><a href="{link}" class="subaktiv">RED {name1}</a></li>{sub}');


Kommt folgende Fehlermeldung:
Fatal error: Using $this when not in object context in C:\Programme\xampp\htdocs\test\cms\front_content.php(1021) : eval()'d code on line 461
MfG

Verfasst: Do 30. Aug 2007, 14:44
von kummer
da gabs ein schreibfehler in der klasse. hier die korrigierte und hoffentlich funktionsfähige version:

Code: Alles auswählen

<?php


/**
 * @author Andreas Kummer
 * @copyright Copyright &copy; 2007 atelierQ
 */

class aQnavigation {

	/**
	 * Konstruktor der Klasse.
	 * @param Integer  Primärschlüssel der Startkategorie.
	 */
	function aQnavigation($startId) {

		global $client, $lang, $idcat, $db;

		$this->startId = $startId;

		$this->client = $client;
		$this->lang = $lang;

		$this->idcat = (isset ($_GET['pretend'])) ? ($_GET['pretend']) : ($idcat);

		$this->before = '';
		$this->beforeEach = '';
		$this->between = '';
		$this->after = '';

		$this->excludeItemsStartingWith = '__';

		$this->db = $db;

		$this->setStartIds();

		$this->getNavigation();
	}

	/**
	 * Auslesen der Navigationsstruktur aus der Datenbank.
	 */
	function getNavigation() {

		global $cfg, $auth;

		if ($this->startId != $this->id[0]) {
			/*
			 * Wenn die StartId nicht identisch ist mit der höchsten Ebene der
			 * aktuell selektierten Kategorie, dann liegt die gewählte Kategorie
			 * folgerichtig ausserhalb des für die Navigation gewählten Baumes.
			 * In diesem Fall ist nur die Hauptnavigation einzublenden.
			 */
			$this->id[0] = $this->startId;
			for ($i = 1; $i <= 3; $i++) {
				$this->id[$i] = -1;
			}
		}

		if ($auth->auth['uid'] == '' || !$this->isNumeric($auth->auth['uid'])) {
			/*
			 * Login nicht erfolgt
			 */
			$user = 0;
		} else {
			/*
			 * Benutzer ist eingeloggt
			 */
			$user = $auth->auth['uid'];
		}

		$this->db->query("" .
		"SELECT DISTINCT " .
		"a.idcat, " .
		"a.parentid, " .
		"a.preid, " .
		"a.postid, " .
		"a.parentid, " .
		"b.name, " .
		"b.idlang, " .
		"IF (b.visible = 1 && (b.public = 1 || c.idfrontendpermission IS NOT NULL), 1, 0) AS visible " .
		"FROM {$cfg['tab']['cat']} AS a " .
		"LEFT JOIN {$cfg['tab']['cat_lang']} AS b ON a.idcat = b.idcat " .
		"LEFT JOIN {$cfg['tab']['frontendpermissions']} AS c ON (c.item = b.idcatlang AND c.idlang = b.idlang AND plugin ='category') " .
		"LEFT JOIN {$cfg['tab']['frontendgroupmembers']} AS d ON c.idfrontendgroup = d.idfrontendgroup " .
		"WHERE " .
		"   a.idclient = {$this->client} " .
		"   AND (" .
		"      a.parentid = {$this->id[0]} " .
		"      OR a.parentid = {$this->id[1]} " .
		"      OR a.parentid = {$this->id[2]} " .
		"      OR a.parentid = {$this->id[3]} " .
		"   ) " .
		"   AND (" .
		"      d.idfrontenduser = {$user} " .
		"      OR d.idfrontenduser IS NULL" .
		"   )" .
		"");

		$this->navigationTree = array ();

		$this->firstId[0] = 0;
		$this->firstId[1] = 0;
		$this->firstId[2] = 0;
		$this->firstId[3] = 0;

		while ($this->db->next_record()) {

			for ($i = 0; $i <= 3; $i++) {
				if (($this->firstId[$i] == 0 && $this->db->f('parentid') == $this->id[$i] && $this->db->f('preid') == 0 && $this->db->f('idlang') == $this->lang) || ($this->firstId[$i] == 0 && $this->db->f('parentid') == $this->id[$i] && $this->db->f('preid') == 0 && $this->db->f('idlang') == null)) {
					$this->firstId[$i] = $this->db->f('idcat');
				}
			}
			/*
			 * Das Einfügen in den Navigationsbaum darf nur erfolgen, wenn noch kein Eintrag existiert
			 * oder - wenn bereits einer existiert - der neue Eintrag der aktuell gewählten Sprache
			 * entspricht.
			 */
			if (!isset ($this->navigationTree[$this->db->f('parentid')][$this->db->f('idcat')]) || $this->db->f('idlang') == $this->lang) {
				$this->navigationTree[$this->db->f('parentid')][$this->db->f('idcat')] = array (
					'preid' => $this->db->f('preid'
				), 'postid' => $this->db->f('postid'), 'visible' => $this->db->f('visible'), 'name' => $this->db->f('name'), 'idlang' => $this->db->f('idlang'));
			}
		}

	}

	/**
	 * Ausgabe der Navigation an die Standardausgabe.
	 * @param String  Navigationstyp
	 */
	function showNavigation($type, $next = -1) {

		static $first;
		static $output = array (
			false,
			false,
			false,
			false,
			false,
			false,
			false
		);

		$returnValue = "";

		if ($next == 0) {
			if ($output[$type]) {
				return $this->after[$type];
			} else {
				return false;
			}
		}

		if ($next == -1) {
			$returnValue .= $this->before[$type];
			$next = $this->firstId[$type];
			$first[$type] = true;
		}

		$parentId = $this->id[$type];

		$link = 'front_content.php?idcat=' . $next;

		if ($this->navigationTree[$parentId][$next]['visible'] == 1 && $this->navigationTree[$parentId][$next]['idlang'] == $this->lang && $this->isVisble($this->navigationTree[$parentId][$next]['name'])) {
			if (!$first[$type]) {
				$returnValue .= $this->between[$type];
			}

			if (strstr($this->navigationTree[$parentId][$next]['name'], '$$$') == true) {
				$name = explode('$$$', $this->navigationTree[$parentId][$next]['name']);
				$name1 = $name[0];
				$name2 = $name[1];
			} else {
				$name1 = $this->navigationTree[$parentId][$next]['name'];
				$name2 = '';
			}

			$sub = (isset ($this->sub[$type])) ? ($this->sub[$type]) : ('');

			if ($this->isActive($next) &! empty($this->maskActive[$type]) &! empty($this->maskActive[$type])) {
				$returnValue .= $this->beforeSelected[$type];
				$returnValue .= str_replace('{sub}', $sub, str_replace('{name2}', $name2, str_replace('{name1}', $name1, str_replace('{link}', $link, ($sub == '') ? ($this->maskActive[$type]) : ($this->maskActiveSub[$type])))));
			} elseif ($this->isSelected($next)) {
				$returnValue .= $this->beforeSelected[$type];
				$returnValue .= str_replace('{sub}', $sub, str_replace('{name2}', $name2, str_replace('{name1}', $name1, str_replace('{link}', $link, ($sub == '') ? ($this->maskSelected[$type]) : ($this->maskSelectedSub[$type])))));
			} else {
				$returnValue .= $this->beforeEach[$type];
				$returnValue .= str_replace('{sub}', $sub, str_replace('{name2}', $name2, str_replace('{name1}', $name1, str_replace('{link}', $link, $this->maskNormal[$type]))));
			}

			$first[$type] = false;
			$output[$type] = true;
		}
		elseif (!$output && $this->navigationTree[$parentId][$next]['postid'] == 0) {
			/*
			 * Die Navigation enthält nichts.
			 */
		}

		return $returnValue . $this->showNavigation($type, $this->navigationTree[$parentId][$next]['postid']);
	}

	function setExcludeStart($start) {
		$this->excludeItemsStartingWith = $start;
	}

	function isVisble($name) {
		if (substr($name, 0, strlen($this->excludeItemsStartingWith)) == $this->excludeItemsStartingWith) {
			return false;
		}
		return true;
	}

	/**
	 * Ausgabe vor der Navigation
	 * @param String  Ausgabe vor der Navigation.
	 */
	function before($level, $text) {
		$this->before[$level] = $text;
	}

	/**
	 * Ausgabe vor jedem Eintrag
	 * @param String  Ausgabe vor jedem Eintrag.
	 */
	function beforeEach($level, $text) {
		$this->beforeEach[$level] = $text;
	}

	/**
	 * Ausgabe vor jedem selektierten Menueintrag
	 * @param String  Ausgabe vor jedem selektierten Menueintrag.
	 */
	function beforeSelected($level, $text) {
		$this->beforeSelected[$level] = $text;
	}

	/**
	 * Ausgabe zwischen zwei Hauptmenupunkten
	 * @param String  Ausgabe zwischen zwei Hauptmenupunkten.
	 */
	function between($level, $text) {
		$this->between[$level] = $text;
	}

	/**
	 * Ausgabe nach der Navigation
	 * @param String  Ausgabe nach der Navigation.
	 */
	function after($level, $text) {
		$this->after[$level] = $text;
	}

	function maskNormal($level, $text) {
		$this->maskNormal[$level] = $text;
	}

	function maskNormalSub($level, $text) {
		$this->maskNormalSub[$level] = $text;
	}

	function maskSelected($level, $text) {
		$this->maskSelected[$level] = $text;
	}

	function maskSelectedSub($level, $text) {
		$this->maskSelectedSub[$level] = $text;
	}

	function maskActive($level, $text) {
		$this->maskActive[$level] = $text;
	}

	function maskActiveSub($level, $text) {
		$this->maskActiveSub[$level] = $text;
	}

	function setSub($level, $content) {
		$this->sub[$level] = $content;
	}

	/**
	 * Gibt das Level der Kategorie zurück.
	 * @param Integer  Primärschlüssel der Kategorie.
	 * @return Integer Level der spezifizierten Kategorie.
	 */
	function getLevel($idcat) {

		global $cfg;

		if (empty ($idcat)) {
			return 0;
		}

		$this->db->query("" .
		"SELECT level FROM {$cfg['tab']['cat_tree']} " .
		"WHERE " .
		"   idcat = $idcat" .
		"");
		if ($this->db->next_record()) {
			return $this->db->f('level');
		} else {
			return 0;
		}
	}

	/**
	 * Gib die Tiefe relativ zum Hauptmenu an.
	 * @param Integer  Primärschlüssel der Kategorie
	 * @return Integer Level relativ zum Hauptmenu
	 */
	function getNetLevel($idcat) {

		return $this->getLevel($idcat) - $this->getLevel($this->startId);
	}

	/**
	 * Ermittlung des jeweils ersten Kategorieeintrages jeder Ebene. Die
	 * Speicherung dieser Daten erfolgt in das Klassenattribut id.
	 */
	function setStartIds() {

		$id = $this->idcat;

		$level = $this->getNetLevel($id);
		$this->id[$level] = $id;

		while ($level > 0) {
			$this->id[$level -1] = $this->getParentId($id);
			$id = $this->id[$level -1];
			$level = $this->getNetLevel($id);
		}

		if (empty ($this->id)) {
			$this->id[0] = $this->startId;
		}
		for ($i = 1; $i <= 3; $i++) {
			if (empty ($this->id[$i])) {
				$this->id[$i] = -1;
			}
		}
		ksort($this->id);
	}

	/**
	 * Ermittlung des Elternelementes der Kategorie mit dem Primärschlüssel
	 * idcat
	 * @param Integer  Primärschlüssel des Kindelementes, dessen Elternelement
	 * ermittelt werden soll.
	 * @return Integer Primärschlüssel des Elternelementes.
	 */
	function getParentId($idcat) {

		global $cfg;

		$this->db->query("" .
		"SELECT parentid FROM {$cfg['tab']['cat']} " .
		"WHERE " .
		"   idcat = $idcat " .
		"");
		if ($this->db->next_record()) {
			return $this->db->f('parentid');
		} else {
			return 0;
		}
	}

	/**
	 * Anzeige, ob eine Navigationsebene Elemente enthält oder nicht.
	 * @param Integer  Navigationsstufe.
	 * @return Boolean True, wenn die Navigationsstufe leer ist (keine Elemente
	 * enhält). Sonst false.
	 */
	function navigationEmpty($level) {

		if ($this->firstId[$level] == 0) {
			return true;
		}

		return false;
	}

	/**
	 * Anzeige, ob eine Kategorie selektiert ist oder nicht. Eine Kategorie gilt
	 * als selektiert, wenn sie die aktuelle Kategorie ist oder ein direktes
	 * oder indirektes Elternelement der aktuellen Kategorie.
	 * @param Integer  Primärschlüssel der Kategorie, deren Status gefragt ist.
	 * @return Boolean True, wenn die gefragte Kategorie mit der aktuellen
	 * Kategorie übereinstimmt oder ein direktes oder indirektes Elternelement
	 * der aktuellen Kategorie darstellt.
	 */
	function isSelected($idcat) {

		return in_array($idcat, $this->id);
	}

	/**
	 * Anzeige, ob es sich bei der Kategorie um die aktive Kategorie handelt oder nicht.
	 * @param Integer Primärschlüssel der Kategorie, deren Status gefragt ist.
	 * @return Boolean True, wenn die gefragte Kategorie aktiv ist.
	 */
	function isActive($idcat) {

		return $idcat == $this->id;
	}

	function isNumeric($parameter) {
		return !preg_match("/[^0-9]/", $parameter);
	}
}
?>

Verfasst: Do 30. Aug 2007, 15:12
von derSteffen
Also eine Fehlermeldung wird nicht mehr ausgeworfen!

Allerdings führt der folgende Modul-Output nicht zum gewünschten Ergebnis. Das Modul arbeitet wie gewohnt gut. Offene Kategoriepunkte werden, bei mir, als fett dargestellt, nur der aktive Punkt besitzt nicht den Zusatz "RED"

Hier nochmal mein aktueller Modul-Output.

Code: Alles auswählen


<?php

cInclude('classes', 'atelierq.navigation.class.inc.php');

$cApiClient = new cApiClient($client);
$aQnavigation = new aQnavigation($cApiClient->getProperty('navigation', 'idcat_hauptnavigation'));

/*
 * Ausgabe 3. Stufe
 */
$aQnavigation->before(2, '');
$aQnavigation->after(2, ''); 
$aQnavigation->between(2, '');
$aQnavigation->maskNormal(2, '<li><a href="{link}" class="subsubsub">{name1}</a></li>');
$aQnavigation->maskNormalSub(2, '<li><a href="{link}" class="subsubsubsub">{name1}</a></li>{sub}');
$aQnavigation->maskSelected(2, '<li><a href="{link}" class="subsubsubaktiv">{name1}</a></li>');
$aQnavigation->maskSelectedSub(2, '<li><a href="{link}" class="subsubsubsubaktiv">{name1}</a></li>');
$aQnavigation->maskActive(2, '<li><a href="{link}" class="subsubaktiv">RED {name1}</a></li>');

/*
 * Ausgabe 2. Stufe
 */
$aQnavigation->before(1, '');
$aQnavigation->after(1, ''); 
$aQnavigation->between(1, '');
$aQnavigation->maskNormal(1, '<li><a href="{link}" class="subsub">{name1}</a></li>');
$aQnavigation->maskNormalSub(1, '<li><a href="{link}" class="subsubsub">{name1}</a></li>{sub}');
$aQnavigation->maskSelected(1, '<li><a href="{link}" class="subsubaktiv">{name1}</a></li>');
$aQnavigation->maskSelectedSub(1, '<li><a href="{link}" class="subsubaktiv">{name1}</a></li>{sub}');
$aQnavigation->maskActive(1, '<li><a href="{link}" class="subsubaktiv">RED {name1}</a></li>');
$aQnavigation->maskActiveSub(1, '<li><a href="{link}" class="subsubaktiv">RED {name1}</a></li>{sub}');
$aQnavigation->setSub(1, $aQnavigation->showNavigation(2));

/*
 * Ausgabe 1. Stufe
 */
$aQnavigation->before(0, '');
$aQnavigation->after(0, ''); 
$aQnavigation->between(0, '');
$aQnavigation->maskNormal(0, '<li><a href="{link}">{name1}</a></li>');
$aQnavigation->maskNormalSub(0, '<li><a href="{link}" class="sub">{name1}</a></li>{sub}');
$aQnavigation->maskSelected(0, '<li><a href="{link}" class="aktiv">{name1}</a></li>');
$aQnavigation->maskSelectedSub(0, '<li><a href="{link}" class="subaktiv">{name1}</a></li>{sub}');
$aQnavigation->maskActive(0, '<li><a href="{link}" class="aktiv">RED {name1}</a></li>');
$aQnavigation->maskActiveSub(0, '<li><a href="{link}" class="subaktiv">RED {name1}</a></li>{sub}');
$aQnavigation->setSub(0, $aQnavigation->showNavigation(1));

/*
 * hier erfolgt die ausgabe an den browser
 */
echo $aQnavigation->showNavigation(0);
?>

Habe ich die "maskActive" Punkte so richtig eingebunden? Oder habe ich was falsch gemacht?

Danke Dir!

Verfasst: Do 30. Aug 2007, 15:20
von kummer
kann man sich das ganze irgendwo anschauen?