Seite 1 von 1

Erweiterung eines Navigationsmoduls

Verfasst: Di 5. Aug 2008, 08:51
von Jamest
Hallo zusammen,

ich nutze das splitted navigation Modul von kummer. Ich möchte dieses Modul gern erweitern, so das man die Weiterleitungsfunktion bei einem Artikel benutzen kann. Und zwar insofern, das wenn man den Haken bei "Neues Fenster" in den Artikeleigenschaften setzt, auch der jeweilige Artikel in einem neuen Fenster geöffnet wird.

Im Moment ist das Target im Modul direkt auf "self" gesetzt. Das muss man doch auch dynamisch aus den Artikeleigenschaften lesen können, und anhand der Einstellung von self auf blank ändern können.

Hat jemand Ideen dazu, oder kann mir vielleicht Codebeispiele aus anderen Modulen posten, so das ich versuchen kann dies in das Modul von kummer zu integrieren?

Grüße

Jamest

Verfasst: Di 5. Aug 2008, 10:29
von tono

Verfasst: Di 5. Aug 2008, 14:05
von Jamest
Ja, die Threads kenne ich, haben mich aber kaum weitergebracht.

Verfasst: Mi 6. Aug 2008, 08:45
von tono
Die Einstellung "neues Fenster" wird in der Tabelle con_art_lang in der Spalte external_redirect abgespeichert. Je nachdem, wie Dein Navigationsmodul funktioniert musste Du diese Spalte mit in die SQL-Anweisung aufnahmen, bzw. aus dem article_language-Objekt abfragen und entsprechend traget="_black" zum Link hinzufügen.

Code: Alles auswählen

$sql = "SELECT .... , `con_art_lang`.`external_redirect` AS blank ......";
.....
.....
.....
if ($db->f('blank')==1) {
    $tpl->set ('d','TARGET','target="_blank"');
} else {
    $tpl->set ('d','TARGET','');
}
....
....
so in der Art.

Verfasst: Mi 6. Aug 2008, 09:29
von Jamest
Hi Tono,

ich benutze die navi von kummer, welche wie folgt aussieht. Also müsste ich einfach nur ganz am Anfang ne Abfrage machen, die mir die Info gibt, und dann kann ich mir $target passend in blank oder self ausgeben lassen, richtig? :-)

Code: Alles auswählen

<?php

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

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

$aQnavigation->between(3, '');
$aQnavigation->maskNormal(3, '<li class="layer3"><a href="{link}" target="_self" onfocus="this.blur()">{name1}</a></li>');
$aQnavigation->maskSelected(3, '<li class="layer3"><a href="{link}" target="_self" onfocus="this.blur()" class="selected">{name1}</a></li>');
$aQnavigation->maskSelectedSub(3, '<li class="layer3"><a href="{link}" target="_self" onfocus="this.blur()" class="selected">{name1}</a></li>{sub}');

$aQnavigation->between(2, '');
$aQnavigation->maskNormal(2, '<li class="layer2"><a href="{link}" target="_self" onfocus="this.blur()">{name1}</a></li>');
$aQnavigation->maskSelected(2, '<li class="layer2"><a href="{link}" target="_self" onfocus="this.blur()" class="selected">{name1}</a></li>');
$aQnavigation->maskSelectedSub(2, '<li class="layer2"><a href="{link}" target="_self" onfocus="this.blur()" class="selected">{name1}</a></li>{sub}');
$aQnavigation->setSub(2, $aQnavigation->showNavigation(3));

$aQnavigation->between(1, '');
$aQnavigation->maskNormal(1, '<li><a href="{link}" target="_self" onfocus="this.blur()">{name1}</a></li>');
$aQnavigation->maskSelected(1, '<li><a href="{link}" target="_self" onfocus="this.blur()" class="selected">{name1}</a></li>');
$aQnavigation->maskSelectedSub(1, '<li><a href="{link}" target="_self" onfocus="this.blur()" class="selected">{name1}</a></li>{sub}');
$aQnavigation->setSub(1, $aQnavigation->showNavigation(2));

