routes – ¿Cómo agrego una condición de acceso a un elemento del menú?

Pregunta:

¿Cómo puedo agregar nuevas condiciones además de las condiciones existentes que determinan si un elemento del menú es visible? Estas condiciones no deben limitarse a la configuración de permisos.

Como ejemplo de caso de uso (no necesariamente el motivo de esta pregunta): supongamos que tengo un tipo de contenido en el que los usuarios solo pueden crear un nodo. Tengo un elemento de menú para agregar ese tipo de contenido. Pero si el usuario ya ha creado un nodo de ese tipo de contenido, quiero ocultar el elemento del menú. Mi primer pensamiento es ejecutar una consulta para verificar la existencia de un nodo creado por el usuario actual que sea del tipo de contenido específico. Si existe, oculte el elemento del menú.

Creo que este tipo de funcionalidad debería ir a hook_menu_alter() y agregar la lógica requerida allí. Pero no estoy seguro de cómo hacerlo sin pasar por alto las comprobaciones existentes, como comprobar si el usuario tiene permisos para crear ese tipo de contenido. ¿Tendría que incluir esa lógica dentro de mi propia condición? ¿O puedo agregar a la lógica de acceso existente sin sobrescribirla?


Editar: Algunas personas parecen concentradas en responder "¿cómo puedo limitar a un usuario a crear un nodo de un tipo de contenido?". Ésa no es la cuestión aquí. La pregunta es cómo puedo agregar condiciones de acceso personalizadas a un elemento de menú.

Respuesta:

Lo que debe hacer es agregar su devolución de llamada a través de hook_menu_alter (), y luego, dentro de su devolución de llamada, simplemente haga su lógica y luego devuelva los datos a través de la devolución de llamada original.

Para estar seguro de que no sobrescribe ningún otro cambio de hook_menu_alter (), debe pasar la devolución de llamada anterior a su devolución de llamada a través del argumento de acceso.

Todo esto es teórico, pero el código debería ser algo como esto:

MYMODULE_menu_alter(&$items) {
  $items['menu']['access arguments'] = array_merge(array($items['menu']['access callback']), $item['menu']['access arguments']);
  $items['menu']['access callback'] = 'MYMODULE_access_callback';
}

MYMODULE_access_callback() {
  $args = func_get_args();

  // Do Stuff.
  if ($something == FALSE) {
    return FALSE;
  }

  $function = array_shift($args);
  return call_user_func_array($function, $args);
}

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım