1

ユーザーが必要な権限を持っていない場合、ユーザーにローカル タスクを表示する方法はありますか? 現在、Drupal はそれらをページ コードから除外しているようです。それらを表示したいのですが、CSS クラスが異なります。

Drupal のバージョンは 5.20 です

4

2 に答える 2

4

Drupal 5 と 6 の間でローカル タスクの構築に関していくつかの違いがありますが、現在のユーザーがアクセスできないエントリを無視するロジックが menu.inc 関数にかなり深く組み込まれているという Mac の意見は正しいです。自分で探したい場合theme_menu_local_tasks()は、そこから関数呼び出しを開始して追跡します。

あなたが探している機能を私が実装しなければならないとしたら、メニュー アクセス設定を直接いじるという Mac の提案は避けたいと思います。代わりに、カスタム バージョンで上書きtheme_menu_local_tasks()し、そこにエントリ取得ロジックを複製します。最初の実行では、以前と同様にプライマリ リンクとセカンダリ リンクをフェッチし、2 回目では別のユーザー(この場合はおそらくユーザー 1) になりすまして同じことを行います。そうすれば、ローカル タスク マークアップの 2 つのバージョンを取得し、現在のユーザーに許可されていないものを見つけるために何らかの方法で比較する必要があったため、追加の CSS クラスが必要になりました。

menu_primary_local_tasks()と がすでにテーマ化されたリストを返すので、これを行うのはまだいくぶん醜いことに注意してください。そのmenu_secondary_local_tasks()ため、比較はマークアップで動作する必要があり、おそらく何らかの方法で li タグを解析する必要があります。そのため、同じこと (2 人の異なるユーザーとしてローカル タスクをフェッチする) を試みるのに時間を費やす価値があるかもしれませんが、テーマを設定する前に、低レベルの関数を使用してエントリを取得します。

注:ユーザーの偽装ロジックを使用することになった場合は、偽装中のセッション保存を無効にする安全な 2 番目のバージョンを使用してください。

于 2009-11-24T09:42:46.627 に答える
3

私は hook_menu の D6 バージョンを D5 バージョンよりもはるかによく知っています。AFAIK - ただし、me​​nu.incでハードコーディングされているため、その動作をオーバーライドすることはできません。

上記のことが正しければ、回避策は次のようになります (かなり洗練されていないことは認めざるを得ません)。

  1. メニュー項目からアクセス制御を削除して、すべてのメニュー項目がすべてのユーザーに表示されるようにします。
  2. アクセス制御をコールバックに直接入れます (すぐにタブをクリックできないようにしますが、ユーザーが URL を直接挿入すると、表示してはいけないページへのアクセスが妨げられます)。
  3. タブが表示されているページで、ユーザーの役割に応じて異なる js ファイルを読み込みます。アクセスが制限されているユーザーの js ファイルは、テキスト コンテンツによってタブを選択します (少なくとも D6 では、タブは「個別の」クラスを取得しません。共通の「タブ」クラスのみを取得します)。ユーザーがアクセスする権限を持たないタブに、別の方法で表示する必要があるタブにカスタム クラスが追加されます。
  4. カスタム クラスに CSS テーマを追加します。

前に述べたように、私は D5 をあまり知りません。そのため、よりクリーンな方法で実際に目的を達成できることも判明するかもしれません。

于 2009-11-23T18:14:06.250 に答える