私は新しいコンポーネントに取り組んでおり、特定のアクションでアクセスが拒否されたときにメニュー項目にルーティングできるようにしたいと考えています。
テーブルにmenu_idフィールドを作成し、menuitemフォームフィールドタイプを使用してメニューitemIdを格納しています。
私はコントローラのsetRedirect関数を次のように使用できると思いました
if($isRestricted && !$canDownload)
{
$msg = $this->translate('COM_BABELU_PRODUCTS_DL_NOT_AUTHORISED');
$this->setRedirect('index.php?itemId=101', $msg, 'warning');
return false;
}
しかし、それはうまくいきませんでした。ルートにアイテムIDを追加した
http://mysite.com/previous-menu-item-alias?itemId=101
これは、ID 101のメニュー項目に関連付けられたビューもロードしませんでした。
ルート全体を指定する必要がありますか? I.E. #__menusテーブルからリンクを検索し、その値でJRouteを呼び出しますか?
誰かがこれで経験を持っているなら、私は本当にどんな情報にも感謝します。
----編集---これを行う前に、#__ menusテーブルを直接クエリしてリンク値を取得し、それをJRouteにプッシュしました。ただし、直接的な依存関係を作成するため、テーブルに直接クエリを実行するという考えは好きではありません。私が本当に知りたいのは、#__ menusテーブルに触れずにリンク値を取得する方法、またはitemIdだけを使用してメニュー項目に移動する方法があるかどうかです。
はい。答えを見つけました。
まず、#__menus
テーブルをクエリせずにアイテム情報を取得するには、次のコードを使用します。
$app = JFactory::getApplication();
$menu = $app->getMenu();
$item = $menu->getItem($itemId);
適切なルートを使用したいので、リダイレクトは少し難しいですが、ルートをJRouteに送信しただけでは、JRoute
が現在のアクティブなアイテムにURLコンテンツを追加するだけなので、エラーになります。以下の例はコントローラーから呼び出されています。
例:
//current url = http://mysite.com/product
//$item->route = my-page
$this->setRedirect(JRoute::_($item->route));
$this->redirect();
//resulting url = http://mysite.com/product/my-page
もちろん、このルートが存在しないため、これは404をスローします。 「製品」は私のコンポーネントの一部です「マイページ」はcom_content記事アイテムです。
ただし、URIを追加することでこれを回避できます。
$route = $item->route;
If((int)$item->home === 1)// its the home menu item, so clear the route
{
$route = '';
}
$this->setRedirect(JURI::base().$route);
$this->redirect();
// resulting url = http://mysite.com/my-page
これを$item->link
と$item->route
でテストしたところ、同じように機能するようです。サイトが検索エンジン向けのURLを使用していない場合に備えて、おそらくリンクを使用する方が良いでしょう。
これが役に立てば幸いです!