web-dev-qa-db-ja.com

動的メニュー構造を構築する方法

2つの動的メニューを作成するモジュールを構築しています。1つのメインメニューはユーザーが属するグループ名(グループは異なるデータベースに由来)であり、2番目のメニューは固定セットのセカンダリメニューですメインメニューで選択したグループの特定のプロパティを操作するメニュー項目(たとえば、グループメンバーの表示)。

これを行うための良いアプローチは何でしょうか?モジュール内でメニューを作成する方法を示す この質問 が見つかりましたが、メニュー項目の動的な部分に取り組む方法がわかりません。各ユーザーは、ユーザーが所属するグループに応じて異なるメインメニューを持つことができ、セカンダリメニュー項目は、選択したメインメニュー項目のグループIDを渡す必要があります。 hook_menuの隣で、ワイルドカードを使って何かをする必要があると思いますが、メニューでそれらを扱ったことがないので、よくわかりません。

メニューをさまざまなテーマのプライマリメニューとセカンダリメニューのソースとして使用できるようにしたいので、別のテーマを選択してサイトの外観を柔軟に変更できます。 Drupal 7.を使用しています。

3
Whiskey

私はこれを行う方法を見つけましたが、これが正しいアプローチであるかどうか(そして非常に多くのグループとユーザーで悪いことが発生するかどうか)を知りたいと思っています。

両方のメニューは、モジュールのインストールファイルで hook_enable を使用して作成されます(開発モジュールは、これを行う方法の優れた例です)。

私のコメントで言うように、動的なメニュー項目を作成できないと思うので、各グループのメニュー項目を作成します(グループが追加されたら、 menu_rebuild を実行する必要があります) 。ユーザーにメニュー項目を表示する必要があるかどうかを判断するために、ユーザーがそのグループに属しているかどうかを確認するアクセスコールバックを作成しました。このコールバックはすべてのページ要求で呼び出されるため、常に機能します。

セカンダリメニューは、ワイルドカードとto_arg関数で機能します。たとえば、メニューアイテムは$ items ['pmenu /%get_groupid/grouppage']として設定され、関数get_groupid_to_arg($ arg)でarg(1)を使用してパスからグループIDを抽出しています。詳細は hook_men および メニューの例 )を参照してください。セカンダリメニュー項目も同じアクセスコールバックを使用して、ユーザーにメニュー項目が表示されるかどうかを確認します。

最後に、テーマに修正を適用する必要がありました。セカンダリメニュー項目が選択された場合、対応するプライマリまたは親メニュー項目(グループ)がアクティブに設定されないためです。 Marinelli を使用していて、 comment 14this issue のパッチを適用しました。これはうまくいかなかったので、 comment 16 で説明されているように、親をチェックするときにパスのみを確認するように少し変更しました。

2
Whiskey