Erweiterung eines Navigationsmoduls
Erweiterung eines Navigationsmoduls
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
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
Eine Suche nach target _blank liefert:
http://forum.contenido.org/viewtopic.php?t=21992
http://forum.contenido.org/viewtopic.php?t=20822
http://forum.contenido.org/viewtopic.php?t=21891
http://forum.contenido.org/viewtopic.php?t=21837
http://forum.contenido.org/viewtopic.php?t=19279
Ist da gar nichts für Dich dabei??
http://forum.contenido.org/viewtopic.php?t=21992
http://forum.contenido.org/viewtopic.php?t=20822
http://forum.contenido.org/viewtopic.php?t=21891
http://forum.contenido.org/viewtopic.php?t=21837
http://forum.contenido.org/viewtopic.php?t=19279
Ist da gar nichts für Dich dabei??
Bis dann
Tono
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.
so in der Art.
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','');
}
....
....
Bis dann
Tono
Tono
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?
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);
?>
Zuletzt geändert von Jamest am Mi 6. Aug 2008, 11:40, insgesamt 1-mal geändert.
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
Danke schonmal für die Tipps.
Jamest
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ß.
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ß.
Bis dann
Tono
Tono
Das target hab ich an der Stelle eingebaut, weil ich es bereits auf einem anderen Wege versucht hatte.
Also vorher stand da einfach nur
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:
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.

Code: Alles auswählen
<a href="{link}" target="_self" onfocus="this.blur()">{name1}</a>
Code: Alles auswählen
<?php
/**
* @author Andreas Kummer
* @copyright Copyright © 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);
}
}
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.

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

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