Guten Morgen liebe Community ( im wahrsten Sinne des Wortes *g* 2 Uhr
)
ich habe so eben eine neue Version meines Navigations Modules fertiggestellt.
SN_NavMod v0.4 alpha ist fertig
Hier eine grobe auflistung der Neuerungen:
- 5 Einstellungsmöglichkeiten für die Steuerung der Linkerstellung im Frontend
* Begin
* Vor Link
* Nach Link
* Trennzeichen
* Ende
Im Prinzip ist das Modul vom Grund her eine Horizintale Navigationsleiste, aber durch verwendung vom Html-Tag <BR> im Trennzeichen-Feld kann daraus auch eine Vertikale Leiste werden.
- Ja/Nein Box ob eine Überprüfung auf Highlighting des aktuellen Punktes durchgeführt werden soll oder nicht. Dabei wird auch der Wunsch eines Community members berücksichtigt, falls die aktuelle IDCAT ein Kind ( Child ) im CatTree zur angegebenen Anzeige Kategorie ist.
Desweiteren können nun im BackEnd zwei CSS-Klassen eingestellt werden, die für die Linkgenerierung mitverwendet werden. LinkCSS wird immer für den normalen Link verwendet, Wenn CheckForHighlight aktiviert, dementsprechend die LinkHLCSS für den Hervorgehobenen Link.
Die BackCat Angabe ist immer noch enthalten, so wie in den vorangegangenen Modulversionen auch.
Angemerkt sei nur, das ich auf Grund von Zeitproblemen für die CheckChild FUnktionalität keine umfangreichende Tests durchführen konnte. Hoffe es funktioniert wie angedacht, zumindestens läßt sich das Modul ohne Probleme in meinem 4.5 Snapshot installation einwandfrei einfügen.
Hier nun der Code der aktuellen Version:
SN_NavMod - DESCRIPTION
Code: Alles auswählen
/***********************************************
* CONTENIDO MODUL
*
* Modulname : SN_NavMod
* Modulversion : 0.4 alpha
* Author : Stefan Bürk
* Kontakt : Email: webmaster@skyblader.org
* Copyright : SkyBlader Networxx, Stefan Bürk
* C-Version : 4.4
* Created : 09-03-2004
* Modified : 21-09-2004
*
* Beschreibung :
*
* Navigationsstruktur für Untermenüs mit 1 Navigationsebene,
* Ausgabe ist im Output Modul über Variabeln steuerbar.
*
************************************************/
21.09.2004
==========
OUT Implementierung von zwei Funktionen, um für den Highlight Teil die
Überprüfung, ob ein Entry hervorgehoben werden darf, auch bei Kinder
ebene innerhalb des Kategoriebaumes sicherzustellen.
Desweiteren wurde die im Inputteil als Konfigurierbar bereitgestellten
Variabeln für die CSS-Klassenauswahl für Link und LinkHervorgehoben
in der Routine nun berücksichtig.
IN Auswahlschalter für HighlightingsÜberprüfung unter Berücksichtigung
von CHILD-Ids implementiert => cfg_check_parequal
IN Konfiguration zur Konfigurierung für die CSS-Klasse für NavLink und
NavLink Hervorgehoben (Aktuelle Category)
20.09.2004
==========
IN Implementierung von weiteren Konfigurationsmöglichkeiten für
- VorLink
- NachLink
- LinkTrennzeichen
- Anfang
- Ende
bei einem Aufbau der Linksammlungen für das dynamische Menü im
folgenden Format:
ANFANG + [ VorLink + {LINK} + NachLink ] + LinkTrennzeichen + [ VorLink + {LINK} + NachLink ] ..... + Ende
OUT Anpassen der Ausgabeerstellungsroutingen, um die neue Konfigurierbarkeit in den
Routinen zu berücksichtigen.
17.09.2004
==========
OUT Erweiterung um weitere Konfigurationsvariablen für die Ausgabensteuerung,
um eine weitere modularisierung zu bewerkstelligen.
Dazu wurden unter anderem auch drei kleine Bugs entfernt, die vorher nicht
aufgefallen sind, und erst durch die modularisierung zum tragen kamen.
30.06.2004
==========
out Manuelle sortierung der CatIds auf Grund der PREID, da dies durch
eine SQL Anweisung nicht zu bewerkstelligen ist.
--> siehe http://www.contenido.de/forum/viewtopic.php?t=4576
in Font und Select auf BackEnd CSS Klassen vom umgestellt.
19.03.2004
==========
out DB-Abfrage 2 ( $sql ) lesbar für Otto-Normal-Verbraucher formatiert
17.03.2004
==========
out Securitychecks implementiert um Injections zu unterbinden
- lokale Modul-Variablen initalizieren um Injects zu unterbinden
- Parametervariabeln gegen SQL-Injection-Versuche untersuchen
SN_NavMod - INPUT
Code: Alles auswählen
/***********************************************
* INPUT
************************************************/
// selected category
$selected = "CMS_VALUE[3200]";
$selected_var = "CMS_VAR[3200]";
$selected2 = "CMS_VALUE[3201]";
$selected2_var = "CMS_VAR[3201]";
// cfg_prelink
$cfg_prelink = "CMS_VALUE[3202]";
$cfg_prelink_var = "CMS_VAR[3202]";
if ( $cfg_prelink == "" || $cfg_prelink == "0" )
{
$cfg_prelink = ":: ";
}
$cfg_postlink = "CMS_VALUE[3203]";
$cfg_postlink_var = "CMS_VAR[3203]";
$cfg_linkdiv = "CMS_VALUE[3204]";
$cfg_linkdiv_var = "CMS_VAR[3204]";
if ( $cfg_linkdiv == "" || $cfg_linkdiv == "0" )
{
$cfg_linkdiv = "<br>";
}
$cfg_pre_str = "CMS_VALUE[3205]";
$cfg_pre_str_var = "CMS_VAR[3205]";
$cfg_post_str = "CMS_VALUE[3206]";
$cfg_post_str_var = "CMS_VAR[3206]";
$cfg_check_parequal = "CMS_VALUE[3207]";
$cfg_check_parequal_var = "CMS_VAR[3207]";
$cfg_css_link = "CMS_VALUE[3208]";
$cfg_css_link_var = "CMS_VAR[3208]";
if ( $cfg_css_link == "" || $cfg_css_link == "0" )
{
$cfg_css_link = "navlink";
}
$cfg_css_linkhl = "CMS_VALUE[3209]";
$cfg_css_linkhl_var = "CMS_VAR[3209]";
if ( $cfg_css_linkhl == "" || $cfg_css_linkhl == "0" )
{
$cfg_css_linkhl = "navlink_highlighted";
}
echo "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\">
<tr valign=\"top\">
<td class=\"text_medium\">Kategorie wählen, deren Unterkategorien<br> angezeigt werden sollen:</td>
<td class=\"text_medium\">
<select class=\"text_medium\" name=\"".$selected_var."\">";
if($selected!="0" && $selected!=""){
echo"<option value=\"0\">--- kein ---</option>";
}else{
echo"<option selected=\"selected\" value=\"0\">--- kein ---</option>";
}
// fetch all categorys
$query = " SELECT
A.idcat,
A.level,
C.name
FROM ".$cfg["tab"]["cat_tree"]." AS A,
".$cfg["tab"]["cat"]. " AS B,
".$cfg["tab"]["cat_lang"]." AS C
WHERE
A.idcat=B.idcat
AND B.idcat=C.idcat
AND C.idlang='$lang'
AND B.idclient='$client'
AND C.visible=1 ORDER BY A.idtree";
// execute query
$db->query($query);
// loop result and build the options
while ($db->next_record()) {
// indent spacer
$spaces = "|";
// how many levels
$levels = $db->f("level");
for ($i = 0; $i < $levels; $i ++) {
// add 2 spaces for every level
$spaces = $spaces . "--";
} // end for
$spaces .= ">";
if ($selected == $db->f("idcat")) {
// selected category
echo "<option selected=\"selected\" value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";
} else {
// category
echo "<option value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";
} // end if
} // end while
echo " </select>";
echo " </td>
</tr>
<tr valign=\"top\">
<td class=\"text_medium\">Zurückkategorie wählen:</td>
<td class=\"text_medium\">
<select class=\"text_medium\" name=\"".$selected2_var."\">";
if($selected2!="0" && $selected2!=""){
echo"<option value=\"0\">--- kein ---</option>";
}else{
echo"<option selected=\"selected\" value=\"0\">--- kein ---</option>";
}
// fetch all categorys
$query = " SELECT
A.idcat,
A.level,
C.name
FROM ".$cfg["tab"]["cat_tree"]." AS A,
".$cfg["tab"]["cat"]. " AS B,
".$cfg["tab"]["cat_lang"]." AS C
WHERE
A.idcat=B.idcat
AND B.idcat=C.idcat
AND C.idlang='$lang'
AND B.idclient='$client'
AND C.visible=1 ORDER BY A.idtree";
// execute query
$db->query($query);
// loop result and build the options
while ($db->next_record()) {
// indent spacer
$spaces = "|";
// how many levels
$levels = $db->f("level");
for ($i = 0; $i < $levels; $i ++) {
// add 2 spaces for every level
$spaces = $spaces . "--";
} // end for
$spaces .= ">";
if ($selected2 == $db->f("idcat")) {
// selected category
echo "<option selected=\"selected\" value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";
} else {
// category
echo "<option value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";
} // end if
} // end while
echo " </select>";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** cfg_prelink
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%CFG_PRELINK%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" name=\"".$cfg_prelink_var."\" value=\"".$cfg_prelink."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_prelink
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_postlink
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%CFG_POSTLINK%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" name=\"".$cfg_postlink_var."\" value=\"".$cfg_postlink."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_postlink
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_linkdiv
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%CFG_LINKDIV%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" name=\"".$cfg_linkdiv_var."\" value=\"".$cfg_linkdiv."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_linkdiv
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_pre_str
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%CFG_PRE_STR%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" name=\"".$cfg_pre_str_var."\" value=\"".$cfg_pre_str."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_pre_str
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_post_str
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%CFG_POST_STR%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" name=\"".$cfg_post_str_var."\" value=\"".$cfg_post_str."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_post_str
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_check_parequal
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%cfg_check_parequal%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" type=\"checkbox\" name=\"".$cfg_check_parequal_var."\" value=\"0\"";
if ( $cfg_check_parequal == 1 )
{
echo " checked=checked";
}
echo ">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_check_parequal
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_css_link
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%cfg_css_link%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" type=\"text\" name=\"".$cfg_css_link_var."\" value=\"".$cfg_css_link."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_css_link
// *********************************************************************************************************
// *********************************************************************************************************
// *** cfg_css_linkhl
// *********************************************************************************************************
echo " <tr valign=\"top\">
<td class=\"text_medium\">%cfg_css_linkhl%:</td>
<td class=\"text_medium\">";
echo " <input class=\"text_medium\" type=\"text\" name=\"".$cfg_css_linkhl_var."\" value=\"".$cfg_css_linkhl."\">";
echo " </td>
</tr>";
// *********************************************************************************************************
// *** end cfg_css_linkhl
// *********************************************************************************************************
echo "</table>";
SN_NavBox - OUTPUT
Code: Alles auswählen
<?php
/***********************************************
* OUTPUT
************************************************/
include_once($cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php");
// ****************************************************************************************************
// SECURITY-CHECKS
// ****************************************************************************************************
// SQL-Injection Überprüfungen und Work-Arounds
// lokale Variabeln initialisieren um Injections zu unterbinden
$db2 = "";
$catStart = "";
$catPrev = "";
$sTmpStr = "";
$db2_sql = "";
$catIds = "";
$key = "";
$val = "";
$sql = "";
// ****************************************************************************************************
// erstelle eine zweite DB-Klasseninstanz, da wir hier
// mit zwei Abfragen udn Resultsets arbeiten müssen
$db2 = new DB_Contenido;
/*
$eckkla_auf = ':: ';
$eckkla_zu = '';
$eckkla_trenn = '<br>';
$strBEGIN = '';
$strEND = '';
*/
// Hole aus der Artikeldefinition die Ausgewählte Einstellungen
$catStart = "CMS_VALUE[3200]";
$catPrev = "CMS_VALUE[3201]";
$eckkla_auf = "CMS_VALUE[3202]";
$eckkla_zu = "CMS_VALUE[3203]";
$eckkla_trenn = "CMS_VALUE[3204]";
$strBEGIN = "CMS_VALUE[3205]";
$strEND = "CMS_VALUE[3206]";
$cfg_chkchildid = "CMS_VALUE[3207]";
$cfg_css_link = "CMS_VALUE[3208]";
$cfg_css_linkhl = "CMS_VALUE[3209]";
// * get catPrec Category and output CatName as [ BackTo ] nav item
if ($catStart != "") {
$sTmpStr = "";
// Datenbankabfrage ( SQL QUERY ) aufbauen
$sql = " SELECT
CAT.idcat AS idcat,
name
FROM
".$cfg["tab"]["cat"]." AS CAT,
".$cfg["tab"]["cat_lang"]." AS CATLANG
WHERE CAT.idcat = ".$catPrev."
AND CAT.idcat = CATLANG.idcat
AND CATLANG.idlang = '$lang'
AND CATLANG.visible = '1'";
// Datenbankabfrage durchführen
$db->query($sql);
// die einzelnen Recordsets der Datenbankabfrage durchgehen
while ( $db->next_record() ) {
// überprüfung, ob schon ein Eintrag in der Ausgabevariabel ist
if ( strlen($sTmpStr) == 0 ) {
// ... Nein, dann die Formatierung für den ersten Eintrag verwenden
// und den Eintrag der Ausgabevariabel hinzufügen
$sTmpStr = $sTmpStr . $strBEGIN . $eckkla_auf . '<a class="'.$cfg_css_link.'" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a>' . $eckkla_zu;
}
else
{
// ... Ja, dann die Formatierung für die weiteren Einträge verwenden und
// den Eintrag der Ausgabevariabel hinzufügen
$sTmpStr = $sTmpStr . $eckkla_trenn . $eckkla_auf . '<a class="'.$cfg_css_link.'" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a>' . $eckkla_zu;
} // end if
} // end while
$db2_sql = " SELECT
*
FROM ". $cfg["tab"]["cat"] ." AS A
WHERE
A.parentid = ". $catStart . "
ORDER BY A.preid
";
// Abfrage ausführen
$db2->query($db2_sql);
// Ermittlung aller Kategorie IDs der ausgesuchten
// Navigationsebene und speicherug in einem Array
while ( $db2->next_record() ) {
// $catIds[] = $db2->f("idcat");
$test_1[$db2->f("preid")] = $db2->f("idcat");
}
/*
PREID => IDCAT ( $test_1 )
Array (
[0] => 50
[26] => 27
[27] => 28
[28] => 29
[29] => 30
[30] => 31
[31] => 32
[32] => 33
[33] => 38
[34] => 35
[35] => 36
[36] => 37
[38] => 34
[50] => 26
)
------------------------------------
*/
// ---------------------------------------------
// sort ids
$ar_anz = count($test_1);
$lpre = 0;
$test_3 = "";
$ires = "";
for ( $sli = 1 ; $sli <= $ar_anz ; $sli++ )
{
$ires = $test_1[$lpre];
$test_3[] = $test_1[$lpre];
$lpre = $ires;
}
// print_r($test_3); echo '<br><br>';
$catIds = $test_3;
// ---------------------------------------------
// Überprüfung ob $catIds wirklich ein Array ist
if ( is_array($catIds) ) {
// die einzelnen IDs durchgegen
foreach($catIds as $key=>$val) {
// Datenbankabfrage ( SQL QUERY ) aufbauen
$sql = " SELECT
CAT.idcat AS idcat,
name
FROM
".$cfg["tab"]["cat"]." AS CAT,
".$cfg["tab"]["cat_lang"]." AS CATLANG
WHERE CAT.idcat = ".$val."
AND CAT.idcat = CATLANG.idcat
AND CATLANG.idlang = '$lang'
AND CATLANG.visible = '1'";
// Datenbankabfrage durchführen
$db->query($sql);
// die einzelnen Recordsets der Datenbankabfrage durchgehen
while ( $db->next_record() ) {
if ( $cfg_chkchildid && sn_check_if_child ( $idcat, $catStart ))
{
// überprüfung, ob schon ein Eintrag in der Ausgabevariabel ist
if ( strlen($sTmpStr) == 0 ) {
// ... Nein, dann die Formatierung für den ersten Eintrag verwenden
// und den Eintrag der Ausgabevariabel hinzufügen
$sTmpStr = $sTmpStr . $strBEGIN . $eckkla_auf . '<a class="'.$cfg_css_linkhl.'" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a>' . $eckkla_zu;
}
else
{
// ... Ja, dann die Formatierung für die weiteren Einträge verwenden und
// den Eintrag der Ausgabevariabel hinzufügen
$sTmpStr = $sTmpStr . $eckkla_trenn . $eckkla_auf . '<a class="'.$cfg_css_linkhl.'" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a>' . $eckkla_zu;
} // end if
}
else
{
// überprüfung, ob schon ein Eintrag in der Ausgabevariabel ist
if ( strlen($sTmpStr) == 0 ) {
// ... Nein, dann die Formatierung für den ersten Eintrag verwenden
// und den Eintrag der Ausgabevariabel hinzufügen
$sTmpStr = $sTmpStr . $strBEGIN . $eckkla_auf . '<a class="'.$cfg_css_link.'" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a>' . $eckkla_zu;
}
else
{
// ... Ja, dann die Formatierung für die weiteren Einträge verwenden und
// den Eintrag der Ausgabevariabel hinzufügen
$sTmpStr = $sTmpStr . $eckkla_trenn . $eckkla_auf . '<a class="'.$cfg_css_link.'" href="front_content.php?idcat='.$db->f("idcat").'">'.$db->f("name").'</a>' . $eckkla_zu;
} // end if
}
} // end while
} // end foreach
// END Zeichen $strEND anfügen
$sTmpStr = $sTmpStr . $strEND;
// Ausgabevariabel schreiben, da nun alle Einträge behandelt wurden.
echo $sTmpStr;
} // end if (is_array)
}
function sn_check_if_child ( $l_idcat, $l_paridcat )
{
$bResult = false;
$l_int = $l_idcat;
while ( $l_int != 0 && $l_int != $l_paridcat )
{
$l_int = get_parentid_from_idcat ( $l_int );
if ( $l_int == $l_paridcat )
{
$bResult = true;
} // end if
} // end while
return $bResult;
} // check_if_child
function get_parentid_from_idcat ( $l_idcat )
{
$ldb = new DB_Contenido;
$lsql= "SELECT *
FROM ".$cfg["tab"]["cat"]." AS CAT,
".$cfg["tab"]["cat_lang"]." AS CATLANG
WHERE CAT.idcat = ".$l_idcat."
AND CAT.idcat = CATLANG.idcat
AND CATLANG.idlang = '$lang'
AND CATLANG.visible = '1'";
$ldb->query($lsql);
while ( $ldb->next_record() )
{
$l_parid = $ldb->f("parentid");
}
return $l_parid;
} // end function get_parentid_from_idcat
?>
Demnächst werde ich wohl ein NavModul freigebem, das an dieses angelehnt ist, aber nicht auf Kategorien sondern auf die Artikel einer Kategorie ausgelegt sein ( -> Artikel Navigations Modul )
So, viel spaß beim Testen und Einsetzen des Moduls.
Hinweis: Verwendung auf eigene Gefahr ! Vor dem Verwenden am besten Sicherungen von euerer DB und Modulen anlegen.
Mfg
Stefan