質問: urlでitemidを取得し、jrouteに渡す方法 カスタムコンポーネントの特定のビューのメニュー項目があります。このメニュー項目に添付されているので、標準テンプレートではなく、別の_template style_を選択しています。メニューからビューにアクセスすると、itemidというurlにアタッチされるため、うまく機能します。次に、jrouteを使用してビューを別のビューとリンクしたいのですが、jrouteが目的のurlを生成していません。echo jroute::_('index.php?option=com_example&view=reporting');_/index.php?option=com_example&view=reporting_jrouteは、itemidをurlに追加しないため、メニュー項目の選択されたテンプレートスタイルが機能しなくなります。itemidを "計算"する方法はありますか(列linkでテーブル_jos_menu_でクエリを実行することを除いて)、それをjrouteにアタッチしますか?
回答: ここで重要なのは、適切なメニュー項目を検索して選択するロジックを備えたコンポーネント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値に基づいて最適な一致を見つけます。右に行くほどマッチすると思います!