it-swarm-es.com

¿Cómo conectar el tema del menú principal del sistema en drupal 7 para mostrar solo algunos de los elementos?

Quiero modificar el menú principal del sistema en Drupal 7. En realidad, quiero mostrar solo algunos elementos específicos del menú y ocultar algunos otros elementos específicos, en un caso dado (que implementaré por una instrucción if o switch en una función).

¿Cuál es la forma más sencilla de hacer esto? Y, cómo hacerlo ? Puedes darme un ejemplo ?

He leído que usando hook_theme o hook_menu se puede hacer, pero no tengo idea de cómo hacerlo.

3
Ek Kosmos

Hay diferentes niveles para modificar el menú del sistema. Si desea agregar un contenedor de nivel superior como drupal lo hace el comercio para la sección de la tienda de administración, debe agregar un elemento de menú con un menú de gancho como este:

// Top level "Store" container.
$items['admin/commerce'] = array(
  'title' => 'Store',
  'description' => 'Administer your store.',
  'page callback' => 'system_admin_menu_block_page',
  'access arguments' => array('access administration pages'),
  'file path' => drupal_get_path('module', 'system'),
  'file' => 'system.admin.inc',
  'weight' => -7,
);

system_admin_menu_block_page es lo que hará el trabajo, de convertirlo en parte del menú del sistema.

Si desea que el menú aparezca en una de las secciones, como configuración, etc., solo necesita ajustar su ruta en hook_menu, fx

$items['admin/config/section'] = array(...);

Cada vez que desee crear una sección que deba contener otros elementos del menú, simplemente agregue

'page callback' => 'system_admin_menu_block_page',
'access arguments' => array('access administration pages'),
'file' => 'system.admin.inc',
'file path' => drupal_get_path('module', 'system'),

Al crear un elemento de menú en una sección, simplemente cree un elemento de menú normal.

Actualización
Dado que la estructura del menú está almacenada en caché, no puede alterar el menú en un escenario por usuario. Pero todavía hay algunos métodos disponibles.

  • Dado que los menús solo se muestran si el usuario tiene acceso, puede crear una función de control de acceso personalizada para todos los menús y poner su lógica allí.
  • También puede intentar hacer esto en la capa temática y modificar la salida para mostrar solo los menús deseados. No he probado esto en Drupal 7, pero en general, alterar la salida de los menús de esta manera es difícil, ya que el sistema de menús es bastante complejo.

Si necesita modificar los menús, para cambiar el control de acceso, debe usar hook_menu_alter.

3
googletorp

Quiere ocultar el menú según una condición. Sin embargo, depende de cuál sea la afección. Si puede basarlo en el rol, hay un módulo para eso: Menú por rol

Si tiene una lógica más complicada, es posible que deba crear diferentes menús para los diferentes casos. El sistema de menús almacena en caché los menús, por lo que es difícil modificarlos dinámicamente. Al crear varios menús, puede mostrar diferentes en un bloque según su condición utilizando el módulo Bloque de menú .

2
cleaver

Sin más información sobre su caso de uso (incluido: el contenido de esta condición misteriosa "que [usted] implementará mediante una declaración if o switch en una función", y la definición de "alguna parte del menú"), es difícil para darte una respuesta definitiva.

Solo sepa que el sistema de menú de Drupal es una herramienta compleja diseñada para manejar una amplia variedad de casos de uso y estructuras de menú. Su lógica de visualización estándar está diseñada para mostrarle al usuario solo los enlaces a los que realmente puede acceder, de modo que ningún Drupal usuario debería llegar a una página 403).

El sistema de menús también admite alteraciones dinámicas de los enlaces del menú (y de su visibilidad) a través de hook_translated_menu_link_alter(), pero requiere un poco de trabajo:

  • Primero debe marcar los enlaces de menú que desea apuntar como "modificables", por ejemplo, configurando su $link['options']['alter'] A TRUE en un hook_menu_link_alter () o hook_menu_alter () si son elementos de menú enrutador.
  • Luego puede implementar hook_translated_menu_link_alter() y establecer la propiedad 'access' De los enlaces que desea ocultar en FALSE.

También puede utilizar soluciones por paquete como el módulo menu_per_role ya mencionado.

Modificar la estructura del menú justo antes de renderizar en el nivel de temas es nunca la solución.

2
Damien Tournoud

Hay muchas formas de hacer esto en los archivos de plantilla de tema o en un preprocesador. Sin embargo, si no desea enlaces en el menú, ¿por qué no ir a/admin/build/menu y eliminarlos del menú?

1
Jeremy French