Moduł dostępu do treści ukrywa linki menu

10

Korzystam z modułu Content Access z Drupal 7. Kiedy ograniczam dostęp do węzła z określonej roli, ukrywa on również łącze w menu.

czy jest jakiś sposób, aby wyświetlić ograniczone linki w menu głównym?

monymirza
źródło
jak tworzysz menu? programowo? lub używając interfejsu administratora w admin/structure/menu/manage/main-menu/add?
AjitS,
dodaję menu podczas tworzenia treści. opcja u dołu „Podaj link do menu”.
monymirza

Odpowiedzi:

1

Głównym celem systemu treści dostępowych jest kontrolowanie tego, co każdy użytkownik może zobaczyć, i unikanie wszelkich możliwych problemów z bezpieczeństwem. Jest to pożądane zachowanie i korzysta z niego prawie każdy moduł lub ogólny interfejs użytkownika, więc nie znajdziesz dla niego domyślnych rozwiązań.

Byłem w tej samej sytuacji i jedynym rozwiązaniem, jakie znalazłem, było utworzenie niestandardowych modułów i, w moim przypadku, zapytanie bezpośrednio do tabeli menu, aby uzyskać wszystkie potrzebne elementy, i sam sprawdzić uprawnienia do wyświetlania linku lub po prostu tytuł treści, gdy użytkownik nie ma uprawnień do jej wyświetlania.

David Ruiz
źródło
czy będę musiał używać z nim modułu dostępu do treści, czy nie?
monymirza
Samo menu nigdy nie wyświetli zablokowanych węzłów. Stworzyłbym moduł do pobierania węzłów menu. Następnie możesz wybrać wyświetlanie łącza dla każdego węzła (jeśli użytkownik nie ma dostępu, zobaczy stronę 403) lub sprawdź uprawnienia modułu dostępu do treści dla każdego węzła i nie wyświetlaj łącza, jeśli użytkownik nie nie mam dostępu.
David Ruiz,
1

Zrobiłem to za pomocą niestandardowego modułu:

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);
       }
     }
   }
monymirza
źródło
0

Jestem pewien, że będziesz musiał napisać niestandardowy moduł, aby sobie z tym poradzić. Oto mój pomysł: złagodź ograniczenia dostępu do treści, tzn. Pozwól użytkownikom przeglądać twoje treści. Następnie moduł niestandardowy musi zaimplementować hook_node_load () i wygenerować odpowiedź 403 HTTP podczas ładowania węzłów, których użytkownicy nie powinni widzieć. Należy również zaimplementować hook_permission (), abyś mógł łatwo skonfigurować dostęp na stronie uprawnień.

Oto szybki przykład ukrywania całego węzła i filtrowania według typu zawartości i uprawnień:

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();
    }
  }
}

Możesz też ukryć niektóre pola węzłów zamiast zwracać wartość 403. Nie zaleca się tego jednak zgodnie z dokumentacją API dla hook_node_load ()

ermannob
źródło
dodaję menu podczas tworzenia treści. opcja u dołu „Podaj link do menu”.
monymirza 8.12.12
czy będę musiał używać z nim modułu dostępu do treści, czy nie?
monymirza
0

Możesz użyć modułu „Zawsze widoczny”.

Bardziej szczegółowa odpowiedź na twoje pytanie znajduje się tutaj https://drupal.stackexchange.com/a/52149/7313

Eugene Fidelin
źródło
użyłem, ale nie mam rozwiązania.
monymirza 11.12.12
Co masz na myśli mówiąc „brak rozwiązania”? Czy masz zainstalowany ten moduł?
Eugene Fidelin,
tak, użyłem tego modułu. i to nie działa dla mnie ...
monymirza 12.12