Ich verwende das Content Access- Modul mit Drupal 7. Wenn ich den Knotenzugriff von einer bestimmten Rolle aus einschränke, wird auch der Link im Menü ausgeblendet.
Gibt es eine Möglichkeit, eingeschränkte Links im Hauptmenü anzuzeigen?
Ich verwende das Content Access- Modul mit Drupal 7. Wenn ich den Knotenzugriff von einer bestimmten Rolle aus einschränke, wird auch der Link im Menü ausgeblendet.
Gibt es eine Möglichkeit, eingeschränkte Links im Hauptmenü anzuzeigen?
Antworten:
Der Hauptzweck des Zugriffsinhaltssystems besteht darin, die Kontrolle darüber zu haben, was jeder Benutzer sehen kann, und jedes mögliche Sicherheitsproblem zu vermeiden. Dies ist das gewünschte Verhalten, und fast jedes Modul oder allgemeine ApI verwendet es, sodass Sie hierfür keine Standardlösungen finden.
Ich war in der gleichen Situation und die einzige Lösung, die ich gefunden habe, bestand darin, benutzerdefinierte Module zu erstellen und in meinem Fall direkt in der Menütabelle nach allen gewünschten Elementen zu fragen und die Berechtigungen selbst zu überprüfen, um entweder einen Link anzuzeigen oder einfach ein Titel des Inhalts, wenn der Benutzer keine Berechtigung zum Anzeigen hat.
Ich habe dies über ein benutzerdefiniertes Modul getan:
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);
}
}
}
Ich bin mir ziemlich sicher, dass Sie ein benutzerdefiniertes Modul schreiben müssen, um damit umzugehen. Hier ist meine Idee: Lockern Sie die Zugriffsbeschränkungen für Inhalte, dh lassen Sie Benutzer Ihre Inhalte anzeigen. Dann muss Ihr benutzerdefiniertes Modul hook_node_load () implementieren und eine 403-HTTP-Antwort ausgeben, wenn Knoten geladen werden, die Ihre Benutzer nicht sehen sollten. Außerdem sollte hook_permission () implementiert werden, damit Sie den Zugriff auf der Berechtigungsseite einfach konfigurieren können.
Hier ist ein kurzes Beispiel, in dem der gesamte Knoten ausgeblendet und nach Inhaltstyp und Berechtigung gefiltert wird:
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();
}
}
}
Oder Sie können einige der Knotenfelder ausblenden, anstatt eine 403 zurückzugeben. Dies wird jedoch gemäß der API-Dokumentation für hook_node_load () nicht empfohlen.
Sie können das Modul "Immer sichtbar" verwenden.
Eine ausführlichere Antwort auf Ihre Frage finden Sie hier /drupal//a/52149/7313
admin/structure/menu/manage/main-menu/add
?