여기서 핵심은 구성 요소 router.php 파일 (프론트 엔드 구성 요소의 루트 폴더에 있음)을 해당 메뉴 항목을 검색하고 선택하는 논리로 설정하는 것입니다. 나는 이것이 자동으로 일어나는 것을보고 싶지만, 내가 아는 한 이것은 사실이 아닙니다.
이 코드 블록을 컨텐츠에 가장 적합한 메뉴 항목을 자동으로 찾는 데 사용할 수있는 일부 유형의 도우미 기능으로 작동하는 것이 가장 좋습니다.
가장 적합한 메뉴 항목을 얻기 위해 여러 사용자 정의 구성 요소에서 사용한 코드는 다음과 같습니다.
// 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();
}
}
이 모든 것은 일종의 엉망입니다 (그리고 누군가가 있다면 개선을 좋아할 것입니다!).하지만 작업이 완료됩니다. 현재 메뉴 항목이 가장 일치하면 항상 해당 메뉴 항목을 사용합니다.
그렇지 않으면 구성 요소 이름->보기 이름-> 레이아웃 이름-> id 값을 기준으로 가장 일치하는 것을 찾아야합니다. 오른쪽으로 갈수록 더 잘 어울립니다!