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


7

私のカスタムコンポーネントコントローラーには関数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));

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


メニュー項目オブジェクトをvar_dumbできますか?var_dump($ active); ?私はカスタムコンポーネントでコードを試してみましたが、ヘルパーファイルとビューで機能しました。
Dennis Heiden

私が述べたように、それは私の見方でも機能していますが、コントローラーでは機能していません。
weezle

保存関数のコード(およびコントローラーの実装方法と呼び出し方法)とカスタムフィールドのxmlを入力してください。メインコンポーネントコントローラーでメニューパラメーターの読み込みをテストしましたが、うまくいきました。
Dennis Heiden

これは、components / com_jpainter / controller.php内の関数です。gist.github.com/ esedic / 6ed98466be93008ab777 コントローラーは、components / com_jpainter / jpainter.php gist.github.com/esedic/5fc78d8fd1ceed5e2f05からこのように呼び出され、これはコンポーネント 内のxmlです/com_jpainter/views/jpainter/tmpl/default.xml(fieldset advanced)gist.github.com/esedic/4cd7e9bf4f2a4253562d
weezle

おかげで、私は問題を再現しようとします。
Dennis Heiden

回答:


2

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

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

コンポーネント/ mycomponent / myview

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

したがって、エラーを防ぐために次のことを行う必要があります。

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

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

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

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

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

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

現在のルーターシステムは、データベース内のメニュー項目に対して指定されたURLをチェックしないため、これはJoomlaでよく起こります。これを防ぐには、次の操作を実行します。

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に変更してください!)

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


私は少し遅れていることを知っていますが、あなたの努力に感謝します。私はあなたのソリューションをテストしませんでした、私はタイトなスケジュールでいたので、私はそれを別の方法で解決することができました。
weezle

どのように問題を解決しましたか?
Dennis Heiden、2016年

私は急いでいたので、itemidをハードコードしました。私はあなたの解決策を将来実装することを試みます。
weezle

2

以下を使用します。

$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

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

これは完璧です。数時間検索していたところ、これにより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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.