Modul :: NavigationUniversell

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Di 28. Aug 2007, 09:48

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:
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

_Marc
Beiträge: 76
Registriert: Di 12. Sep 2006, 11:38
Kontaktdaten:

Beitrag von _Marc » Di 28. Aug 2007, 19:13

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

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Mi 29. Aug 2007, 06:58

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

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Mi 29. Aug 2007, 08:03

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?
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Mi 29. Aug 2007, 10:02

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.

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Mi 29. Aug 2007, 10:23

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.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Mi 29. Aug 2007, 10:27

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

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Mi 29. Aug 2007, 10:48

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
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

kenzo
Beiträge: 112
Registriert: Di 8. Jul 2003, 19:46
Kontaktdaten:

Ich bekomme das nicht hin

Beitrag von kenzo » Do 30. Aug 2007, 13:25

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

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Do 30. Aug 2007, 13:51

die klasse ist am richtigen ort und im modul auch tatsächlich eingebunden?
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

kenzo
Beiträge: 112
Registriert: Di 8. Jul 2003, 19:46
Kontaktdaten:

sollte richtig sein

Beitrag von kenzo » Do 30. Aug 2007, 14:14

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

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Do 30. Aug 2007, 14:24

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

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Do 30. Aug 2007, 14:44

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);
	}
}
?>
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

derSteffen
Beiträge: 847
Registriert: Mi 14. Dez 2005, 16:15
Wohnort: Königs Wusterhausen bei Berlin
Kontaktdaten:

Beitrag von derSteffen » Do 30. Aug 2007, 15:12

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!

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Beitrag von kummer » Do 30. Aug 2007, 15:20

kann man sich das ganze irgendwo anschauen?
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

Gesperrt