web-dev-qa-db-ja.com

コンポーネントコントローラでメニューパラメータとitemidを取得する方法

私のカスタムコンポーネントコントローラーには、関数save()があります。最後にメッセージを表示し、URLにリダイレクトします

$this->setMessage(JText::_('SOME_TEXT'));
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo', false));

次のことを行うのに問題があります。

1. JText文字列の代わりにカスタムフィールドのメニューパラメータを使用します。関数内でこれを使用する場合:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$message = $active->params->get('message');

私は通知とエラーを受け取ります:

Notice: Trying to get property of non-object...
Fatal error: Call to a member function get() on a non-object...

$ messageは、xmlファイルで定義されたカスタムメニューフィールドの名前です。ビューから直接呼び出す場合は問題ありません。

2.アクティブなメニューitemidを取得し、setRedirect()内で使用します。

次のように使用すると、URLに空のitemidが表示されます。

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo&Itemid='.$itemId, false));

コンポーネントのメニューパラメータの呼び出しに関する多くの情報を見つけましたが、どれも役に立ちませんでした

7
weezle

いくつかのテストの後、私は問題を再現することができました:

**フォームは、メニュー項目のないビューにリダイレクトするか、次のようなURLに相対的にそれ自体にリダイレクトします。

コンポーネント/ mycomponent/myview

(ビューにメニュー項目があるかどうかは関係ありません。これは愚かなJoomlaルーティングです。)**

したがって、エラーを防ぐために以下を実行する必要があります:

1)ビューはJoomlaバックエンドのメニュー項目とリンクする必要があります

2)フロントエンドのフォームへのURLは/ menu-aliasである必要があります

3)フォームアクションは別のビューにリダイレクトされるべきではなく、空である方が良い

4)フォームにはタスクの非表示の入力が含まれている必要があります

次に、コントローラでの投稿と保存のリダイレクトは、メニュー項目のコンテキスト(url)内で操作しているため、魅力的なように機能します。

ただし、現在のアイテムIDを保存せずに別のビューにリダイレクトするか、JRouteを介して同じビューにリダイレクトすると、メニューアイテムのコンテキスト( "component/mycomponent/myview")が終了します。

これはJoomlaで多く発生します。現在のルーターシステムは、データベース内のメニュー項目に対して指定されたURLをチェックしないためです。これを防ぐには、次のアクションを実行できます:

1)現在のURLのメニュー項目テーブルを検索し、項目ID /メニュー項目を返す関数を使用して、コンポーネントのルーターを拡張します。 (私は過去にそれをすでに行っており、それは機能します。)

2)アイテムID、タスク、ターゲットビューを含む非表示フィールドをフォームに追加します(Joomlaでの正しいルーティング方法)。

3)「component/mycomponent/myview」のようなURLを正しいURLパスにリダイレクトします。

4)すべてのビューのコンポーネントパラメータでフォールバックを設定できます。これにより、アイテムのIDがコンポーネントのパラメーターにチェーンされ、ビューはURLパスにチェーンされません。 View1->ドロップダウン->連鎖メニュー項目の選択

コントローラ内:

$ itemId = $ params-> get($ mycurrentviewname);

愚かなJoomlaルーティングシステムのため、絶対に必要でない場合は$ menu-> getActive()を使用しないでください。メニュー項目を手動で設定することをお勧めします。

質問に戻る:

私が言ったように、あなたのエラーはルーティングの初めのどこかにあります。これは、メニュー項目のないビューまたはitemIdを含まないURLにフォームを送信した後、フォームまたはリダイレクトにつながる単純なURLである可能性があります。

証明:

これを$ itemidと$ messageの間の保存関数に追加します。

if(empty($itemId)){

      $itemId = $app->input->get('Itemid', $itemId,'int');
      $active = $menu->getItem($itemId);
 }

次に、エラーメッセージを返すURLに「&task = save&Itemid = 101」を追加します。 (101をアイテムIDに変更してください!)

これで正しくリダイレ​​クトされるはずです。

2
Dennis Heiden

メニューパラメータを取得するには

これは完璧です。数時間検索したところ、Joomla 3.6.5&PHP 7.1の問題が解決しました。

0:オブジェクトコンテキストにないときに$ thisを使用する

ソリューション:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$menuparams         = $menu->getParams($itemId);
2
RadiusTheme

以下を使用します。

$menu           =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->id;

または

$menu =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->query['Itemid'];

メッセージが渡されるようにするには、アプリケーション入力からメッセージを取得する必要があります

$JInput = JFactory::getApplication()->input;
$message = $JInput->get('message','','string');
2
Terry Carter