NAVIGATION
This is an old revision of the document!
A horizontal navigation using a drop-down mechanism. No JS in use!
A modified navigation of O.G.s O.G.s {NAVI}. (Very impressive). I say, this is the navigation you should prefer instead of the NAV_LIST_UL:HCSS.
The original edition from Stu Nicholls you will find here:
A simple six level drop-down menu with overlap and overrun → Please respect the Copyright
{NAV_HORIZ_DD:ID,Level depth} (NAVi HORIZontal Drop Down) V1.0 28.04.08
Docu: –
Forum: http://forum.phpwcms.org/viewtopic.php?t=16080
Author: K.Heermann (flip-flop) http://planmatrix.de (05.05.09)
CMS-Version: >= V1.2.8
Version: V1.0 28.04.08
Update Version: V1.01 04.09.2010
- The link “Home” can either be presented (In the PHP script on/off).
Condition: → /config/phpwcms/conf.inc.php
Features:
{NAV_HORIZ_DD:ID,Level depth} → e.g. Output beginning at level 0 (home/root) with level depht limitation of 2.
<div id="menu_container">{NAV_HORIZ_DD:0,2}</div>
Given structure in this example:
- root (index.php ID=0) --- Home --- Ebene01 --- Ebene02 --- Ebene03 --- Ebene04 --- Ebene05
V1.0:
V1.01:
—————————————————————- obligate check for phpwcms constants if (!defined('PHPWCMS_ROOT')) {
die("You Cannot Access This Script Directly, Have a Nice Day.");
} —————————————————————- if( ! ( strpos($content[“all”],'{NAV_HORIZ_DD')==false ) ) { $content[“all”] = str_replace('{NAV_HORIZ_DD}','{NAV_HORIZ_DD:0,100}',$content[“all”]); $content[“all”] = preg_replace('/\{NAV_HORIZ_DD:(.*?)\}/i','{NAV_HORIZ_DD:$1,100}', $content[“all”]); $content[“all”] = preg_replace('/\{NAV_HORIZ_DD:(.*?),(.*?)\}/e','buildNavi_horiz(“$1”,”0”,”$2”-1);', $content[“all”]); } $content['all'] = str_replace('{NAVI}', buildNavi(), $content['all']);
function buildNavi_horiz($start=0, $counter=0, $depth=0) {
$t = array();
$struct = getStructureChildData($start); // Catch structure
if($counter == 0) {
$last = count($struct) - 1;
} else {
$last = 0;
}
$x = 0;
foreach($struct as $value) {
Is it a active path ? ======== Ist dies der aktive Pfad ?
if( isset($GLOBALS['LEVEL_KEY'][ $value['acat_id'] ]) ) {
$p1 = ' act_path';
} else {
$s = ''; // Reset $struct
$p1 = '';
}
Only if there is a sub level ======== Nur wenn SubLevel vorhanden ist
if($GLOBALS['content']['cat_id'] == $value['acat_id']) {
$a1 = ' act_path'; // Only for a direct call // Nur bei direktem Aufruf (FirstLevel active)
$a3 = ''; // Not in use
} else { // If first level isn´t active // Wenn FirstLevel nicht aktiv
$a1 = $p1;
$a3 = '';
}
========================== – <D01> ——————————————————————-
// Preset level depth added
// Ebenetiefenvorgabe hinzugefuegt
// $s = buildNavi_horiz($value['acat_id'], $counter+1);
if (($counter) < $depth) {$s = buildNavi_horiz($value['acat_id'], $counter+1, $depth);
}
else {$s = '';}
// -- <D01> -------------------------------------------------------------------
if($s) {
$g = '<!--[if gte IE 7]><!--></a><!--<![endif]-->';
$g .= $s;
$g .= LF . str_repeat(' ', $counter);
$class = $counter ? (' class=“fly_ul '.$a1.'”') : (' class=“drop_ul '.$a1.'”'); Second level with active category
$class = $counter ? (' class="fly_ul"') : (' class="drop_ul '.$a1.'"');
$close_li = str_repeat(' ', $counter+1);
} else {
$g = '</a>';
$class = ' class="sub_no"'; // If you don´t use the sub_no please change to: $class = '';
// -- <P01> -------------------------------------------------------------------
// Only the first level if there is no sub level
// Ausschlieszlich das erste Level wenn kein Sublevel vorhanden ist
if ($counter == 0) {
$class = ' class="sub_no'.$a1.'"'; // Set it, it is active or not // Es ist aktiv oder nicht
// -- <P01> -------------------------------------------------------------------
}
$close_li = '';
}
first li in block ======= Erstes li im letzten Block
if( $last && $last == $x ) {
$enclose = ' class="horiz_enclose"';
} elseif( $x || ($counter == 0 && $x == 0) ) {
$enclose = '';
} else {
$enclose = ' class="horiz_enclose"';
}
IDs for every li ======= If you need the ID class, please uncomment/comment
IDs fuer jedes li ======= Wenn sie die ID Klassen benoetigen, bitte dekommentieren/kommentieren
$l = str_repeat(' ', $counter+1) . '<li'. $class . ' id=“cat-id_' . $value['acat_id'] . '”>';
$l = str_repeat(' ', $counter+1) . '<li'. $class . '>';
$l .= get_level_ahref($value['acat_id'], $enclose) . html_specialchars($value['acat_name']);
$l .= $g;
$l .= $close_li . '</li>';
$t[] = $l;
$x++;
}
if($counter) {
$A = LF . str_repeat(' ', $counter) . '<!–[if lte IE 6]><table><tr><td><![endif]–>';
$B = LF . str_repeat(' ', $counter) . '<!–[if lte IE 6]></td></tr></table></a><![endif]–>';
} else {
$A = ;
$B = ;
}
$t = implode(LF, $t);
if($t) {
$t = $A . LF . str_repeat(' ', $counter) . '<ul'.($counter?:' id=“pmenu”').'>' . LF . $t . LF . str_repeat(' ', $counter) . '</ul>'. $B ;
}
return $t;
}
?>
</code>
; Reset $struct
==== PHP V1.01 ====
Dateiname: rt_nav_horiz_drop_down.php
Ort: /template/inc_script/frontend_render/
<code php|h rt_nav_horiz_drop_down.php |h>
<?php
Version 1.01 04.09.2010 KH
25.07.07 horizontal drop-down with ID output → NAVI HORIZONTAL DROP-DOWN
Oliver Georgi
http://www.phpwcms.de/forum/viewtopic.php?p=89743#89743
08.11.07 KH (flip-flop) Enhanced: Start[ID] {NAV_HORIZ_DD:ID}
28.04.08 KH (flip-flop) Enhanced: Level depth {NAV_HORIZ_DD:ID,Depth}
04.09.10 KH (flip-flop) Enhanced: Home link (enable/disable around line 36)
http://www.phpwcms.de/forum/viewtopic.php?p=94688#94688
TAG: {NAV_HORIZ_DD:ID,Level depth}
Location: Put it into the file e.g.:
/template/inc_script/frontend_render/rt_nav_horiz_drop_down.php
Switch in conf.inc.php: $phpwcms['allow_ext_render'] = 1;
—————————————————————-
obligate check for phpwcms constants
if (!defined('PHPWCMS_ROOT')) {
die(“You Cannot Access This Script Directly, Have a Nice Day.”);
}
—————————————————————-
if( ! ( strpos($content[“all”],'{NAV_HORIZ_DD')==false ) ) {
$content[“all”] = str_replace('{NAV_HORIZ_DD}','{NAV_HORIZ_DD:0,100}',$content[“all”]);
$content[“all”] = preg_replace('/\{NAV_HORIZ_DD:(.*?)\}/i','{NAV_HORIZ_DD:$1,100}', $content[“all”]);
$content[“all”] = preg_replace('/\{NAV_HORIZ_DD:(.*?),(.*?)\}/e','buildNavi_horiz(“$1”,”0”,”$2”-1);', $content[“all”]);
}
$content['all'] = str_replace('{NAVI}', buildNavi(), $content['all']);
function buildNavi_horiz($start=0, $counter=0, $depth=0) {
============ Custom var ===========
$home_link = false; [true|false] = [enabled|disabled]
============ END Custom var =======
$t = array();
$struct = getStructureChildData($start); Catch structure
if($counter == 0) {
$last = count($struct) - 1;
======== Only if you want home Nur wenn Home gewuenscht
if ($home_link) {
$l = '<li id=“cat-id_0” class=“drop home”>';
$l .= get_level_ahref(0, ' class=“first”') . '<span>'. html_specialchars($GLOBALS['content']['struct'][0]['acat_name']);
$l .= '</span></a></li>';
$t[] = $l;
}
======= END Home
} else {
$last = 0;
}
$x = 0;
foreach($struct as $value) {
Is it a active path ? ========
Ist dies der aktive Pfad ? ========
if( isset($GLOBALS['LEVEL_KEY'][ $value['acat_id'] ]) ) {
$p1 = ' act_path';
} else {
$s =
$p1 = '';
}
Only if there is a sub level ======== Nur wenn SubLevel vorhanden ist
if($GLOBALS['content']['cat_id'] == $value['acat_id']) {
$a1 = ' act_path'; // Only for a direct call // Nur bei direktem Aufruf (FirstLevel active)
$a3 = ''; // Not in use
} else { // If first level isn´t active // Wenn FirstLevel nicht aktiv
$a1 = $p1;
$a3 = '';
}
========================== – <D01> ——————————————————————-
// Preset level depth added
// Ebenetiefenvorgabe hinzugefuegt
// $s = buildNavi_horiz($value['acat_id'], $counter+1);
if (($counter) < $depth) {$s = buildNavi_horiz($value['acat_id'], $counter+1, $depth);
}
else {$s = '';}
// -- <D01> -------------------------------------------------------------------
if($s) {
$g = '<!--[if gte IE 7]><!--></a><!--<![endif]-->';
$g .= $s;
$g .= LF . str_repeat(' ', $counter);
$class = $counter ? (' class=“fly_ul '.$a1.'”') : (' class=“drop_ul '.$a1.'”'); Second level with active category
$class = $counter ? (' class="fly_ul"') : (' class="drop_ul '.$a1.'"');
$close_li = str_repeat(' ', $counter+1);
} else {
$g = '</a>';
$class = ' class="sub_no"'; // If you don´t use the sub_no please change to: $class = '';
// -- <P01> -------------------------------------------------------------------
// Only the first level if there is no sub level
// Ausschlieszlich das erste Level wenn kein Sublevel vorhanden ist
if ($counter == 0) {
$class = ' class="sub_no'.$a1.'"'; // Set it, it is active or not // Es ist aktiv oder nicht
// -- <P01> -------------------------------------------------------------------
}
$close_li = '';
}
first li in block ======= Erstes li im letzten Block
if( $last && $last == $x ) {
$enclose = ' class="horiz_enclose"';
} elseif( $x || ($counter == 0 && $x == 0) ) {
$enclose = '';
} else {
$enclose = ' class="horiz_enclose"';
}
IDs for every li ======= If you need the ID class, please uncomment/comment
IDs fuer jedes li ======= Wenn sie die ID Klassen benoetigen, bitte dekommentieren/kommentieren
$l = str_repeat(' ', $counter+1) . '<li'. $class . ' id=“cat-id_' . $value['acat_id'] . '”>';
$l = str_repeat(' ', $counter+1) . '<li'. $class . '>';
$l .= get_level_ahref($value['acat_id'], $enclose) . html_specialchars($value['acat_name']);
$l .= $g;
$l .= $close_li . '</li>';
$t[] = $l;
$x++;
}
if($counter) {
$A = LF . str_repeat(' ', $counter) . '<!–[if lte IE 6]><table><tr><td><![endif]–>';
$B = LF . str_repeat(' ', $counter) . '<!–[if lte IE 6]></td></tr></table></a><![endif]–>';
} else {
$A = ;
$B = ;
}
$t = implode(LF, $t);
if($t) {
$t = $A . LF . str_repeat(' ', $counter) . '<ul'.($counter?'':' id=“pmenu”').'>' . LF . $t . LF . str_repeat(' ', $counter) . '</ul>'. $B ;
}
return $t;
}
?>
</code>
==== CSS ====
Fileiname: nav_horiz_drop_down.css
Location: /template/inc_css/
<code php|h /nav_horiz_drop_down.css |h>
#menu_container {
margin: 0 0 100px 0;
position: relative;
width: 735px;
height: 21px;
z-index: 1000;
}
#pmenu, #pmenu ul {
padding: 0;
margin: 0;
list-style-type: none;
}
#pmenu a, #pmenu a:visited {
display: block;
width: 120px;
font-size: 11px;
color: #fff;
height: 21px;
line-height: 20px;
text-decoration: none;
text-indent: 5px;
border: 1px solid #fff;
border-width: 1px 0 1px 1px;
}
#pmenu li ul li a, #pmenu li ul li a:visited {
border-width: 0 1px 1px 1px;
}
#pmenu li a.horiz_enclose, #pmenu li a.horiz_enclose:visited {
border-width: 1px;
}
#pmenu li {
float: left;
list-style-type: none;
background: #7484ad;
}
#pmenu li:hover {
position: relative;
}
#pmenu li:hover > a {
background: #D1D5DF;
color: #BF4300;
}
#pmenu li ul {
display: none;
}
#pmenu li:hover > ul {
display: block;
position: absolute;
top: -7px;
left: 80px;
padding: 6px 30px 30px 30px;
background:transparent url(../../img/article/leer.gif);
width: 120px;
}
#pmenu > li:hover > ul {
left: -30px;
top: 16px;
}
#pmenu table {
position: absolute;
border-collapse: collapse;
top: 0;
left: 0;
z-index: 1000;
font-size: 1em;
}
* html #pmenu li a:hover {
position: relative;
background: #D1D5DF;
color: #c00;
}
#pmenu li a:active, #pmenu li a:focus {
background: #dfd7ca;
color: #BF4300;
}
#pmenu li.fly_ul {
background: #7484ad url(../../img/symbols/klapp_zu.gif) no-repeat 107px center;
}
#pmenu li.drop_ul {
background: #7484ad url(../../img/symbols/klapp_auf.gif) no-repeat 105px center;
}
#pmenu li.act_path {
background:#4161AF url(../../img/symbols/klapp_auf.gif) no-repeat 105px center;
}
* html #pmenu li ul {
visibility: hidden;
display: block;
position: absolute;
top: -11px;
left: 80px;
padding: 10px 30px 30px 30px;
background: transparent url(../../img/article/leer.gif);
}
#pmenu li a:hover ul ul {
visibility: hidden;
}
#pmenu li a:hover ul a:hover ul ul {
visibility: hidden;
}
#pmenu li a:hover ul a:hover ul a:hover ul ul {
visibility: hidden;
}
#pmenu li a:hover ul a:hover ul a:hover ul a:hover ul ul {
visibility: hidden;
}
#pmenu li a:hover ul {
visibility: visible;
left: -30px;
top: 10px;
lef\t: -31px;
to\p: 11px;
}
#pmenu li a:hover ul a:hover ul {
visibility: visible;
top: -11px;
left: 80px;
}
#pmenu li a:hover ul a:hover ul a:hover ul {
visibility: visible;
}
#pmenu li a:hover ul a:hover ul a:hover ul a:hover ul {
visibility: visible;
}
#pmenu li a:hover ul a:hover ul a:hover ul a:hover ul a:hover ul {
visibility: visible;
}
</code>