Revision 1351
Added by Luisehahne almost 15 years ago
| branches/2.8.x/CHANGELOG | ||
|---|---|---|
| 11 | 11 |
! = Update/Change |
| 12 | 12 |
|
| 13 | 13 |
------------------------------------- 2.8.2 ------------------------------------- |
| 14 |
21 Dec-2010 Dietmar Woellbrink (Luisehahne) |
|
| 15 |
# XHTML output fixed in show_menu2 |
|
| 14 | 16 |
20 Dec-2010 Dietmar Woellbrink (Luisehahne) |
| 15 | 17 |
# syntaxfix in initialize.php |
| 16 | 18 |
19 Dec-2010 Dietmar Woellbrink (Luisehahne) |
| branches/2.8.x/wb/admin/interface/version.php | ||
|---|---|---|
| 52 | 52 |
|
| 53 | 53 |
// check if defined to avoid errors during installation (redirect to admin panel fails if PHP error/warnings are enabled) |
| 54 | 54 |
if(!defined('VERSION')) define('VERSION', '2.8.2.RC1');
|
| 55 |
if(!defined('REVISION')) define('REVISION', '1350');
|
|
| 55 |
if(!defined('REVISION')) define('REVISION', '1351');
|
|
| 56 | 56 |
|
| 57 | 57 |
?> |
| branches/2.8.x/wb/modules/show_menu2/info.php | ||
|---|---|---|
| 1 |
<?php |
|
| 2 |
/** |
|
| 3 |
* |
|
| 4 |
* @category module |
|
| 5 |
* @package show_menu2 |
|
| 6 |
* @author WebsiteBaker Project |
|
| 7 |
* @copyright 2004-2009, Ryan Djurovich |
|
| 8 |
* @copyright 2009-2011, Website Baker Org. e.V. |
|
| 9 |
* @link http://www.websitebaker2.org/ |
|
| 10 |
* @license http://www.gnu.org/licenses/gpl.html |
|
| 11 |
* @platform WebsiteBaker 2.7.0 | 2.8.x |
|
| 12 |
* @requirements PHP 5.2.2 and higher |
|
| 13 |
* @version $Id$ |
|
| 14 |
* @filesource $HeadURL$ |
|
| 15 |
* @lastmodified $Date$ |
|
| 16 |
* |
|
| 17 |
*/ |
|
| 18 |
|
|
| 19 |
$module_directory = 'show_menu2'; |
|
| 20 |
$module_name = 'show_menu2'; |
|
| 21 |
$module_function = 'snippet'; |
|
| 22 |
$module_version = '4.9.1'; |
|
| 23 |
$module_platform = '2.7 | 2.8.x'; |
|
| 24 |
$module_author = 'Brodie Thiesfield'; |
|
| 25 |
$module_license = 'GNU General Public License'; |
|
| 26 |
$module_description = 'A code snippet for the Website Baker CMS providing a complete replacement for the builtin menu functions. See <a href="http://code.jellycan.com/show_menu2/" target="_blank">http://code.jellycan.com/show_menu2/</a> for details or view the <a href="' .WB_URL .'/modules/show_menu2/README.en.txt" target="_blank">readme</a> file.'; |
|
| 27 |
?> |
|
| 1 |
<?php |
|
| 2 |
/** |
|
| 3 |
* |
|
| 4 |
* @category module |
|
| 5 |
* @package show_menu2 |
|
| 6 |
* @author WebsiteBaker Project |
|
| 7 |
* @copyright 2004-2009, Ryan Djurovich |
|
| 8 |
* @copyright 2009-2011, Website Baker Org. e.V. |
|
| 9 |
* @link http://www.websitebaker2.org/ |
|
| 10 |
* @license http://www.gnu.org/licenses/gpl.html |
|
| 11 |
* @platform WebsiteBaker 2.8.x |
|
| 12 |
* @requirements PHP 5.2.2 and higher |
|
| 13 |
* @version $Id$ |
|
| 14 |
* @filesource $HeadURL$ |
|
| 15 |
* @lastmodified $Date$ |
|
| 16 |
* |
|
| 17 |
*/ |
|
| 18 |
|
|
| 19 |
$module_directory = 'show_menu2'; |
|
| 20 |
$module_name = 'show_menu2'; |
|
| 21 |
$module_function = 'snippet'; |
|
| 22 |
$module_version = '4.9.3'; |
|
| 23 |
$module_platform = '2.7 | 2.8.2'; |
|
| 24 |
$module_author = 'Brodie Thiesfield'; |
|
| 25 |
$module_license = 'GNU General Public License'; |
|
| 26 |
$module_description = 'A code snippet for the Website Baker CMS providing a complete replacement for the builtin menu functions. See <a href="http://code.jellycan.com/show_menu2/" target="_blank">http://code.jellycan.com/show_menu2/</a> for details or view the <a href="' .WB_URL .'/modules/show_menu2/README.en.txt" target="_blank">readme</a> file.'; |
|
| 27 |
?> |
|
| branches/2.8.x/wb/modules/show_menu2/README.de.txt | ||
|---|---|---|
| 1 | 1 |
show_menu2, version 4.9 |
| 2 | 2 |
======================= |
| 3 |
Ist ein Code-Snippet für das CMS Website Baker. Es stellt einen kompletten |
|
| 4 |
Ersatz für die eingebaute Menüfuntionalität zur Verfügung. Alle, für die |
|
| 5 |
Erzeugung des Menüs erforderlichen Daten, werden durch eine einzige |
|
| 6 |
Datenbankabfrage erzeugt. Durch umfangreiche Anpassungsmöglichkeiten des |
|
| 7 |
erzeugten HTML-Code können alle möglichen Menüarten (Listen, Breadcrumbs, |
|
| 3 |
Ist ein Code-Snippet für das CMS Website Baker. Es stellt einen kompletten
|
|
| 4 |
Ersatz für die eingebaute Menüfuntionalität zur Verfügung. Alle, für die
|
|
| 5 |
Erzeugung des Menüs erforderlichen Daten, werden durch eine einzige
|
|
| 6 |
Datenbankabfrage erzeugt. Durch umfangreiche Anpassungsmöglichkeiten des
|
|
| 7 |
erzeugten HTML-Code können alle möglichen Menüarten (Listen, Breadcrumbs,
|
|
| 8 | 8 |
Sitemaps, usw.) erzeugt werden. |
| 9 | 9 |
|
| 10 | 10 |
--- |
| 11 |
Deutsche Übersetzung von BerndJM. Dies ist eine weitgehend direkte Übersetzung |
|
| 12 |
des englischen Originals. Bei Übersetzungs- oder Interpretationsfehlern, bitte |
|
| 11 |
Deutsche Übersetzung von BerndJM. Dies ist eine weitgehend direkte Übersetzung
|
|
| 12 |
des englischen Originals. Bei Übersetzungs- oder Interpretationsfehlern, bitte
|
|
| 13 | 13 |
eine Email an bjm@wwnw.de. |
| 14 | 14 |
--- |
| 15 | 15 |
|
| ... | ... | |
| 20 | 20 |
1. Die aktuelle Version von http://code.jellycan.com/show_menu2/ herunterladen. |
| 21 | 21 |
2. In das Admin-Backend der Website Baker Installation einlogen. |
| 22 | 22 |
3. Erweiterungen -> Module aufrufen. |
| 23 |
4. Wenn bereits eine frühere Version von show_menu2 installiert ist, diese über |
|
| 23 |
4. Wenn bereits eine frühere Version von show_menu2 installiert ist, diese über
|
|
| 24 | 24 |
"Modul deinstallieren" auswählen und deinstallieren. |
| 25 |
5. Im Abschnitt "Modul installieren" das im Schritt 1 heruntergeladene zip-File |
|
| 25 |
5. Im Abschnitt "Modul installieren" das im Schritt 1 heruntergeladene zip-File
|
|
| 26 | 26 |
auswählen und installieren. |
| 27 | 27 |
|
| 28 | 28 |
|
| 29 | 29 |
|
| 30 | 30 |
BENUTZUNG VON SHOW_MENU2 |
| 31 | 31 |
======================== |
| 32 |
Um show_menu2 zu benutzen muss das verwendete Template an den Stellen |
|
| 33 |
modifiziert werden, an denen das Menü erscheinen soll. Bitte beachten: Wenn alte |
|
| 34 |
Menüaufrufe ersetzt werden, müssen unbedingt auch die entsprechenden neuen |
|
| 32 |
Um show_menu2 zu benutzen muss das verwendete Template an den Stellen
|
|
| 33 |
modifiziert werden, an denen das Menü erscheinen soll. Bitte beachten: Wenn alte
|
|
| 34 |
Menüaufrufe ersetzt werden, müssen unbedingt auch die entsprechenden neuen
|
|
| 35 | 35 |
Parameter verwendet werden die show_menu2 benötigt. |
| 36 | 36 |
|
| 37 |
In den meisten Fällen genügt bereits der Standardaufruf ohne weitere Parameter |
|
| 38 |
von show_menu2. In diesem Fall werden die Vorgabewerte verwendet, dies erzeugt |
|
| 37 |
In den meisten Fällen genügt bereits der Standardaufruf ohne weitere Parameter
|
|
| 38 |
von show_menu2. In diesem Fall werden die Vorgabewerte verwendet, dies erzeugt
|
|
| 39 | 39 |
ein Menü das die aktuelle Seite und die Unterseiten der aktuellen Seite anzeigt: |
| 40 | 40 |
|
| 41 | 41 |
show_menu2(); |
| 42 | 42 |
|
| 43 |
Bitte beachten: der Aufruf von show_menu2 ist PHP und muss normalerweise in PHP- |
|
| 44 |
Codezeichen eingeschlossen werden (ausser der Aufruf erfolgt bereits innerhalb |
|
| 43 |
Bitte beachten: der Aufruf von show_menu2 ist PHP und muss normalerweise in PHP-
|
|
| 44 |
Codezeichen eingeschlossen werden (ausser der Aufruf erfolgt bereits innerhalb
|
|
| 45 | 45 |
von PHP Code): |
| 46 | 46 |
|
| 47 | 47 |
<?php show_menu2(); ?> |
| 48 | 48 |
|
| 49 |
Dieses Vorgabe Menü erzeugt bereits ein komplettes Menü auf Listenbasis mit |
|
| 50 |
etlichen Klassen, die eine leichte Formatierung mittels CSS ermöglichen. Es wird |
|
| 51 |
z.B. die Klasse "menu-current" zu dem <li> tag des aktuellen Menüpunktes |
|
| 52 |
hinzugefügt. Zusätzlich erhält jeder Menüpunkt der Unterpunkte enthält die |
|
| 53 |
Klasse "menu-expand". Das erlaubt es sehr differenzierte CSS Regeln für die |
|
| 49 |
Dieses Vorgabe Menü erzeugt bereits ein komplettes Menü auf Listenbasis mit
|
|
| 50 |
etlichen Klassen, die eine leichte Formatierung mittels CSS ermöglichen. Es wird
|
|
| 51 |
z.B. die Klasse "menu-current" zu dem <li> tag des aktuellen Menüpunktes
|
|
| 52 |
hinzugefügt. Zusätzlich erhält jeder Menüpunkt der Unterpunkte enthält die
|
|
| 53 |
Klasse "menu-expand". Das erlaubt es sehr differenzierte CSS Regeln für die
|
|
| 54 | 54 |
einzelnen Menüpunkte aufzustellen. |
| 55 | 55 |
Zum Beispiel: |
| 56 | 56 |
|
| 57 | 57 |
li.menu-expand { font-weight: bold; }
|
| 58 | 58 |
li.menu-current { background: red; }
|
| 59 | 59 |
|
| 60 |
Im Abschnitt "HTML-Ausgabe" findet sich eine detaillierte Beschreibung welche |
|
| 61 |
Klassen welchem Element zugeordnet werden. Durch die Verwendung von |
|
| 62 |
verschiedenen Parametern bei dem show_menu2 Funktionsaufruf lassen sich auch |
|
| 63 |
recht umfangreiche und unterschiedliche Menüstrukturen erzeugen. Um |
|
| 64 |
beispielsweise nur Menüpunkte aus der obersten Ebene der Menüstruktur |
|
| 60 |
Im Abschnitt "HTML-Ausgabe" findet sich eine detaillierte Beschreibung welche
|
|
| 61 |
Klassen welchem Element zugeordnet werden. Durch die Verwendung von
|
|
| 62 |
verschiedenen Parametern bei dem show_menu2 Funktionsaufruf lassen sich auch
|
|
| 63 |
recht umfangreiche und unterschiedliche Menüstrukturen erzeugen. Um
|
|
| 64 |
beispielsweise nur Menüpunkte aus der obersten Ebene der Menüstruktur
|
|
| 65 | 65 |
darzustellen, könnte man folgenden Aufruf verwenden: |
| 66 | 66 |
|
| 67 | 67 |
show_menu2(0, SM2_ROOT, SM2_START); |
| ... | ... | |
| 70 | 70 |
|
| 71 | 71 |
show_menu2(0, SM2_CURR+1, SM2_CURR+2); |
| 72 | 72 |
|
| 73 |
Es gibt jede Menge Möglichkeiten, um die unterschiedlichsten Menüstrukturen zu |
|
| 74 |
erzeugen. Zahlreiche Beispiele dazu findet man auf der Demo-Website: http:// |
|
| 73 |
Es gibt jede Menge Möglichkeiten, um die unterschiedlichsten Menüstrukturen zu
|
|
| 74 |
erzeugen. Zahlreiche Beispiele dazu findet man auf der Demo-Website: http://
|
|
| 75 | 75 |
code.jellycan.com/sm2test/ |
| 76 | 76 |
|
| 77 | 77 |
|
| ... | ... | |
| 84 | 84 |
|
| 85 | 85 |
|
| 86 | 86 |
Q: Wie kann ich ein sogenanntes Drop-Down Menü erstellen? |
| 87 |
A: Dies hat nichts mit show_menu2 zu tun. Um ein Drop-Down Menü zu erzeugen muß |
|
| 88 |
lediglich der CSS-Code des jeweiligen Templates angepaßt werden. Die nötigen |
|
| 89 |
Anpassungen findet man z.B. im "allcss2" Template aus dem WB Addon |
|
| 87 |
A: Dies hat nichts mit show_menu2 zu tun. Um ein Drop-Down Menü zu erzeugen muß
|
|
| 88 |
lediglich der CSS-Code des jeweiligen Templates angepaßt werden. Die nötigen
|
|
| 89 |
Anpassungen findet man z.B. im "allcss2" Template aus dem WB Addon
|
|
| 90 | 90 |
Repository -> http://addons.websitebaker.org/pages/templates.php |
| 91 | 91 |
|
| 92 | 92 |
|
| 93 |
Q: Warum verschwindet das Menü nachdem ich in einer mehrsprachigen WB-Site die |
|
| 93 |
Q: Warum verschwindet das Menü nachdem ich in einer mehrsprachigen WB-Site die
|
|
| 94 | 94 |
Suchfunktion benutzt habe? |
| 95 |
A: Im verwendeten Template fehlen die notwendigen Zeilen: |
|
| 96 |
|
|
| 97 |
1. Im WB Admin Backend: Optionen -> Erweiterte Optionen anzeigen -> |
|
| 98 |
Suchoptionen -> Kopfzeile - hier direkt nach dem öffnenden <form> tag |
|
| 99 |
folgende Zeile einfügen: |
|
| 100 |
+A: Im verwendeten Template fehlen die notwendigen Zeilen: |
|
| 95 |
|
|
| 96 |
1. Im WB Admin Backend: Optionen -> Erweiterte Optionen anzeigen -> |
|
| 97 |
Suchoptionen -> Kopfzeile - hier direkt nach dem öffnenden <form> tag |
|
| 98 |
folgende Zeile einfügen: |
|
| 99 |
|
|
| 101 | 100 |
<input type="hidden" name="referrer" value="[REFERRER_ID]" /> |
| 102 | 101 |
|
| 103 |
2. In der index.php des verwendeten Templates folgende Zeile unmittelbar |
|
| 104 |
nach dem öffnenden <form> tag der Suche einfügen: |
|
| 105 |
|
|
| 102 |
2. In der index.php des verwendeten Templates folgende Zeile unmittelbar
|
|
| 103 |
nach dem öffnenden <form> tag der Suche einfügen:
|
|
| 104 |
|
|
| 106 | 105 |
<input type="hidden" name="referrer" value="<?php echo defined('REFERRER_ID')?REFERRER_ID:PAGE_ID;?>" />
|
| 107 | 106 |
|
| 108 | 107 |
|
| ... | ... | |
| 112 | 112 |
|
| 113 | 113 |
Q: Jedesmal wenn eine Seite aufgerufen wird, erzeugt SM2 folgende Warnmeldung: |
| 114 | 114 |
"show_menu2 error: $aOptions is invalid. No flags from group 1 supplied!" |
| 115 |
A: Der Funktion wurden die falschen Werte oder eine falsche Anzahl an |
|
| 116 |
Werten übergeben. |
|
| 117 |
Siehe den Abschnitt PARAMETER für die korrekten Flag Werte die dem |
|
| 115 |
A: Der Funktion wurden die falschen Werte oder eine falsche Anzahl an
|
|
| 116 |
Werten übergeben.
|
|
| 117 |
Siehe den Abschnitt PARAMETER für die korrekten Flag Werte die dem
|
|
| 118 | 118 |
$aOptions Parameter zu übergeben sind. |
| 119 | 119 |
|
| 120 | 120 |
|
| ... | ... | |
| 169 | 169 |
$aTopMenuOpen = false |
| 170 | 170 |
) |
| 171 | 171 |
|
| 172 |
Im Abschnitt "Parameter" findet sich eine detaillierte Beschreibung jedes |
|
| 173 |
einzelnen Parameters. |
|
| 174 |
Jeder Parameter muß absolut korrekt verwendet werden. Folgende Regeln können |
|
| 172 |
Im Abschnitt "Parameter" findet sich eine detaillierte Beschreibung jedes
|
|
| 173 |
einzelnen Parameters.
|
|
| 174 |
Jeder Parameter muß absolut korrekt verwendet werden. Folgende Regeln können
|
|
| 175 | 175 |
dabei helfen: |
| 176 | 176 |
|
| 177 | 177 |
$aMenu = 0 ist in den meisten Anwendungsfällen der beste Wert. |
| ... | ... | |
| 180 | 180 |
|
| 181 | 181 |
$aMaxLevel kann nur Werte erhalten, die mit "SM2_" beginnen. |
| 182 | 182 |
|
| 183 |
$aOptions bis auf einige wenige Spezialfälle sind hier nur Werte die mit |
|
| 183 |
$aOptions bis auf einige wenige Spezialfälle sind hier nur Werte die mit
|
|
| 184 | 184 |
"SM2_" beginnen zulässig. |
| 185 | 185 |
|
| 186 |
Alle weiteren Parameter enthalten die (HTML)Tags die die Ausgabe des Menüs |
|
| 186 |
Alle weiteren Parameter enthalten die (HTML)Tags die die Ausgabe des Menüs
|
|
| 187 | 187 |
steuern. |
| 188 | 188 |
|
| 189 |
Ab $aItemOpen kann jedem Parameter der Wert false übergeben werden um den |
|
| 189 |
Ab $aItemOpen kann jedem Parameter der Wert false übergeben werden um den
|
|
| 190 | 190 |
jeweiligen Vorgabewert zu erhalten. |
| 191 | 191 |
|
| 192 |
Dies kann beispielsweise verwendet werden um eine nummerierte Liste zu |
|
| 193 |
erzeugen, während für die einzelnen Menüpunkte trotzdem die Vorgabewerte |
|
| 192 |
Dies kann beispielsweise verwendet werden um eine nummerierte Liste zu
|
|
| 193 |
erzeugen, während für die einzelnen Menüpunkte trotzdem die Vorgabewerte
|
|
| 194 | 194 |
Verwendung finden: |
| 195 | 195 |
|
| 196 | 196 |
show_menu2(0, SM2_ROOT, SM2_ALL, SM2_ALL, false, false, '<ol>', '</ol>'); |
| ... | ... | |
| 215 | 215 |
menu-first Der erste Punkt eines jeden Menüs oder Untermenüs. |
| 216 | 216 |
menu-last Der letzte Punkt eines jeden Menüs oder Untermenüs. |
| 217 | 217 |
|
| 218 |
Folgende Klassen werden nur hinzugefügt, wenn das SM2_NUMCLASS Flag gesetzt |
|
| 218 |
Folgende Klassen werden nur hinzugefügt, wenn das SM2_NUMCLASS Flag gesetzt
|
|
| 219 | 219 |
ist: |
| 220 | 220 |
|
| 221 | 221 |
menu-N Jeder Menüpunkt, wobei das N für die ABSOLUTE Menütiefe, |
| ... | ... | |
| 268 | 268 |
PARAMETER |
| 269 | 269 |
========= |
| 270 | 270 |
$aMenu |
| 271 |
Nummer des Menüs. Diese ist nützlich um mehrere Menüs auf einer Seite zu |
|
| 271 |
Nummer des Menüs. Diese ist nützlich um mehrere Menüs auf einer Seite zu
|
|
| 272 | 272 |
verwenden. |
| 273 | 273 |
Menü Nummer 0 ist das Vorgabemenü der aktuellen Seite, SM2_ALLMENU gibt alle |
| 274 | 274 |
im System verwendeten Menüs zurück. |
| 275 | 275 |
|
| 276 | 276 |
$aStart |
| 277 |
Gibt an, ab welcher Ebene die Erzeugung des Menüs beginnen soll. In den |
|
| 278 |
meisten Fällen wird dies die oberste Ebene des anzuzeigenden Menüs sein. Es |
|
| 277 |
Gibt an, ab welcher Ebene die Erzeugung des Menüs beginnen soll. In den
|
|
| 278 |
meisten Fällen wird dies die oberste Ebene des anzuzeigenden Menüs sein. Es
|
|
| 279 | 279 |
kann einer der folgenden Werte verwendet werden: |
| 280 | 280 |
|
| 281 | 281 |
SM2_ROOT+N Beginnt N Ebenen unterhalb der obersten Ebene, z.B.: |
| ... | ... | |
| 290 | 290 |
mit allen Unterebenen |
| 291 | 291 |
|
| 292 | 292 |
page_id Verwendet die Seite mit der angegebenen page id als Elternelement. |
| 293 |
Alle Untermenüs dieser Seite werden angezeigt. |
|
| 294 |
(Die page id kann ermittelt werden, wenn man die Seite im |
|
| 295 |
Admin-Backend editiert, sie steht dann in der Adresszeile des |
|
| 293 |
Alle Untermenüs dieser Seite werden angezeigt.
|
|
| 294 |
(Die page id kann ermittelt werden, wenn man die Seite im
|
|
| 295 |
Admin-Backend editiert, sie steht dann in der Adresszeile des
|
|
| 296 | 296 |
Browsers: http://SITE/admin/pages/modify.php?page_id=35 |
| 297 | 297 |
|
| 298 | 298 |
$aMaxLevel |
| ... | ... | |
| 379 | 379 |
mit SM2_NOCACHE, sonst zeigt es keine Wirkung. |
| 380 | 380 |
|
| 381 | 381 |
SM2_NOCACHE Die aus der Datenbank gelesenen Daten werden bei erneutem Aufruf von |
| 382 |
show_menu2 nicht wiederverwendet sondern erneut aus der Datenbank |
|
| 382 |
show_menu2 nicht wiederverwendet sondern erneut aus der Datenbank
|
|
| 383 | 383 |
gelesen. |
| 384 | 384 |
|
| 385 | 385 |
SM2_PRETTY Bringt die HTML-Ausgabe des Menüs mittels Leerzeichen und |
| 386 |
Zeilenumbrüchen in eine gut lesbare Form. Das ist besonders |
|
| 386 |
Zeilenumbrüchen in eine gut lesbare Form. Das ist besonders
|
|
| 387 | 387 |
nützlich beim Debuggen der Menüausgabe. |
| 388 | 388 |
|
| 389 | 389 |
SM2_BUFFER Gibt den HTML-Code nicht direkt aus, sondern speichert ihn intern |
| ... | ... | |
| 405 | 405 |
release 4.8, supply this flag to enable hidden pages to |
| 406 | 406 |
become visible when they are active. |
| 407 | 407 |
|
| 408 |
Für diesen Parameter gibt es auch einen erweiterten Modus, bei dem die Optionen |
|
| 409 |
als assoziatives Array übergeben werden. Näheres dazu im Abschnitt ERWEITERTE |
|
| 410 |
OPTIONEN. Für die meisten Anwendungsfälle wird dies jedoch NICHT benötigt. |
|
| 408 |
SM2_XHTML_STRICT Stellt die XHTML-Kompatibilität der Links sicher indem |
|
| 409 |
in per [a] oder [ac] formatierten Links die Targetangabe |
|
| 410 |
entfernt und das Argument title="[page_titel]" eingefügt |
|
| 411 |
wird. Bei manuell zusammengestellten Links ist der Designer |
|
| 412 |
selbst für die XHTML-Konformität zuständig. |
|
| 413 |
|
|
| 414 |
SM2_NO_TITLE Unterdrückt die Ausgabe des Inhaltes des Title-Attributes |
|
| 415 |
bei [a] oder [ac] formatierten links. |
|
| 416 |
|
|
| 417 |
Für diesen Parameter gibt es auch einen erweiterten Modus, bei dem die Optionen |
|
| 418 |
als assoziatives Array übergeben werden. Näheres dazu im Abschnitt ERWEITERTE |
|
| 419 |
OPTIONEN. Für die meisten Anwendungsfälle wird dies jedoch NICHT benötigt. |
|
| 411 | 420 |
|
| 412 | 421 |
$aItemOpen |
| 413 | 422 |
Dies legt den Formatstring fest, mit dem jeder einzelne Menüeintrag begonnen |
| ... | ... | |
| 421 | 430 |
verwenden: '<li>[ac][menu_title]</a>'. |
| 422 | 431 |
|
| 423 | 432 |
Dieser Parameter kann auch als Instanz eine Formatierungklasse für das Menü |
| 424 |
verwendet werden. Die nähere Beschreibung dazu findet sich im Abschnitt FORMATTER. |
|
| 433 |
verwendet werden. Die nähere Beschreibung dazu findet sich im Abschnitt FORMATTER.
|
|
| 425 | 434 |
Wenn hier ein Formatter angegeben wird, werden alle Argumente |
| 426 | 435 |
nach $aItemOpen ignoriert. |
| 427 | 436 |
|
| ... | ... | |
| 455 | 464 |
|
| 456 | 465 |
|
| 457 | 466 |
ERWEITERTE OPTIONEN |
| 458 |
=================== |
|
| 459 |
Der Parameter $aOptions kann auf zweierlei Arten verwendet werden. Zum einen, wie oben |
|
| 460 |
im Abschnitt PARAMETER beschrieben, diese Art sollte für die allermeisten |
|
| 461 |
Anwendungsfälle ausreichen. Um allerdings in speziellen Fällen die Sonderoptionen |
|
| 462 |
ansprechen zu können, müssen die erforderlichen Werte als assoziatives Array |
|
| 463 |
bereitgestellt werden. |
|
| 464 |
Bitte beachten: Die SM2_* Flags sind auch hierbei erforderlich und müßen als 'flags' |
|
| 465 |
übergeben werden. |
|
| 467 |
===================
|
|
| 468 |
Der Parameter $aOptions kann auf zweierlei Arten verwendet werden. Zum einen, wie oben
|
|
| 469 |
im Abschnitt PARAMETER beschrieben, diese Art sollte für die allermeisten
|
|
| 470 |
Anwendungsfälle ausreichen. Um allerdings in speziellen Fällen die Sonderoptionen
|
|
| 471 |
ansprechen zu können, müssen die erforderlichen Werte als assoziatives Array
|
|
| 472 |
bereitgestellt werden.
|
|
| 473 |
Bitte beachten: Die SM2_* Flags sind auch hierbei erforderlich und müßen als 'flags'
|
|
| 474 |
übergeben werden.
|
|
| 466 | 475 |
|
| 467 |
'flags' **ZWINGEND ERFORDELICH** Dies sind die Flags die oben im Abschnitt |
|
| 476 |
'flags' **ZWINGEND ERFORDELICH** Dies sind die Flags die oben im Abschnitt
|
|
| 468 | 477 |
PARAMETER unter $aOptions beschrieben wurden. |
| 469 | 478 |
|
| 470 |
'notrim' Hiermit wird eine Anzahl von Ebenen festegelegt, die relativ bezogen |
|
| 471 |
auf die in $aStart festgelegte Menüebene, immer angezeigt werden. Dies |
|
| 472 |
bewirkt, daß für diese Ebenen das SM2_TRIM Flag ignoriert wird. |
|
| 473 |
|
|
| 474 |
Um dieses Array zu verwenden, empfiehlt es sich es erst anzulegen und dann den |
|
| 479 |
'notrim' Hiermit wird eine Anzahl von Ebenen festegelegt, die relativ bezogen
|
|
| 480 |
auf die in $aStart festgelegte Menüebene, immer angezeigt werden. Dies
|
|
| 481 |
bewirkt, daß für diese Ebenen das SM2_TRIM Flag ignoriert wird.
|
|
| 482 |
|
|
| 483 |
Um dieses Array zu verwenden, empfiehlt es sich es erst anzulegen und dann den
|
|
| 475 | 484 |
$aOptions parameter mit dem angelegten Array zu beliefern: |
| 476 | 485 |
|
| 477 | 486 |
$options = array('flags' => (SM2_TRIM|...), 'notrim' => 1);
|
| ... | ... | |
| 489 | 498 |
[li] <li> tag mit Klasse: '<li class="[class]">' |
| 490 | 499 |
[ul] <ul> tag mit Klasse: '<ul class="[class]">' |
| 491 | 500 |
[class] Liste der Klassen für diese Seite |
| 492 |
[menu_title] Text des Menütitel |
|
| 501 |
[menu_title] Text des Menütitel
|
|
| 493 | 502 |
(HTML entity escaped ausser das SM2_NOESCAPE Flag ist gesetzt) |
| 494 |
[page_title] text des Seitentitel |
|
| 503 |
[menu_icon_0] die URL zu einer Bilddatei mit normal - Darstellung (ab WB2.9.0) |
|
| 504 |
[menu_icon_1] die URL zu einer Bilddatei mit active/hover - Darstellung (ab WB2.9.0) |
|
| 505 |
[page_title] text des Seitentitel |
|
| 495 | 506 |
(HTML entity escaped ausser das SM2_NOESCAPE Flag ist gesetzt) |
| 507 |
[page_icon] die URL zu einer seitenbezogenen Bilddatei (ab WB2.9.0) |
|
| 496 | 508 |
[url] die URL der Seiten für den <a> tag |
| 497 | 509 |
[target] das Seitenziel für den <a> tag |
| 498 | 510 |
[page_id] die Page ID des aktuellen Menüpunktes. |
| 499 | 511 |
[parent] die Page ID des übergeordneten Menüpunktes. |
| 500 |
[level] die Seitenebene, |
|
| 512 |
[level] die Seitenebene,
|
|
| 501 | 513 |
dies ist die gleiche Zahl die im "menu-N" CSS tag verwendet wird. |
| 502 | 514 |
[sib] Anzahl der Geschwister des aktuellen Menüpunktes. |
| 503 | 515 |
[sibCount] Anzahl aller Geschwister in diesem Menü. |
| ... | ... | |
| 535 | 547 |
Wenn mehr als ein Vergleich erforderlich ist, so muss dieser mit den anderen Vergleichen |
| 536 | 548 |
mittels || (boolsches oder - OR) oder && (boolsches und - AND) verknüpft werden. |
| 537 | 549 |
|
| 538 |
Ein einzelner Vergleich besteht aus dem linken Operanden, dem Operator und dem rechten |
|
| 550 |
Ein einzelner Vergleich besteht aus dem linken Operanden, dem Operator und dem rechten
|
|
| 539 | 551 |
Operanden. |
| 540 | 552 |
z.B. X == Y - hierbei ist X der linke Operand, == der Operator und Y der rechte Operand. |
| 541 | 553 |
|
| ... | ... | |
| 548 | 560 |
sib Überprüfung der Geschwisteranzahl der aktuellen Seite. |
| 549 | 561 |
sibCount Überprüfung der Geamtanzahl der Geschwister im aktuellen Menü. |
| 550 | 562 |
id Überprüfung der page id. |
| 563 |
target Überprüfung der Target-Angabe |
|
| 551 | 564 |
|
| 552 | 565 |
Operator. Muss einer der folgenden sein: |
| 553 | 566 |
< Kleiner als |
| ... | ... | |
| 575 | 588 |
sib Eine positive Integerzahl, oder "sibCount" um die Anzahl der |
| 576 | 589 |
Geschwister in diesem Menü zu überprüfen |
| 577 | 590 |
sibCount Eine positive Integerzahl |
| 591 |
target Ein String, der eine mögliche Targetangabe darstellt |
|
| 578 | 592 |
|
| 579 | 593 |
Folgende Beispiele ergeben "wahr" und der Ausdruck {exp} wird ausgeführt, wenn zutrifft:
|
| 580 | 594 |
|
| ... | ... | |
| 587 | 601 |
[if(sib==2){exp}] ist der zweite Eintrag in einem Menü
|
| 588 | 602 |
[if(sibCount>1){exp}] ist in einem Menü mit mehr als einem Eintrag
|
| 589 | 603 |
[if(sibCount!=2){exp}] ist in einem Menü, das nicht genau 2 Einträge hat
|
| 590 |
[if(level>parent){exp}] ist in einem Geschwistermenü oder dem Untermenü eines
|
|
| 604 |
[if(level>parent){exp}] ist in einem Geschwistermenü oder dem Untermenü eines
|
|
| 591 | 605 |
Geschwistermenüs |
| 592 | 606 |
[if(id==parent){exp}] ist der übergeordnete Punkt der aktuellen id
|
| 607 |
[if(target==_self){exp}] im Target-Attribut ist der String '_self' enthalten
|
|
| 593 | 608 |
|
| 594 |
Wenn eine sonst-Klausel (else) hinzugefügt wird, so wird diese in allen anderen Fällen |
|
| 609 |
Wenn eine sonst-Klausel (else) hinzugefügt wird, so wird diese in allen anderen Fällen
|
|
| 595 | 610 |
ausgeführt. |
| 596 | 611 |
Zum Beispiel wird "foo" immer dann ausgeführt, wenn die if Überprüfung falsch ergibt, also: |
| 597 | 612 |
|
| ... | ... | |
| 600 | 615 |
|
| 601 | 616 |
Bei mehrfach Vergleichen wird der Ausdruck "exp" nur ausgeführt, wenn: |
| 602 | 617 |
|
| 603 |
[if(sib == 1 || sib > 3){exp}] ist der erste Eintrag ODER ist der vierte oder höhere
|
|
| 618 |
[if(sib == 1 || sib > 3){exp}] ist der erste Eintrag ODER ist der vierte oder höhere
|
|
| 604 | 619 |
Eintrag im Menü |
| 605 | 620 |
|
| 606 |
[if(id == current && class == menu-expand){exp} ist der aktuelle Eintrag UND hat
|
|
| 621 |
[if(id == current && class == menu-expand){exp} ist der aktuelle Eintrag UND hat
|
|
| 607 | 622 |
Untermenüs |
| 608 | 623 |
|
| 609 | 624 |
Bitte beachten: |
| branches/2.8.x/wb/modules/show_menu2/include.php | ||
|---|---|---|
| 1 |
<?php |
|
| 2 |
/** |
|
| 3 |
* |
|
| 4 |
* @category module |
|
| 5 |
* @package show_menu2 |
|
| 6 |
* @author WebsiteBaker Project |
|
| 7 |
* @copyright 2004-2009, Ryan Djurovich |
|
| 8 |
* @copyright 2009-2011, Website Baker Org. e.V. |
|
| 9 |
* @link http://www.websitebaker2.org/ |
|
| 10 |
* @license http://www.gnu.org/licenses/gpl.html |
|
| 11 |
* @platform WebsiteBaker 2.7.0 | 2.8.x |
|
| 12 |
* @requirements PHP 5.2.2 and higher |
|
| 13 |
* @version $Id$ |
|
| 14 |
* @filesource $HeadURL$ |
|
| 15 |
* @lastmodified $Date$ |
|
| 16 |
* |
|
| 17 |
*/ |
|
| 18 |
|
|
| 19 |
define('SM2_ROOT', -1000);
|
|
| 20 |
define('SM2_CURR', -2000);
|
|
| 21 |
define('SM2_ALLMENU', -1);
|
|
| 22 |
define('SM2_START', 1000);
|
|
| 23 |
define('SM2_MAX', 2000);
|
|
| 24 |
define('SM2_ALL', 0x0001); // bit 0 (group 1) (Note: also used for max level!)
|
|
| 25 |
define('SM2_TRIM', 0x0002); // bit 1 (group 1)
|
|
| 26 |
define('SM2_CRUMB', 0x0004); // bit 2 (group 1)
|
|
| 27 |
define('SM2_SIBLING', 0x0008); // bit 3 (group 1)
|
|
| 28 |
define('SM2_NUMCLASS', 0x0010); // bit 4
|
|
| 29 |
define('SM2_ALLINFO', 0x0020); // bit 5
|
|
| 30 |
define('SM2_NOCACHE', 0x0040); // bit 6
|
|
| 31 |
define('SM2_PRETTY', 0x0080); // bit 7
|
|
| 32 |
define('SM2_ESCAPE', 0x0100); // bit 8
|
|
| 33 |
define('SM2_NOESCAPE', 0); // NOOP, unnecessary with WB 2.6.7+
|
|
| 34 |
define('SM2_BUFFER', 0x0200); // bit 9
|
|
| 35 |
define('SM2_CURRTREE', 0x0400); // bit 10
|
|
| 36 |
define('SM2_SHOWHIDDEN', 0x0800); // bit 11
|
|
| 37 |
|
|
| 38 |
define('_SM2_GROUP_1', 0x000F); // exactly one flag from group 1 is required
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
// Implement support for page_menu and show_menu using show_menu2. If you remove |
|
| 42 |
// the comments characters from the beginning of the following include, all menu |
|
| 43 |
// functions in Website Baker will be implemented using show_menu2. While it is |
|
| 44 |
// commented out, the original WB functions will be used. |
|
| 45 |
//include('legacy.php');
|
|
| 46 |
|
|
| 47 |
// This class is the default menu formatter for sm2. If desired, you can |
|
| 48 |
// create your own formatter class and pass the object into show_menu2 |
|
| 49 |
// as $aItemFormat. |
|
| 50 |
define('SM2_CONDITIONAL','if\s*\(([^\)]+)\)\s*{([^}]*)}\s*(?:else\s*{([^}]*)}\s*)?');
|
|
| 51 |
define('SM2_COND_TERM','\s*(\w+)\s*(<|<=|==|=|=>|>|!=)\s*([\w\-]+)\s*');
|
|
| 52 |
class SM2_Formatter |
|
| 53 |
{
|
|
| 54 |
var $output; |
|
| 55 |
var $flags; |
|
| 56 |
var $itemOpen; |
|
| 57 |
var $itemClose; |
|
| 58 |
var $menuOpen; |
|
| 59 |
var $menuClose; |
|
| 60 |
var $topItemOpen; |
|
| 61 |
var $topMenuOpen; |
|
| 62 |
|
|
| 63 |
var $isFirst; |
|
| 64 |
var $page; |
|
| 65 |
var $url; |
|
| 66 |
var $currSib; |
|
| 67 |
var $sibCount; |
|
| 68 |
var $currClass; |
|
| 69 |
var $prettyLevel; |
|
| 70 |
|
|
| 71 |
// output the data |
|
| 72 |
function output($aString) {
|
|
| 73 |
if ($this->flags & SM2_BUFFER) {
|
|
| 74 |
$this->output .= $aString; |
|
| 75 |
} |
|
| 76 |
else {
|
|
| 77 |
echo $aString; |
|
| 78 |
} |
|
| 79 |
} |
|
| 80 |
|
|
| 81 |
// set the default values for all of our formatting items |
|
| 82 |
function set($aFlags, $aItemOpen, $aItemClose, $aMenuOpen, $aMenuClose, $aTopItemOpen, $aTopMenuOpen) {
|
|
| 83 |
$this->flags = $aFlags; |
|
| 84 |
$this->itemOpen = is_string($aItemOpen) ? $aItemOpen : '[li][a][menu_title]</a>'; |
|
| 85 |
$this->itemClose = is_string($aItemClose) ? $aItemClose : '</li>'; |
|
| 86 |
$this->menuOpen = is_string($aMenuOpen) ? $aMenuOpen : '[ul]'; |
|
| 87 |
$this->menuClose = is_string($aMenuClose) ? $aMenuClose : '</ul>'; |
|
| 88 |
$this->topItemOpen = is_string($aTopItemOpen) ? $aTopItemOpen : $this->itemOpen; |
|
| 89 |
$this->topMenuOpen = is_string($aTopMenuOpen) ? $aTopMenuOpen : $this->menuOpen; |
|
| 90 |
} |
|
| 91 |
|
|
| 92 |
// initialize the state of the formatter before anything is output |
|
| 93 |
function initialize() {
|
|
| 94 |
$this->output = ''; |
|
| 95 |
$this->prettyLevel = 0; |
|
| 96 |
if ($this->flags & SM2_PRETTY) {
|
|
| 97 |
$this->output("\n<!-- show_menu2 -->");
|
|
| 98 |
} |
|
| 99 |
} |
|
| 100 |
|
|
| 101 |
// start a menu |
|
| 102 |
function startList(&$aPage, &$aUrl) {
|
|
| 103 |
$currClass = ''; |
|
| 104 |
$currItem = $this->menuOpen; |
|
| 105 |
|
|
| 106 |
// use the top level menu open if this is the first menu |
|
| 107 |
if ($this->topMenuOpen) {
|
|
| 108 |
$currItem = $this->topMenuOpen; |
|
| 109 |
$currClass .= ' menu-top'; |
|
| 110 |
$this->topMenuOpen = false; |
|
| 111 |
} |
|
| 112 |
|
|
| 113 |
// add the numbered menu class only if requested |
|
| 114 |
if (($this->flags & SM2_NUMCLASS) == SM2_NUMCLASS) {
|
|
| 115 |
$currClass .= ' menu-'.$aPage['level']; |
|
| 116 |
} |
|
| 117 |
|
|
| 118 |
$this->prettyLevel += 1; |
|
| 119 |
|
|
| 120 |
// replace all keywords in the output |
|
| 121 |
if ($this->flags & SM2_PRETTY) {
|
|
| 122 |
$this->output("\n".str_repeat(' ',$this->prettyLevel).
|
|
| 123 |
$this->format($aPage, $aUrl, $currItem, $currClass)); |
|
| 124 |
} |
|
| 125 |
else {
|
|
| 126 |
$this->output($this->format($aPage, $aUrl, $currItem, $currClass)); |
|
| 127 |
} |
|
| 128 |
|
|
| 129 |
$this->prettyLevel += 3; |
|
| 130 |
} |
|
| 131 |
|
|
| 132 |
// start an item within the menu |
|
| 133 |
function startItem(&$aPage, &$aUrl, $aCurrSib, $aSibCount) {
|
|
| 134 |
// generate our class list |
|
| 135 |
$currClass = ''; |
|
| 136 |
if (($this->flags & SM2_NUMCLASS) == SM2_NUMCLASS) {
|
|
| 137 |
$currClass .= ' menu-'.$aPage['level']; |
|
| 138 |
} |
|
| 139 |
if (array_key_exists('sm2_has_child', $aPage)) {
|
|
| 140 |
// not set if false, so existence = true |
|
| 141 |
$currClass .= ' menu-expand'; |
|
| 142 |
} |
|
| 143 |
if (array_key_exists('sm2_is_curr', $aPage)) {
|
|
| 144 |
$currClass .= ' menu-current'; |
|
| 145 |
} |
|
| 146 |
elseif (array_key_exists('sm2_is_parent', $aPage)) {
|
|
| 147 |
// not set if false, so existence = true |
|
| 148 |
$currClass .= ' menu-parent'; |
|
| 149 |
} |
|
| 150 |
elseif (array_key_exists('sm2_is_sibling', $aPage)) {
|
|
| 151 |
// not set if false, so existence = true |
|
| 152 |
$currClass .= ' menu-sibling'; |
|
| 153 |
} |
|
| 154 |
elseif (array_key_exists('sm2_child_level',$aPage)) {
|
|
| 155 |
// not set if not a child |
|
| 156 |
$currClass .= ' menu-child'; |
|
| 157 |
if (($this->flags & SM2_NUMCLASS) == SM2_NUMCLASS) {
|
|
| 158 |
$currClass .= ' menu-child-'.($aPage['sm2_child_level']-1); |
|
| 159 |
} |
|
| 160 |
} |
|
| 161 |
if ($aCurrSib == 1) {
|
|
| 162 |
$currClass .= ' menu-first'; |
|
| 163 |
} |
|
| 164 |
if ($aCurrSib == $aSibCount) {
|
|
| 165 |
$currClass .= ' menu-last'; |
|
| 166 |
} |
|
| 167 |
|
|
| 168 |
// use the top level item if this is the first item |
|
| 169 |
$currItem = $this->itemOpen; |
|
| 170 |
if ($this->topItemOpen) {
|
|
| 171 |
$currItem = $this->topItemOpen; |
|
| 172 |
$this->topItemOpen = false; |
|
| 173 |
} |
|
| 174 |
|
|
| 175 |
// replace all keywords in the output |
|
| 176 |
if ($this->flags & SM2_PRETTY) {
|
|
| 177 |
$this->output("\n".str_repeat(' ',$this->prettyLevel));
|
|
| 178 |
} |
|
| 179 |
$this->output($this->format($aPage, $aUrl, $currItem, $currClass, $aCurrSib, $aSibCount)); |
|
| 180 |
} |
|
| 181 |
|
|
| 182 |
// find and replace all keywords, setting the state variables first |
|
| 183 |
function format(&$aPage, &$aUrl, &$aCurrItem, &$aCurrClass, |
|
| 184 |
$aCurrSib = 0, $aSibCount = 0) |
|
| 185 |
{
|
|
| 186 |
$this->page = &$aPage; |
|
| 187 |
$this->url = &$aUrl; |
|
| 188 |
$this->currClass = trim($aCurrClass); |
|
| 189 |
$this->currSib = $aCurrSib; |
|
| 190 |
$this->sibCount = $aSibCount; |
|
| 191 |
|
|
| 192 |
$item = $this->format2($aCurrItem); |
|
| 193 |
|
|
| 194 |
unset($this->page); |
|
| 195 |
unset($this->url); |
|
| 196 |
unset($this->currClass); |
|
| 197 |
|
|
| 198 |
return $item; |
|
| 199 |
} |
|
| 200 |
|
|
| 201 |
// find and replace all keywords |
|
| 202 |
function format2(&$aCurrItem) {
|
|
| 203 |
if (!is_string($aCurrItem)) return ''; |
|
| 204 |
return preg_replace( |
|
| 205 |
'@\[('.
|
|
| 206 |
'a|ac|/a|li|/li|ul|/ul|menu_title|page_title|url|target|page_id|'. |
|
| 207 |
'parent|level|sib|sibCount|class|description|keywords|'. |
|
| 208 |
SM2_CONDITIONAL. |
|
| 209 |
')\]@e', |
|
| 210 |
'$this->replace("\1")', $aCurrItem);
|
|
| 211 |
} |
|
| 212 |
|
|
| 213 |
// replace the keywords |
|
| 214 |
function replace($aMatch) {
|
|
| 215 |
switch ($aMatch) {
|
|
| 216 |
case 'a': |
|
| 217 |
return '<a href="'.$this->url.'" target="'.$this->page['target'].'">'; |
|
| 218 |
case 'ac': |
|
| 219 |
return '<a href="'.$this->url.'" target="'.$this->page['target'].'" class="'.$this->currClass.'">'; |
|
| 220 |
case '/a': |
|
| 221 |
return '</a>'; |
|
| 222 |
case 'li': |
|
| 223 |
return '<li class="'.$this->currClass.'">'; |
|
| 224 |
case '/li': |
|
| 225 |
return '</li>'; |
|
| 226 |
case 'ul': |
|
| 227 |
return '<ul class="'.$this->currClass.'">'; |
|
| 228 |
case '/ul': |
|
| 229 |
return '</ul>'; |
|
| 230 |
case 'url': |
|
| 231 |
return $this->url; |
|
| 232 |
case 'sib': |
|
| 233 |
return $this->currSib; |
|
| 234 |
case 'sibCount': |
|
| 235 |
return $this->sibCount; |
|
| 236 |
case 'class': |
|
| 237 |
return $this->currClass; |
|
| 238 |
default: |
|
| 239 |
if (array_key_exists($aMatch, $this->page)) {
|
|
| 240 |
if ($this->flags & SM2_ESCAPE) {
|
|
| 241 |
return htmlspecialchars($this->page[$aMatch], ENT_QUOTES); |
|
| 242 |
} |
|
| 243 |
else {
|
|
| 244 |
return $this->page[$aMatch]; |
|
| 245 |
} |
|
| 246 |
} |
|
| 247 |
if (preg_match('/'.SM2_CONDITIONAL.'/', $aMatch, $rgMatches)) {
|
|
| 248 |
return $this->replaceIf($rgMatches[1], $rgMatches[2], $rgMatches[3]); |
|
| 249 |
} |
|
| 250 |
} |
|
| 251 |
return "[$aMatch=UNKNOWN]"; |
|
| 252 |
} |
|
| 253 |
|
|
| 254 |
// conditional replacement |
|
| 255 |
function replaceIf(&$aExpression, &$aIfValue, &$aElseValue) {
|
|
| 256 |
// evaluate all of the tests in the conditional (we don't do short-circuit |
|
| 257 |
// evaluation) and replace the string test with the boolean result |
|
| 258 |
$rgTests = preg_split('/(\|\||\&\&)/', $aExpression, -1, PREG_SPLIT_DELIM_CAPTURE);
|
|
| 259 |
for ($n = 0; $n < count($rgTests); $n += 2) {
|
|
| 260 |
if (preg_match('/'.SM2_COND_TERM.'/', $rgTests[$n], $rgMatches)) {
|
|
| 261 |
$rgTests[$n] = $this->ifTest($rgMatches[1], $rgMatches[2], $rgMatches[3]); |
|
| 262 |
} |
|
| 263 |
else {
|
|
| 264 |
@error_logs("show_menu2 error: conditional expression is invalid!");
|
|
| 265 |
$rgTests[$n] = false; |
|
| 266 |
} |
|
| 267 |
} |
|
| 268 |
|
|
| 269 |
// combine all test results for a final result |
|
| 270 |
$ok = $rgTests[0]; |
|
| 271 |
for ($n = 1; $n+1 < count($rgTests); $n += 2) {
|
|
| 272 |
if ($rgTests[$n] == '||') {
|
|
| 273 |
$ok = $ok || $rgTests[$n+1]; |
|
| 274 |
} |
|
| 275 |
else {
|
|
| 276 |
$ok = $ok && $rgTests[$n+1]; |
|
| 277 |
} |
|
| 278 |
} |
|
| 279 |
|
|
| 280 |
// return the formatted expression if the test succeeded |
|
| 281 |
return $ok ? $this->format2($aIfValue) : $this->format2($aElseValue); |
|
| 282 |
} |
|
| 283 |
|
|
| 284 |
// conditional test |
|
| 285 |
function ifTest(&$aKey, &$aOperator, &$aValue) {
|
|
| 286 |
global $wb; |
|
| 287 |
|
|
| 288 |
// find the correct operand |
|
| 289 |
$operand = false; |
|
| 290 |
switch($aKey) {
|
|
| 291 |
case 'class': |
|
| 292 |
// we need to wrap the class names in spaces so we can test for a unique |
|
| 293 |
// class name that will not match prefixes or suffixes. Same must be done |
|
| 294 |
// for the value we are testing. |
|
| 295 |
$operand = " $this->currClass "; |
|
| 296 |
break; |
|
| 297 |
case 'sib': |
|
| 298 |
$operand = $this->currSib; |
|
| 299 |
if ($aValue == 'sibCount') {
|
|
| 300 |
$aValue = $this->sibCount; |
|
| 301 |
} |
|
| 302 |
break; |
|
| 303 |
case 'sibCount': |
|
| 304 |
$operand = $this->sibCount; |
|
| 305 |
break; |
|
| 306 |
case 'level': |
|
| 307 |
$operand = $this->page['level']; |
|
| 308 |
switch ($aValue) {
|
|
| 309 |
case 'root': $aValue = 0; break; |
|
| 310 |
case 'granny': $aValue = $wb->page['level']-2; break; |
|
| 311 |
case 'parent': $aValue = $wb->page['level']-1; break; |
|
| 312 |
case 'current': $aValue = $wb->page['level']; break; |
|
| 313 |
case 'child': $aValue = $wb->page['level']+1; break; |
|
| 314 |
} |
|
| 315 |
if ($aValue < 0) $aValue = 0; |
|
| 316 |
break; |
|
| 317 |
case 'id': |
|
| 318 |
$operand = $this->page['page_id']; |
|
| 319 |
switch ($aValue) {
|
|
| 320 |
case 'parent': $aValue = $wb->page['parent']; break; |
|
| 321 |
case 'current': $aValue = $wb->page['page_id']; break; |
|
| 322 |
} |
|
| 323 |
break; |
|
| 324 |
default: |
|
| 325 |
return ''; |
|
| 326 |
} |
|
| 327 |
|
|
| 328 |
// do the test |
|
| 329 |
$ok = false; |
|
| 330 |
switch ($aOperator) {
|
|
| 331 |
case '<': |
|
| 332 |
$ok = ($operand < $aValue); |
|
| 333 |
break; |
|
| 334 |
case '<=': |
|
| 335 |
$ok = ($operand <= $aValue); |
|
| 336 |
break; |
|
| 337 |
case '=': |
|
| 338 |
case '==': |
|
| 339 |
case '!=': |
|
| 340 |
if ($aKey == 'class') {
|
|
| 341 |
$ok = strstr($operand, " $aValue ") !== FALSE; |
|
| 342 |
} |
|
| 343 |
else {
|
|
| 344 |
$ok = ($operand == $aValue); |
|
| 345 |
} |
|
| 346 |
if ($aOperator == '!=') {
|
|
| 347 |
$ok = !$ok; |
|
| 348 |
} |
|
| 349 |
break; |
|
| 350 |
case '>=': |
|
| 351 |
$ok = ($operand >= $aValue); |
|
| 352 |
case '>': |
|
| 353 |
$ok = ($operand > $aValue); |
|
| 354 |
} |
|
| 355 |
|
|
| 356 |
return $ok; |
|
| 357 |
} |
|
| 358 |
|
|
| 359 |
// finish the current menu item |
|
| 360 |
function finishItem() {
|
|
| 361 |
if ($this->flags & SM2_PRETTY) {
|
|
| 362 |
$this->output(str_repeat(' ',$this->prettyLevel).$this->itemClose);
|
|
| 363 |
} |
|
| 364 |
else {
|
|
| 365 |
$this->output($this->itemClose); |
|
| 366 |
} |
|
| 367 |
} |
|
| 368 |
|
|
| 369 |
// finish the current menu |
|
| 370 |
function finishList() {
|
|
| 371 |
$this->prettyLevel -= 3; |
|
| 372 |
|
|
| 373 |
if ($this->flags & SM2_PRETTY) {
|
|
| 374 |
$this->output("\n".str_repeat(' ',$this->prettyLevel).$this->menuClose."\n");
|
|
| 375 |
} |
|
| 376 |
else {
|
|
| 377 |
$this->output($this->menuClose); |
|
| 378 |
} |
|
| 379 |
|
|
| 380 |
$this->prettyLevel -= 1; |
|
| 381 |
} |
|
| 382 |
|
|
| 383 |
// cleanup the state of the formatter after everything has been output |
|
| 384 |
function finalize() {
|
|
| 385 |
if ($this->flags & SM2_PRETTY) {
|
|
| 386 |
$this->output("\n");
|
|
| 387 |
} |
|
| 388 |
} |
|
| 389 |
|
|
| 390 |
// return the output |
|
| 391 |
function getOutput() {
|
|
| 392 |
return $this->output; |
|
| 393 |
} |
|
| 394 |
}; |
|
| 395 |
|
|
| 396 |
function error_logs($error_str) |
|
| 397 |
{
|
|
| 398 |
$log_error = true; |
|
| 399 |
if ( ! function_exists('error_log') )
|
|
| 400 |
$log_error = false; |
|
| 401 |
|
|
| 402 |
$log_file = @ini_get('error_log');
|
|
| 403 |
if ( !empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file) )
|
|
| 404 |
$log_error = false; |
|
| 405 |
|
|
| 406 |
if ( $log_error ) |
|
| 407 |
@error_log($error_str, 0); |
|
| 408 |
} |
|
| 409 |
|
|
| 410 |
function show_menu2( |
|
| 411 |
$aMenu = 0, |
|
| 412 |
$aStart = SM2_ROOT, |
|
| 413 |
$aMaxLevel = -1999, // SM2_CURR+1 |
|
| 414 |
$aOptions = SM2_TRIM, |
|
| 415 |
$aItemOpen = false, |
|
| 416 |
$aItemClose = false, |
|
| 417 |
$aMenuOpen = false, |
|
| 418 |
$aMenuClose = false, |
|
| 419 |
$aTopItemOpen = false, |
|
| 420 |
$aTopMenuOpen = false |
|
| 421 |
) |
|
| 422 |
{
|
|
| 423 |
global $wb; |
|
| 424 |
|
|
| 425 |
// extract the flags and set $aOptions to an array |
|
| 426 |
$flags = 0; |
|
| 427 |
if (is_int($aOptions)) {
|
|
| 428 |
$flags = $aOptions; |
|
| 429 |
$aOptions = array(); |
|
| 430 |
} |
|
| 431 |
else if (isset($aOptions['flags'])) {
|
|
| 432 |
$flags = $aOptions['flags']; |
|
| 433 |
} |
|
| 434 |
else {
|
|
| 435 |
$flags = SM2_TRIM; |
|
| 436 |
$aOptions = array(); |
|
| 437 |
@error_logs('show_menu2 error: $aOptions is invalid. No flags supplied!');
|
|
| 438 |
} |
|
| 439 |
|
|
| 440 |
// ensure we have our group 1 flag, we don't check for the "exactly 1" part, but |
|
| 441 |
// we do ensure that they provide at least one. |
|
| 442 |
if (0 == ($flags & _SM2_GROUP_1)) {
|
|
| 443 |
@error_logs('show_menu2 error: $aOptions is invalid. No flags from group 1 supplied!');
|
|
| 444 |
$flags |= SM2_TRIM; // default to TRIM |
|
| 445 |
} |
|
| 446 |
|
|
| 447 |
// search page results don't have any of the page data loaded by WB, so we load it |
|
| 448 |
// ourselves using the referrer ID as the current page |
|
| 449 |
$CURR_PAGE_ID = defined('REFERRER_ID') ? REFERRER_ID : PAGE_ID;
|
|
| 450 |
if (count($wb->page) == 0 && defined('REFERRER_ID') && REFERRER_ID > 0) {
|
|
| 451 |
global $database; |
|
| 452 |
$sql = 'SELECT * FROM `'.TABLE_PREFIX.'pages` WHERE `page_id` = '.REFERRER_ID.''; |
|
| 453 |
$result = $database->query($sql); |
|
| 454 |
if ($result->numRows() == 1) {
|
|
| 455 |
$wb->page = $result->fetchRow(); |
|
| 456 |
} |
|
| 457 |
unset($result); |
|
| 458 |
} |
|
| 459 |
|
|
| 460 |
// fix up the menu number to default to the menu number |
|
| 461 |
// of the current page if no menu has been supplied |
|
| 462 |
if ($aMenu == 0) {
|
|
| 463 |
$aMenu = $wb->page['menu'] == '' ? 1 : $wb->page['menu']; |
|
| 464 |
} |
|
| 465 |
|
|
| 466 |
// Set some of the $wb->page[] settings to defaults if not set |
|
| 467 |
$pageLevel = $wb->page['level'] == '' ? 0 : $wb->page['level']; |
|
| 468 |
$pageParent = $wb->page['parent'] == '' ? 0 : $wb->page['parent']; |
|
| 469 |
|
|
| 470 |
// adjust the start level and start page ID as necessary to |
|
| 471 |
// handle the special values that can be passed in as $aStart |
|
| 472 |
$aStartLevel = 0; |
|
| 473 |
if ($aStart < SM2_ROOT) { // SM2_CURR+N
|
|
| 474 |
if ($aStart == SM2_CURR) {
|
|
| 475 |
$aStartLevel = $pageLevel; |
|
| 476 |
$aStart = $pageParent; |
|
| 477 |
} |
|
| 478 |
else {
|
|
| 479 |
$aStartLevel = $pageLevel + $aStart - SM2_CURR; |
|
| 480 |
$aStart = $CURR_PAGE_ID; |
|
| 481 |
} |
|
| 482 |
} |
|
| 483 |
elseif ($aStart < 0) { // SM2_ROOT+N
|
|
| 484 |
$aStartLevel = $aStart - SM2_ROOT; |
|
| 485 |
$aStart = 0; |
|
| 486 |
} |
|
| 487 |
|
|
| 488 |
// we get the menu data once and store it in a global variable. This allows |
|
| 489 |
// multiple calls to show_menu2 in a single page with only a single call to |
|
| 490 |
// the database. If this variable exists, then we have already retrieved all |
|
| 491 |
// of the information and processed it, so we don't need to do it again. |
|
| 492 |
if (($flags & SM2_NOCACHE) != 0 |
|
| 493 |
|| !array_key_exists('show_menu2_data', $GLOBALS)
|
|
| 494 |
|| !array_key_exists($aMenu, $GLOBALS['show_menu2_data'])) |
|
| 495 |
{
|
|
| 496 |
global $database; |
|
| 497 |
|
|
| 498 |
// create an array of all parents of the current page. As the page_trail |
|
| 499 |
// doesn't include the theoretical root element 0, we add it ourselves. |
|
| 500 |
$rgCurrParents = explode(",", '0,'.$wb->page['page_trail']);
|
|
| 501 |
array_pop($rgCurrParents); // remove the current page |
|
| 502 |
$rgParent = array(); |
|
| 503 |
|
|
| 504 |
// if the caller wants all menus gathered together (e.g. for a sitemap) |
|
| 505 |
// then we don't limit our SQL query |
|
| 506 |
$menuLimitSql = ' AND menu = ' .$aMenu; |
|
| 507 |
if ($aMenu == SM2_ALLMENU) {
|
|
| 508 |
$menuLimitSql = ''; |
|
| 509 |
} |
|
| 510 |
|
|
| 511 |
// we only load the description and keywords if we have been told to, |
|
| 512 |
// this cuts the memory load for pages that don't use them. Note that if |
|
| 513 |
// we haven't been told to load these fields the *FIRST TIME* show_menu2 |
|
| 514 |
// is called (i.e. where the database is loaded) then the info won't |
|
| 515 |
// exist anyhow. |
|
| 516 |
$fields = 'parent,page_id,menu_title,page_title,link,target,level,visibility,viewing_groups'; |
|
| 517 |
if (version_compare(WB_VERSION, '2.7', '>=')) { // WB 2.7+
|
|
| 518 |
$fields .= ',viewing_users'; |
|
| 519 |
} |
|
| 520 |
if ($flags & SM2_ALLINFO) {
|
|
| 521 |
$fields = '*'; |
|
| 522 |
} |
|
| 523 |
|
|
| 524 |
// we request all matching rows from the database for the menu that we |
|
| 525 |
// are about to create it is cheaper for us to get everything we need |
|
| 526 |
// from the database once and create the menu from memory then make |
|
| 527 |
// multiple calls to the database. |
|
| 528 |
$sql = "SELECT $fields FROM ".TABLE_PREFIX. |
|
| 529 |
"pages WHERE $wb->extra_where_sql $menuLimitSql ". |
|
| 530 |
'ORDER BY level ASC, position ASC'; |
|
| 531 |
$sql = str_replace('hidden', 'IGNOREME', $sql); // we want the hidden pages
|
|
| 532 |
$oRowset = $database->query($sql); |
|
| 533 |
if (is_object($oRowset) && $oRowset->numRows() > 0) {
|
|
| 534 |
// create an in memory array of the database data based on the item's parent. |
|
| 535 |
// The array stores all elements in the correct display order. |
|
| 536 |
while ($page = $oRowset->fetchRow()) {
|
|
| 537 |
// ignore all pages that the current user is not permitted to view |
|
| 538 |
if(version_compare(WB_VERSION, '2.7', '>=')) { // WB >= 2.7
|
|
| 539 |
// 1. hidden pages aren't shown unless they are on the current page |
|
| 540 |
if ($page['visibility'] == 'hidden') {
|
|
| 541 |
$page['sm2_hide'] = true; |
|
| 542 |
} |
|
| 543 |
|
|
| 544 |
// 2. all pages with no active sections (unless it is the top page) are ignored |
|
| 545 |
else if (!$wb->page_is_active($page) && $page['link'] != $wb->default_link && !INTRO_PAGE) {
|
|
| 546 |
continue; |
|
| 547 |
} |
|
| 548 |
|
|
| 549 |
// 3. all pages not visible to this user (unless always visible to registered users) are ignored |
|
| 550 |
else if (!$wb->page_is_visible($page) && $page['visibility'] != 'registered') {
|
|
| 551 |
continue; |
|
| 552 |
} |
|
| 553 |
} |
|
| 554 |
|
|
| 555 |
// ensure that we have an array entry in the table to add this to |
|
| 556 |
$idx = $page['parent']; |
|
| 557 |
if (!array_key_exists($idx, $rgParent)) {
|
|
| 558 |
$rgParent[$idx] = array(); |
|
| 559 |
} |
|
| 560 |
|
|
| 561 |
// mark our current page as being on the current path |
|
| 562 |
if ($page['page_id'] == $CURR_PAGE_ID) {
|
|
| 563 |
$page['sm2_is_curr'] = true; |
|
| 564 |
$page['sm2_on_curr_path'] = true; |
|
| 565 |
if ($flags & SM2_SHOWHIDDEN) |
|
| 566 |
{
|
|
| 567 |
// show hidden pages if active and SHOWHIDDEN flag supplied |
|
| 568 |
unset($page['sm2_hide']); |
|
| 569 |
} |
|
| 570 |
} |
|
| 571 |
|
|
| 572 |
// mark parents of the current page as such |
|
| 573 |
if (in_array($page['page_id'], $rgCurrParents)) {
|
|
| 574 |
$page['sm2_is_parent'] = true; |
|
| 575 |
$page['sm2_on_curr_path'] = true; |
|
| 576 |
if ($flags & SM2_SHOWHIDDEN) |
|
| 577 |
{
|
|
| 578 |
// show hidden pages if active and SHOWHIDDEN flag supplied |
|
| 579 |
unset($page['sm2_hide']); // don't hide a parent page |
|
| 580 |
} |
|
| 581 |
} |
|
| 582 |
|
|
| 583 |
// add the entry to the array |
|
| 584 |
$rgParent[$idx][] = $page; |
|
| 585 |
} |
|
| 586 |
} |
|
| 587 |
unset($oRowset); |
|
| 588 |
|
|
| 589 |
// mark all elements that are siblings of any element on the current path |
|
| 590 |
foreach ($rgCurrParents as $x) {
|
|
| 591 |
if (array_key_exists($x, $rgParent)) {
|
|
| 592 |
foreach (array_keys($rgParent[$x]) as $y) {
|
|
| 593 |
$mark =& $rgParent[$x][$y]; |
|
| 594 |
$mark['sm2_path_sibling'] = true; |
|
| 595 |
unset($mark); |
|
| 596 |
} |
|
| 597 |
} |
|
| 598 |
} |
|
| 599 |
|
|
| 600 |
// mark all elements that have children and are siblings of the current page |
|
| 601 |
$parentId = $pageParent; |
|
| 602 |
foreach (array_keys($rgParent) as $x) {
|
|
| 603 |
$childSet =& $rgParent[$x]; |
|
| 604 |
foreach (array_keys($childSet) as $y) {
|
|
| 605 |
$mark =& $childSet[$y]; |
|
| 606 |
if (array_key_exists($mark['page_id'], $rgParent)) {
|
|
| 607 |
$mark['sm2_has_child'] = true; |
|
| 608 |
} |
|
| 609 |
if ($mark['parent'] == $parentId && $mark['page_id'] != $CURR_PAGE_ID) {
|
|
| 610 |
$mark['sm2_is_sibling'] = true; |
|
| 611 |
} |
|
| 612 |
unset($mark); |
|
| 613 |
} |
|
| 614 |
unset($childSet); |
|
| 615 |
} |
|
| 616 |
|
|
| 617 |
// mark all children of the current page. We don't do this when |
|
| 618 |
// $CURR_PAGE_ID is 0, as 0 is the parent of everything. |
|
| 619 |
// $CURR_PAGE_ID == 0 occurs on special pages like search results |
|
| 620 |
// when no referrer is available.s |
|
| 621 |
if ($CURR_PAGE_ID != 0) {
|
|
| 622 |
sm2_mark_children($rgParent, $CURR_PAGE_ID, 1); |
|
| 623 |
} |
|
| 624 |
|
|
| 625 |
// store the complete processed menu data as a global. We don't |
|
| 626 |
// need to read this from the database anymore regardless of how |
|
| 627 |
// many menus are displayed on the same page. |
|
| 628 |
if (!array_key_exists('show_menu2_data', $GLOBALS)) {
|
|
| 629 |
$GLOBALS['show_menu2_data'] = array(); |
|
| 630 |
} |
|
| 631 |
$GLOBALS['show_menu2_data'][$aMenu] =& $rgParent; |
|
| 632 |
unset($rgParent); |
|
| 633 |
} |
|
| 634 |
|
|
| 635 |
// adjust $aMaxLevel to the level number of the final level that |
|
| 636 |
// will be displayed. That is, we display all levels <= aMaxLevel. |
|
| 637 |
if ($aMaxLevel == SM2_ALL) {
|
|
| 638 |
$aMaxLevel = 1000; |
|
| 639 |
} |
|
| 640 |
elseif ($aMaxLevel < 0) { // SM2_CURR+N
|
|
| 641 |
$aMaxLevel += $pageLevel - SM2_CURR; |
|
| 642 |
} |
|
| 643 |
elseif ($aMaxLevel >= SM2_MAX) { // SM2_MAX+N
|
|
| 644 |
$aMaxLevel += $aStartLevel - SM2_MAX; |
|
| 645 |
if ($aMaxLevel > $pageLevel) {
|
|
| 646 |
$aMaxLevel = $pageLevel; |
|
| 647 |
} |
|
| 648 |
} |
|
| 649 |
else { // SM2_START+N
|
|
| 650 |
$aMaxLevel += $aStartLevel - SM2_START; |
|
| 651 |
} |
|
| 652 |
|
|
| 653 |
// generate the menu |
|
| 654 |
$retval = false; |
|
| 655 |
if (array_key_exists($aStart, $GLOBALS['show_menu2_data'][$aMenu])) {
|
|
| 656 |
$formatter = $aItemOpen; |
|
| 657 |
if (!is_object($aItemOpen)) {
|
|
| 658 |
static $sm2formatter; |
|
| 659 |
if (!isset($sm2formatter)) {
|
|
| 660 |
$sm2formatter = new SM2_Formatter; |
|
| 661 |
} |
|
| 662 |
$formatter = $sm2formatter; |
|
| 663 |
$formatter->set($flags, $aItemOpen, $aItemClose, |
|
| 664 |
$aMenuOpen, $aMenuClose, $aTopItemOpen, $aTopMenuOpen); |
|
| 665 |
} |
|
| 666 |
|
|
| 667 |
// adjust the level until we show everything and ignore the SM2_TRIM flag. |
|
| 668 |
// Usually this will be less than the start level to disable it. |
|
| 669 |
$showAllLevel = $aStartLevel - 1; |
|
| 670 |
if (isset($aOptions['notrim'])) {
|
|
| 671 |
$showAllLevel = $aStartLevel + $aOptions['notrim']; |
|
| 672 |
} |
|
| 673 |
|
|
| 674 |
// display the menu |
|
| 675 |
$formatter->initialize(); |
|
| 676 |
sm2_recurse( |
|
| 677 |
$GLOBALS['show_menu2_data'][$aMenu], |
|
| 678 |
$aStart, // parent id to start displaying sub-menus |
|
| 679 |
$aStartLevel, $showAllLevel, $aMaxLevel, $flags, |
|
| 680 |
$formatter); |
|
| 681 |
$formatter->finalize(); |
|
| 682 |
|
|
| 683 |
// if we are returning something, get the data |
|
| 684 |
if (($flags & SM2_BUFFER) != 0) {
|
|
| 685 |
$retval = $formatter->getOutput(); |
|
| 686 |
} |
|
| 687 |
} |
|
| 688 |
|
|
| 689 |
// clear the data if we aren't caching it |
|
| 690 |
if (($flags & SM2_NOCACHE) != 0) {
|
|
| 691 |
unset($GLOBALS['show_menu2_data'][$aMenu]); |
|
| 692 |
} |
|
| 693 |
|
|
| 694 |
return $retval; |
|
| 695 |
} |
|
| 696 |
|
|
| 697 |
function sm2_mark_children(&$rgParent, $aStart, $aChildLevel) |
|
| 698 |
{
|
|
| 699 |
if (array_key_exists($aStart, $rgParent)) {
|
|
| 700 |
foreach (array_keys($rgParent[$aStart]) as $y) {
|
|
| 701 |
$mark =& $rgParent[$aStart][$y]; |
|
| 702 |
$mark['sm2_child_level'] = $aChildLevel; |
|
| 703 |
$mark['sm2_on_curr_path'] = true; |
|
| 704 |
sm2_mark_children($rgParent, $mark['page_id'], $aChildLevel+1); |
|
| 705 |
} |
|
| 706 |
} |
|
| 707 |
} |
|
| 708 |
|
|
| 709 |
function sm2_recurse( |
|
| 710 |
&$rgParent, $aStart, |
|
| 711 |
$aStartLevel, $aShowAllLevel, $aMaxLevel, $aFlags, |
|
| 712 |
&$aFormatter |
|
| 713 |
) |
|
| 714 |
{
|
|
| 715 |
global $wb; |
|
| 716 |
|
|
| 717 |
// on entry to this function we know that there are entries for this |
|
| 718 |
// parent and all entries for that parent are being displayed. We also |
|
| 719 |
// need to check if any of the children need to be displayed too. |
|
| 720 |
$isListOpen = false; |
|
| 721 |
$currentLevel = $wb->page['level'] == '' ? 0 : $wb->page['level']; |
|
| 722 |
|
|
| 723 |
// get the number of siblings skipping the hidden pages so we can pass |
|
| 724 |
// this in and check if the item is first or last |
|
| 725 |
$sibCount = 0; |
|
| 726 |
foreach ($rgParent[$aStart] as $page) {
|
|
| 727 |
if (!array_key_exists('sm2_hide', $page)) $sibCount++;
|
|
| 728 |
} |
|
| 729 |
|
|
| 730 |
$currSib = 0; |
|
| 731 |
foreach ($rgParent[$aStart] as $page) {
|
|
| 732 |
// skip all hidden pages |
|
| 733 |
if (array_key_exists('sm2_hide', $page)) { // not set if false, so existence = true
|
|
| 734 |
continue; |
|
| 735 |
} |
|
| 736 |
|
|
| 737 |
$currSib++; |
|
| 738 |
|
|
| 739 |
// skip any elements that are lower than the maximum level |
|
| 740 |
$pageLevel = $page['level']; |
|
| 741 |
if ($pageLevel > $aMaxLevel) {
|
|
| 742 |
continue; |
|
| 743 |
} |
|
| 744 |
|
|
| 745 |
// this affects ONLY the top level |
|
| 746 |
if ($aStart == 0 && ($aFlags & SM2_CURRTREE)) {
|
|
| 747 |
if (!array_key_exists('sm2_on_curr_path', $page)) { // not set if false, so existence = true
|
|
| 748 |
continue; |
|
| 749 |
} |
|
| 750 |
$sibCount = 1; |
|
| 751 |
} |
|
| 752 |
|
|
| 753 |
// trim the tree as appropriate |
|
| 754 |
if ($aFlags & SM2_SIBLING) {
|
|
| 755 |
// parents, and siblings and children of current only |
|
| 756 |
if (!array_key_exists('sm2_on_curr_path', $page) // not set if false, so existence = true
|
|
| 757 |
&& !array_key_exists('sm2_is_sibling', $page) // not set if false, so existence = true
|
|
| 758 |
&& !array_key_exists('sm2_child_level', $page)) { // not set if false, so existence = true
|
|
| 759 |
continue; |
|
| 760 |
} |
|
| 761 |
} |
|
| 762 |
else if ($aFlags & SM2_TRIM) {
|
|
| 763 |
// parents and siblings of parents |
|
| 764 |
if ($pageLevel > $aShowAllLevel // permit all levels to be shown |
|
| 765 |
&& !array_key_exists('sm2_on_curr_path', $page) // not set if false, so existence = true
|
|
| 766 |
&& !array_key_exists('sm2_path_sibling', $page)) { // not set if false, so existence = true
|
|
| 767 |
continue; |
|
| 768 |
} |
|
| 769 |
} |
|
| 770 |
elseif ($aFlags & SM2_CRUMB) {
|
|
| 771 |
// parents only |
|
| 772 |
if (!array_key_exists('sm2_on_curr_path', $page) // not set if false, so existence = true
|
|
| 773 |
|| array_key_exists('sm2_child_level', $page)) { // not set if false, so existence = true
|
|
| 774 |
continue; |
|
| 775 |
} |
|
| 776 |
} |
|
| 777 |
|
|
| 778 |
// depth first traverse |
|
| 779 |
$nextParent = $page['page_id']; |
|
| 780 |
|
|
| 781 |
// display the current element if we have reached the start level |
|
| 782 |
if ($pageLevel >= $aStartLevel) {
|
|
| 783 |
// massage the link into the correct form |
|
| 784 |
if(!INTRO_PAGE && $page['link'] == $wb->default_link) {
|
|
| 785 |
$url = WB_URL; |
|
| 786 |
} |
|
| 787 |
else {
|
|
| 788 |
$url = $wb->page_link($page['link']); |
|
| 789 |
} |
|
| 790 |
|
|
| 791 |
// we open the list only when we absolutely need to |
|
| 792 |
if (!$isListOpen) {
|
|
| 793 |
$aFormatter->startList($page, $url); |
|
| 794 |
$isListOpen = true; |
|
| 795 |
} |
|
| 796 |
|
|
| 797 |
$aFormatter->startItem($page, $url, $currSib, $sibCount); |
|
| 798 |
} |
|
| 799 |
|
|
| 800 |
// display children as appropriate |
|
| 801 |
if ($pageLevel + 1 <= $aMaxLevel |
|
| 802 |
&& array_key_exists('sm2_has_child', $page)) { // not set if false, so existence = true
|
|
| 803 |
sm2_recurse( |
|
| 804 |
$rgParent, $nextParent, // parent id to start displaying sub-menus |
|
| 805 |
$aStartLevel, $aShowAllLevel, $aMaxLevel, $aFlags, |
|
| 806 |
$aFormatter); |
|
| 807 |
} |
|
| 808 |
|
|
| 809 |
// close the current element if appropriate |
|
| 810 |
if ($pageLevel >= $aStartLevel) {
|
|
| 811 |
$aFormatter->finishItem($pageLevel, $page); |
|
| 812 |
} |
|
| 813 |
} |
|
| 814 |
|
|
| 815 |
// close the list if we opened one |
|
| 816 |
if ($isListOpen) {
|
|
| 817 |
$aFormatter->finishList(); |
|
| 818 |
} |
|
| 819 |
} |
|
| 820 |
|
|
| 821 |
?> |
|
| 1 |
<?php |
|
| 2 |
/** |
|
| 3 |
* |
|
| 4 |
* @category module |
|
| 5 |
* @package show_menu2 |
|
| 6 |
* @author WebsiteBaker Project |
|
| 7 |
* @copyright 2004-2009, Ryan Djurovich |
|
| 8 |
* @copyright 2009-2010, Website Baker Org. e.V. |
|
| 9 |
* @link http://www.websitebaker2.org/ |
|
| 10 |
* @license http://www.gnu.org/licenses/gpl.html |
|
| 11 |
* @platform WebsiteBaker 2.7.0 | 2.8.x |
|
| 12 |
* @requirements PHP 4.4.9 and higher |
|
| 13 |
* @version $Id$ |
|
| 14 |
* @filesource $HeadURL$ |
|
| 15 |
* @lastmodified $Date$ |
|
| 16 |
* |
|
| 17 |
*/ |
|
| 18 |
|
|
| 19 |
define('SM2_ROOT', -1000);
|
|
| 20 |
define('SM2_CURR', -2000);
|
|
| 21 |
define('SM2_ALLMENU', -1);
|
|
| 22 |
define('SM2_START', 1000);
|
|
| 23 |
define('SM2_MAX', 2000);
|
|
| 24 |
define('SM2_ALL', 0x0001); // bit 0 (group 1) (Note: also used for max level!)
|
|
| 25 |
define('SM2_TRIM', 0x0002); // bit 1 (group 1)
|
|
| 26 |
define('SM2_CRUMB', 0x0004); // bit 2 (group 1)
|
|
| 27 |
define('SM2_SIBLING', 0x0008); // bit 3 (group 1)
|
|
| 28 |
define('SM2_NUMCLASS', 0x0010); // bit 4
|
|
| 29 |
define('SM2_ALLINFO', 0x0020); // bit 5
|
|
| 30 |
define('SM2_NOCACHE', 0x0040); // bit 6
|
|
| 31 |
define('SM2_PRETTY', 0x0080); // bit 7
|
|
| 32 |
define('SM2_ESCAPE', 0x0100); // bit 8
|
|
| 33 |
define('SM2_NOESCAPE', 0); // NOOP, unnecessary with WB 2.6.7+
|
|
| 34 |
define('SM2_BUFFER', 0x0200); // bit 9
|
|
| 35 |
define('SM2_CURRTREE', 0x0400); // bit 10
|
|
| 36 |
define('SM2_SHOWHIDDEN', 0x0800); // bit 11
|
|
| 37 |
define('SM2_XHTML_STRICT', 0x1000); // bit 12
|
|
| 38 |
define('SM2_NO_TITLE', 0x1001); // bit 13
|
|
| 39 |
|
|
| 40 |
define('_SM2_GROUP_1', 0x000F); // exactly one flag from group 1 is required
|
|
| 41 |
|
|
| 42 |
|
|
| 43 |
// Implement support for page_menu and show_menu using show_menu2. If you remove |
|
| 44 |
// the comments characters from the beginning of the following include, all menu |
|
| 45 |
// functions in Website Baker will be implemented using show_menu2. While it is |
|
| 46 |
// commented out, the original WB functions will be used. |
|
| 47 |
//include('legacy.php');
|
|
| 48 |
|
|
| 49 |
// This class is the default menu formatter for sm2. If desired, you can |
|
| 50 |
// create your own formatter class and pass the object into show_menu2 |
|
| 51 |
// as $aItemFormat. |
|
| 52 |
define('SM2_CONDITIONAL','if\s*\(([^\)]+)\)\s*{([^}]*)}\s*(?:else\s*{([^}]*)}\s*)?');
|
|
| 53 |
define('SM2_COND_TERM','\s*(\w+)\s*(<|<=|==|=|=>|>|!=)\s*([\w\-]+)\s*');
|
|
| 54 |
class SM2_Formatter |
|
| 55 |
{
|
|
| 56 |
var $output; |
|
| 57 |
var $flags; |
|
| 58 |
var $itemOpen; |
|
| 59 |
var $itemClose; |
|
| 60 |
var $menuOpen; |
|
| 61 |
var $menuClose; |
|
| 62 |
var $topItemOpen; |
|
| 63 |
var $topMenuOpen; |
|
| 64 |
|
|
| 65 |
var $isFirst; |
|
| 66 |
var $page; |
|
| 67 |
var $url; |
|
| 68 |
var $currSib; |
|
| 69 |
var $sibCount; |
|
| 70 |
var $currClass; |
|
| 71 |
var $prettyLevel; |
|
| 72 |
|
|
| 73 |
// output the data |
|
| 74 |
function output($aString) {
|
|
| 75 |
if ($this->flags & SM2_BUFFER) {
|
|
| 76 |
$this->output .= $aString; |
|
| 77 |
} |
|
| 78 |
else {
|
|
| 79 |
echo $aString; |
|
| 80 |
} |
|
| 81 |
} |
|
| 82 |
|
|
| 83 |
// set the default values for all of our formatting items |
|
| 84 |
function set($aFlags, $aItemOpen, $aItemClose, $aMenuOpen, $aMenuClose, $aTopItemOpen, $aTopMenuOpen) {
|
|
| 85 |
$this->flags = $aFlags; |
|
| 86 |
$this->itemOpen = is_string($aItemOpen) ? $aItemOpen : '[li][a][menu_title]</a>'; |
|
| 87 |
$this->itemClose = is_string($aItemClose) ? $aItemClose : '</li>'; |
|
| 88 |
$this->menuOpen = is_string($aMenuOpen) ? $aMenuOpen : '[ul]'; |
|
| 89 |
$this->menuClose = is_string($aMenuClose) ? $aMenuClose : '</ul>'; |
|
| 90 |
$this->topItemOpen = is_string($aTopItemOpen) ? $aTopItemOpen : $this->itemOpen; |
|
| 91 |
$this->topMenuOpen = is_string($aTopMenuOpen) ? $aTopMenuOpen : $this->menuOpen; |
|
| 92 |
} |
|
| 93 |
|
|
| 94 |
// initialize the state of the formatter before anything is output |
|
| 95 |
function initialize() {
|
|
| 96 |
$this->output = ''; |
|
| 97 |
$this->prettyLevel = 0; |
|
| 98 |
if ($this->flags & SM2_PRETTY) {
|
|
| 99 |
$this->output("\n<!-- show_menu2 -->");
|
|
| 100 |
} |
|
| 101 |
} |
|
| 102 |
|
|
| 103 |
// start a menu |
|
| 104 |
function startList(&$aPage, &$aUrl) {
|
|
| 105 |
$currClass = ''; |
|
| 106 |
$currItem = $this->menuOpen; |
|
| 107 |
|
|
| 108 |
// use the top level menu open if this is the first menu |
|
| 109 |
if ($this->topMenuOpen) {
|
|
| 110 |
$currItem = $this->topMenuOpen; |
|
| 111 |
$currClass .= ' menu-top'; |
|
| 112 |
$this->topMenuOpen = false; |
|
| 113 |
} |
|
| 114 |
|
|
| 115 |
// add the numbered menu class only if requested |
|
| 116 |
if (($this->flags & SM2_NUMCLASS) == SM2_NUMCLASS) {
|
|
| 117 |
$currClass .= ' menu-'.$aPage['level']; |
|
| 118 |
} |
|
| 119 |
|
|
| 120 |
$this->prettyLevel += 1; |
|
| 121 |
|
|
| 122 |
// replace all keywords in the output |
|
| 123 |
if ($this->flags & SM2_PRETTY) {
|
|
| 124 |
$this->output("\n".str_repeat(' ',$this->prettyLevel).
|
|
| 125 |
$this->format($aPage, $aUrl, $currItem, $currClass)); |
|
| 126 |
} |
|
| 127 |
else {
|
|
| 128 |
$this->output($this->format($aPage, $aUrl, $currItem, $currClass)); |
|
| 129 |
} |
|
| 130 |
|
|
| 131 |
$this->prettyLevel += 3; |
|
| 132 |
} |
|
| 133 |
|
|
| 134 |
// start an item within the menu |
|
| 135 |
function startItem(&$aPage, &$aUrl, $aCurrSib, $aSibCount) {
|
|
| 136 |
// generate our class list |
|
| 137 |
$currClass = ''; |
|
| 138 |
if (($this->flags & SM2_NUMCLASS) == SM2_NUMCLASS) {
|
|
| 139 |
$currClass .= ' menu-'.$aPage['level']; |
|
| 140 |
} |
|
| 141 |
if (array_key_exists('sm2_has_child', $aPage)) {
|
|
| 142 |
// not set if false, so existence = true |
|
| 143 |
$currClass .= ' menu-expand'; |
|
| 144 |
} |
|
| 145 |
if (array_key_exists('sm2_is_curr', $aPage)) {
|
|
| 146 |
$currClass .= ' menu-current'; |
|
| 147 |
} |
|
| 148 |
elseif (array_key_exists('sm2_is_parent', $aPage)) {
|
|
| 149 |
// not set if false, so existence = true |
|
| 150 |
$currClass .= ' menu-parent'; |
|
| 151 |
} |
|
| 152 |
elseif (array_key_exists('sm2_is_sibling', $aPage)) {
|
|
| 153 |
// not set if false, so existence = true |
|
| 154 |
$currClass .= ' menu-sibling'; |
|
| 155 |
} |
|
| 156 |
elseif (array_key_exists('sm2_child_level',$aPage)) {
|
|
| 157 |
// not set if not a child |
|
| 158 |
$currClass .= ' menu-child'; |
|
| 159 |
if (($this->flags & SM2_NUMCLASS) == SM2_NUMCLASS) {
|
|
| 160 |
$currClass .= ' menu-child-'.($aPage['sm2_child_level']-1); |
|
| 161 |
} |
|
| 162 |
} |
|
| 163 |
if ($aCurrSib == 1) {
|
|
| 164 |
$currClass .= ' menu-first'; |
|
| 165 |
} |
|
| 166 |
if ($aCurrSib == $aSibCount) {
|
|
| 167 |
$currClass .= ' menu-last'; |
|
| 168 |
} |
|
| 169 |
|
|
| 170 |
// use the top level item if this is the first item |
|
| 171 |
$currItem = $this->itemOpen; |
|
| 172 |
if ($this->topItemOpen) {
|
|
| 173 |
$currItem = $this->topItemOpen; |
|
| 174 |
$this->topItemOpen = false; |
|
| 175 |
} |
|
| 176 |
|
|
| 177 |
// replace all keywords in the output |
|
| 178 |
if ($this->flags & SM2_PRETTY) {
|
|
| 179 |
$this->output("\n".str_repeat(' ',$this->prettyLevel));
|
|
| 180 |
} |
|
| 181 |
$this->output($this->format($aPage, $aUrl, $currItem, $currClass, $aCurrSib, $aSibCount)); |
|
| 182 |
} |
|
| 183 |
|
|
| 184 |
// find and replace all keywords, setting the state variables first |
|
| 185 |
function format(&$aPage, &$aUrl, &$aCurrItem, &$aCurrClass, |
|
| 186 |
$aCurrSib = 0, $aSibCount = 0) |
|
| 187 |
{
|
|
| 188 |
$this->page = &$aPage; |
|
| 189 |
$this->url = &$aUrl; |
|
| 190 |
$this->currClass = trim($aCurrClass); |
|
| 191 |
$this->currSib = $aCurrSib; |
|
| 192 |
$this->sibCount = $aSibCount; |
|
| 193 |
|
|
| 194 |
$item = $this->format2($aCurrItem); |
|
| 195 |
|
|
Also available in: Unified diff
XHTML output fixed in show_menu2