メニューリンクを隠すコンテンツアクセスモジュール


10

Drupal 7でコンテンツアクセスモジュールを使用しています。特定のロールからのノードアクセスを制限すると、メニューのリンクも非表示になります。

メインメニューに制限されたリンクを表示する方法はありますか?


メニューをどのように作成していますか?プログラム的に?または管理UIを使用していadmin/structure/menu/manage/main-menu/addますか?
AjitS

コンテンツ作成時にメニューを追加しています。下部のオプション「メニューリンクを提供する」。
monymirza

回答:


1

アクセスコンテンツシステムの主な目的は、すべてのユーザーが何を表示できるかを制御し、考えられるすべてのセキュリティ問題を回避することです。これは望ましい動作であり、ほとんどすべてのモジュールまたは一般的なApIが使用するため、これに対するデフォルトの解決策はありません。

私は同じ状況にあり、私が見つけた唯一の解決策はカスタムモジュールを作成し、私の場合はメニューテーブルに直接クエリして必要なすべての要素を取得し、リンクを表示するための権限を自分で確認することでした、またはユーザーにコンテンツを表示する権限がない場合のコンテンツのタイトル。


コンテンツアクセスモジュールを一緒に使用する必要がありますか?
monymirza

メニューだけでは、ブロックされたノードは表示されません。メニューのノードを取得するモジュールを作成します。次に、すべてのノードのリンクを表示するか(ユーザーにアクセス権がない場合は403ページが表示されます)、または各ノードのコンテンツアクセスモジュールの権限を確認し、ユーザーがアクセスしない場合はリンクを表示しないことを選択できますアクセスできません。
david ruiz

1

私はカスタムモジュールを介してこれを行いました:

function mymodule_form_menu_edit_item_alter(&$form, &$form_state, $form_id) {
     if ($form_state['build_info']['args'][0] == 'edit') {
       $item = $form_state['build_info']['args'][1];

       $form['ignore_access_roles'] = array(
         '#type' => 'checkboxes',
         '#multiple' => TRUE,
         '#title' => t("Ignore access"),
         '#options' => user_roles(),
         '#description' => t("If a user with one of the selected roles has no access to the menu item's path, the menu item is <strong>not</strong> hidden."),
         '#default_value' => empty($item['options']['ignore_access_roles']) ? array() : $item['options']['ignore_access_roles'],
       );

       $form['#validate'][] = 'mymodule_form_menu_edit_item_validate';
     }
   }

   function mymodule_form_menu_edit_item_validate(&$form, &$form_state) {
     if (isset($form_state['values']['ignore_access_roles'])) {
       $form_state['values']['options']['ignore_access_roles'] = $form_state['values']['ignore_access_roles'];


       $form_state['values']['options']['alter'] = TRUE;
     }
   }


   function mymodule_translated_menu_link_alter(&$link, $map) {
     if (!empty($link['options']['ignore_access_roles']) && empty($link['access'])) {

       global $user;

       // Get role ids for which the ignore access option applies.
       $rids = array_values($link['options']['ignore_access_roles']);

       $matching_rids = array_intersect(array_keys($user->roles), $rids);

       if (!empty($matching_rids)) {
         // User has one of the specified roles: override menu link access.
         $link['access'] = TRUE;

         // Localize. This must be done because it is only done for links with
         // access TRUE in _menu_link_translate.
         _menu_item_localize($link, $map, TRUE);
       }
     }
   }

0

これに対処するには、カスタムモジュールを作成する必要があると確信しています。これが私のアイデアです。コンテンツアクセス制限を緩和します。つまり、ユーザーにコンテンツを表示させます。次に、カスタムモジュールはhook_node_load()を実装し、ユーザーが表示してはならないノードをロードするときに403 HTTP応答を出力する必要があります。また、hook_permission()を実装する必要があるため、アクセス許可ページでアクセスを簡単に構成できます。

次に、ノード全体を非表示にし、コンテンツタイプと権限でフィルタリングする簡単な例を示します。

function mymodule_permission() {
  return array('access reserved content');
}

function mymodule_node_load($nodes, $types) {
  if (in_array('my_reserved_content_type', $types)) {
    if (!user_access('access reserved content')) {
      drupal_access_denied();
    }
  }
}

または、403を返す代わりに、一部のノードフィールドを非表示にすることもできます。ただし、これは、フックドキュメントのAPIドキュメントでは推奨されていません。


コンテンツ作成時にメニューを追加しています。下部のオプション「メニューリンクを提供する」。
monymirza

コンテンツアクセスモジュールを一緒に使用する必要がありますか?
monymirza

0

「常に表示」モジュールを使用できます。

あなたの質問のより詳細な回答はこちらです/drupal//a/52149/7313


私は使用しましたが、解決策はありませんでした。
monymirza

「解決策なし」とはどういう意味ですか?そのモジュールをインストールしましたか?
Eugene Fidelin

はい、このモジュールを使用しました。そして、これは私には
うまくいき
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.