Der Schlüssel hier ist die Einrichtung Ihrer Komponente router.php-Datei (die sich im Stammverzeichnis Ihrer Komponente im Front-End befindet) mit Logik, die nach dem entsprechenden Menüpunkt sucht und diesen auswählt. Ich würde gerne sehen, dass dies automatisch geschieht, aber soweit ich weiß, ist dies nicht der Fall.
Es ist wahrscheinlich am besten, diesen Codeblock in eine Art Hilfsfunktion einzuarbeiten, mit der automatisch das am besten passende Menüelement für den Inhalt gefunden werden kann.
Hier ist der Code, den ich in einigen meiner benutzerdefinierten Komponenten verwendet habe, um das am besten passende Menüelement zu erhalten:
// I use this first empty array to avoid having unset properties in my query
$base_array = array('Itemid'=>'', 'option'=>'', 'view'=>'', 'layout'=>'', 'id'=>'');
$app =& JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
// hack to protect the actual current item as well as the search module or other places that use JRoute::_('index.php');
if (count($query)==2 && isset($query['option']) && isset($query['Itemid']) && $query['option'] && $query['Itemid']) {
return $segments;
}
// start with no match found
$match = false;
$match_level = 0;
$query += $base_array;
// we want to find a menu item for this if possible. If the active menu item is the current menu item then we should see if there is a better match.
if (empty($query['Itemid']) || ($query['Itemid'] == $active->id && empty($query['task']))) {
// load all menu items
$items = $menu->getMenu();
// use the current item over others if it ties for the best match
if ($active->query['option'] == $query['option']) {
$match_level = 1;
$match = $active;
if ($active->query['view'] == $query['view']) {
$match_level = 2;
if ($active->query['layout'] == $query['layout'] || ($query['layout']=='default' && !$active->query['layout'])) {
$match_level = 3;
if ($active->query['id'] == $query['id']) {
$match_level = 4;
}
}
}
}
// loop through each menu item in order
foreach ($items as $item) {
$item->query += $base_array;
// base check is that it is for this component
// then cycle through each possibility finding it's match level
if ($item->query['option'] == $query['option']) {
$item_match = 1;
if ($item->query['view'] == $query['view']) {
$item_match = 2;
if (!$query['layout'] && $item->query['layout']) {
$query['layout'] = 'default';
}
if ($item->query['layout'] == $query['layout'] || ($query['layout']=='default' && !$item->query['layout'])) {
$item_match = 3;
if ($item->query['id'] == $query['id']) {
$item_match = 4;
}
}
}
}
// if this item is a better match than our current match, set it as the best match
if ($item_match > $match_level) {
$match = $item;
$match_level = $item_match;
}
}
// if there is a match update Itemid to match that menu item
if ($match) {
$query['Itemid'] = $match->id;
$menuItem = $menu->getItem($match->id);
} else {
$menuItem = $menu->getActive();
}
}
All dies ist eine Art Chaos (und ich würde Verbesserungen lieben, wenn jemand sie hat!), Aber es wird die Arbeit erledigt. Wenn der aktuelle Menüpunkt der beste ist, bleibt er immer dabei.
Andernfalls sollte die beste Übereinstimmung basierend auf Komponentenname -> Ansichtsname -> Layoutname -> ID-Wert gefunden werden. Je weiter rechts es passt, desto besser finde ich das Spiel!