echo $aQnavigation->showNavigation(1);

?>

Verfasst: Mi 6. Aug 2008, 09:44
von Jamest
Ich muss ja bei der Abfrage ne WHERE Abfrage machen, um genau den richtigen Artikel zu erwischen, wie mache ich das denn? Woher bekomme ich diese Infos, gibts da irgendwelche Globalen Variablen in denen idartlang idart idlang etc vom aktuellen artikel schon enthalten sind? Welche ich mir dann an der Stelle zunutze machen könnte?

Danke schonmal für die Tipps.

Jamest

Verfasst: Mi 6. Aug 2008, 10:28
von tono
Ich wusste nicht was für ein Modul du benutzt. Du fragtest nach einem Beispielcode, den hab ich Dir geschrieben. In diesem Modul macht aber der Einsatz von SQL-Abfragen keinen Sinn.

Was ich interessant finde, ist, dass target in Deinem Code schon gesetzt wird. Ich hab nur leider keinen Ahnung von dem Modul, bzw. der verwendeten Klasse. Warum fragst Du nicht in dem Thread aus dem das Modul stammt? Na, ja, mal schauen ob Kummer was weiß.

Verfasst: Mi 6. Aug 2008, 11:38
von Jamest
Das target hab ich an der Stelle eingebaut, weil ich es bereits auf einem anderen Wege versucht hatte. :-) Also vorher stand da einfach nur

Code: Alles auswählen

<a href="{link}" target="_self" onfocus="this.blur()">{name1}</a>
Ich denke das SQL statement das du als Tipp gepostet hast, muss ich schon in der Klasse von kummer anwenden. Ich poste Sie mal hier:

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->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 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);
	}

	function isNumeric($parameter) {
		return !preg_match("/[^0-9]/", $parameter);
	}
	
}
Ich habe mit kummer schon gesprochen, das wäre eine etwas aufwendigere Anpassung, von daher hoffe ich das ich mit der Community zu nem guten Ergebnis komme.

Die geteilte Navigation um die es hier geht von Kummer ist perfekt und hat mir immer gute dienste geleistet, von daher wäre die Anpassung das optimum. :-)

Verfasst: Mi 6. Aug 2008, 15:04
von tono
Äh, wenn ich das richtig überfliege, dann gibt die Navi aber nur Kategorien raus, und keine Artikel. Deshalb kann man da auch nicht mal so schnell auf die Einstellungen eines Artikels zurückgreifen.

Tut mir leid, ich muss kummer recht geben.

Verfasst: Do 7. Aug 2008, 09:32
von Jamest
Hmm, das hab ich mir schon irgendwie gedacht. :-)

Wäre zwar etwas umständlich, aber könnte ich denn nicht, da ich die Kategorien genau kenne, irgendwo in dem Script die ID's definieren, und wenn die ID beim erstellen des Baums eine der definierten ist, wird automatisch das passende target ausgegeben?

Ist zwar jetzt nicht so schön, das so in der klasse zu machen, würde mir aber schon gut weiterhelfen.

Danke für deine Zeit tono.

Grüße

Jamest

Verfasst: Do 7. Aug 2008, 14:57
von tono
Ja, so gehts auch.

Bitte, bitte.

Verfasst: So 10. Aug 2008, 09:28
von Supporter
Wenn die Navigation aus dem Beispielmandanten Deine Anforderungen erfüllt, suche mal nach dem von OSI und mir angepassten Splitted Navigation Modul für die 4.6er. Die ist kompatibel mit der 4.8er und vielleicht klappt es ja dann.

Verfasst: Mo 11. Aug 2008, 11:06
von Jamest
Danke, ich werde es mal ausprobieren. :-)

Bin leider mit der Anpassung noch nicht weitergekommen, alles was ich versuche führt in eine Sackgasse...