Sto usando il modulo di accesso al contenuto con Drupal 7. quando limito l'accesso al nodo da un ruolo specifico, nasconde anche il collegamento nel menu.
c'è un modo per mostrare collegamenti limitati nel menu principale?
Sto usando il modulo di accesso al contenuto con Drupal 7. quando limito l'accesso al nodo da un ruolo specifico, nasconde anche il collegamento nel menu.
c'è un modo per mostrare collegamenti limitati nel menu principale?
Risposte:
Lo scopo principale del sistema di contenuti di accesso è avere il controllo di ciò che ogni utente può vedere ed evitare ogni possibile problema di sicurezza. Questo è il comportamento desiderato e quasi ogni modulo o API generale lo utilizza, quindi non troverai soluzioni predefinite per questo.
Sono stato nella stessa situazione e l'unica soluzione che ho trovato è stata quella di creare un modulo personalizzato e, nel mio caso, eseguire una query direttamente nella tabella dei menu per ottenere tutti gli elementi desiderati e controllare personalmente le autorizzazioni per visualizzare un collegamento o semplicemente un titolo del contenuto quando l'utente non dispone delle autorizzazioni per vederlo.
L'ho fatto tramite modulo personalizzato:
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);
}
}
}
Sono abbastanza sicuro che dovrai scrivere un modulo personalizzato per affrontare questo. Ecco la mia idea: allentare le restrizioni di accesso ai contenuti, ovvero consentire agli utenti di visualizzare i tuoi contenuti. Quindi il modulo personalizzato deve implementare hook_node_load () e generare una risposta HTTP 403 quando si caricano nodi che gli utenti non dovrebbero vedere. Anche hook_permission () dovrebbe essere implementato, quindi sarai in grado di configurare facilmente l'accesso nella pagina delle autorizzazioni.
Ecco un breve esempio che nasconde l'intero nodo e filtra per tipo di contenuto e autorizzazione:
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();
}
}
}
Oppure puoi nascondere alcuni dei campi del nodo, invece di restituire un 403. Ma questo è sconsigliato secondo la documentazione API per hook_node_load ()
È possibile utilizzare il modulo "Sempre visibile".
La risposta più dettagliata alla tua domanda è qui https://drupal.stackexchange.com/a/52149/7313
admin/structure/menu/manage/main-menu/add
?