AW: Eigenes Menü für eigenes Template - Wie?
Ok, dann versuche ich mal zu erklären.
Also.... Joomla trennt seit der Version 1.5 die Programmlogik von der Ausgabe.
Hierzu wird das MVC Entwurfsmuster genutzt, wobei MVC für Model,View und Controller steht.
Wenn nun in Joomla ein Modul oder eine Komponente aufgerufen wird passiert folgendes.
Joomla ruft als erstes den Controller auf, dieser anlaysiert die an ihm übergebenen Tasks(URL oder GET/POST usw.).
Diesen Task gibt der Contoller an das Model weiter, welches denn Task auswertet und die relevanten Daten an denn Controller zurückgibt.
Als letztes ruft der Controller denn View auf, und übergibt die gesammelten Daten, woraus dann die Ausgabe generiert wird.
Mit einem Override kann man nun an diesem letzten Punkt eingreifen und die Ausgabe der Daten anpassen ohne dabei die Programmlogik(Controller/Model) zu verändern.
Ok soweit die allgm. Theorie, jetzt zu deinem speziellem Problem.
Wir wissen nun das wir nur denn View überschreiben können, aber wo finden wir denn?
Menüs im Frontend werden vom Modul mod_menu generiert.
Wenn du das Verzeichnis öffnest findest du:
das model -> helper.php
denn Controller -> mod_menu.php
eine Konfigurations datei -> mod_menu.xml
und ein tmpl Verzeichnis in dem sich die Views befinden.
In diesem Verzeichnis befindet sich unter anderen der Standard View mit dem Namen default.php.
So sieht er aus:
PHP:
<?php
/**
* @package Joomla.Site
* @subpackage mod_menu
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access.
defined('_JEXEC') or die;
// Note. It is important to remove spaces between elements.
?>
<ul class="menu<?php echo $class_sfx;?>"<?php
$tag = '';
if ($params->get('tag_id')!=NULL) {
$tag = $params->get('tag_id').'';
echo ' id="'.$tag.'"';
}
?>>
<?php
foreach ($list as $i => &$item) :
$class = 'item-'.$item->id;
if ($item->id == $active_id) {
$class .= ' current';
}
if (in_array($item->id, $path)) {
$class .= ' active';
}
elseif ($item->type == 'alias') {
$aliasToId = $item->params->get('aliasoptions');
if (count($path) > 0 && $aliasToId == $path[count($path)-1]) {
$class .= ' active';
}
elseif (in_array($aliasToId, $path)) {
$class .= ' alias-parent-active';
}
}
if ($item->deeper) {
$class .= ' deeper';
}
if ($item->parent) {
$class .= ' parent';
}
if (!empty($class)) {
$class = ' class="'.trim($class) .'"';
}
echo '<li'.$class.'>';
// Render the menu item.
switch ($item->type) :
case 'separator':
case 'url':
case 'component':
require JModuleHelper::getLayoutPath('mod_menu', 'default_'.$item->type);
break;
default:
require JModuleHelper::getLayoutPath('mod_menu', 'default_url');
break;
endswitch;
// The next item is deeper.
if ($item->deeper) {
echo '<ul>';
}
// The next item is shallower.
elseif ($item->shallower) {
echo '</li>';
echo str_repeat('</ul></li>', $item->level_diff);
}
// The next item is on the same level.
else {
echo '</li>';
}
endforeach;
?></ul>
Der geübte PHP-Coder erkennt sofort: Hier wird eine <UL> Liste mit Class und ID Attributen zusammengebaut.
Wir kopieren also diese Datei in unser Template-Verzeichnis:
DEIN_TEMPLATE/html/mod_menu/default.php
Wir könnten nun alles mögliche in diese neue Datei reinschreiben und Joomla würde es ohne zu murren einfach ausgeben. Wollen wir aber ja nicht!
Wir wollen ja mit denn Daten aus dem Backend weiterarbeiten, also müssen wir wissen welche das sind und wo diese herkommen.
Um das heraus zu finden müssen wir wieder in denn Controller von mod_menu schauen: mod_menu/mod_menu.php
da steht dann folgendes:
PHP:
<?php
/**
* @package Joomla.Site
* @subpackage mod_menu
* @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// no direct access
defined('_JEXEC') or die;
// Include the syndicate functions only once
require_once dirname(__FILE__).'/helper.php';
$list = modMenuHelper::getList($params);
$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$active_id = isset($active) ? $active->id : $menu->getDefault()->id;
$path = isset($active) ? $active->tree : array();
$showAll = $params->get('showAllChildren');
$class_sfx = htmlspecialchars($params->get('class_sfx'));
if(count($list)) {
require JModuleHelper::getLayoutPath('mod_menu', $params->get('layout', 'default'));
}
Hier wird die helper Klasse eingebunden und aufgerufen sowie verschiedene Modul Parameter initailisiert. Alles zu erklären würde hier zu weit gehen und ich verweise hier mal auf auf die Doku ->
http://docs.joomla.org/Module_Development
Für uns am wichtigsten ist dieser Methoden Aufruf:
PHP:
$list = modMenuHelper::getList($params);
Hier wird das eigentliche Menü-Objekt erzeugt, welches wir uns über var_dump() anzeigen lassen können, es steuert die foreach-schleife im View und erzeugt die menü Items.
Um jetzt ein Menü von Stu Nicolls zu verwenden brauchen wir aber eigentlich gar nicht viel verändern.
Stu benutzt meisten Menüs die auf standard <ul> listen aufbauen, genau wie Joomla das auch macht. Alles was anders ist sind die CSS-Klassen und ID´s.
Joomlas CSS-Klassen für verschieden Menü-Ebenen sind 'hard-coded'.
z.B.:
PHP:
$class .= ' active';
$class = 'item-'.$item->id;
Wir müssen also diese Klassen nur an das CSS von Stu anpassen(Die CSS Coder werden jetzt aufschreien und behaupten das geht auch umgekehrt... und sie haben damit natürlich absolut recht :lol
.
So ich hoffe das war soweit verständlich und hilft dir weiter.