web-dev-qa-db-ja.com

コンポーネント内からメニュー項目へのルートを設定する適切な方法は何ですか?

私は新しいコンポーネントに取り組んでおり、特定のアクションでアクセスが拒否されたときにメニュー項目にルーティングできるようにしたいと考えています。

テーブルに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だけを使用してメニュー項目に移動する方法があるかどうかです。

1
Mathew Lenning

はい。答えを見つけました。

まず、#__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を使用していない場合に備えて、おそらくリンクを使用する方が良いでしょう。

これが役に立てば幸いです!

3
Mathew Lenning