¿Cómo puedo crear una vista de nodos secundarios en función de la relación del menú?

17

Supongamos que tiene las siguientes páginas en un árbol de menús:

  • Proyectos
    • Proyecto uno
    • Proyecto dos
    • Proyecto tres

Estoy buscando una manera de crear una vista que se incrustará en la página Proyecto (principal) que muestre una imagen, título y texto (resumen) de las páginas secundarias.

La relación entre el padre y los hijos se define en el árbol del menú.

Sé que puedo usar la referencia de nodo, pero eso significaría que cada vez que alguien crea una página, tendría que definir la relación de menú y luego la relación de referencia de nodo.

También sé que podría crear otro tipo de contenido, pero creo que esto es excesivo ya que todas las páginas de contenido tienen el mismo aspecto.

Camsoft
fuente
1
No existe una relación directa entre los nodos que se muestran en un submenú de otro nodo (la única conexión entre un enlace de menú y un nodo es que un enlace de menú apunta a nodo / nid). Por lo tanto, necesita algo para vincular estos subnodos (y al nodo principal), podría ser un término de taxonomía común, book.module, ...
Berdir

Respuestas:

4

Una solución es usar términos de taxonomía para definir las relaciones y luego usar el módulo del menú de taxonomía para traducir esas relaciones de términos en elementos de menú. Luego puede usar el módulo de Página personalizada y los módulos de Contexto para controlar la información y las regiones en todas las páginas si no desea usar paneles.

Adam S
fuente
16

Puede hacer exactamente esto utilizando la API de nodo de menú y los módulos de vistas de nodo de menú .

Cree una vista con el tipo de contenido requerido y elija un filtro contextual de "Menú: ID de enlace de menú" (esto solo está disponible con los módulos anteriores instalados).

En "Cuando el valor del filtro no está disponible", seleccione "Proporcionar valor predeterminado" y elija "Código PHP".

El siguiente fragmento lo hará, luego solo expones un bloque de la vista y estás allí:

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
Emile Kott
fuente
3
Creo que el filtro debería ser "Menú: ID de enlace del menú principal" para tomar los elementos secundarios del nodo actual. Y el código de argumento puede ser: $ current = end (menu_get_active_trail ()); return $ current ['mlid'];
Stefan
Gracias por esto. Algunas mejoras (además de la corrección de @ Stefan). 1) Puede usar en menu_load_object(arg(1))lugar de node_load()ahorrar algunos gastos. 2) Debe verificar para asegurarse de que el elemento del menú sea del menú que le interesa. En este momento, solo estás devolviendo el primero $mlid. Dentro del foreach debes agregar un condicional if ($data->menu_name == 'my-menu')para arreglar esto. y 3) Es posible que desee agregar un segundo filtro para menu: hiddendevolver solo elementos que no están ocultos. Use el mismo fragmento, pero devuelva el en $data->hidden;lugar del $mlid.
Adam Balsam
2
Desalentaría encarecidamente sugerir módulos que aún están en etapa de desarrollo.
Ambidex
@Stefan, ¿hay algún lugar para todos los niños en cualquier nivel? en lugar de solo el primero.
Eli Stone el
4

El módulo de jerarquía de nodos permite este tipo de relación, además de proporcionar una integración de vistas.

La jerarquía de nodos permite que los nodos sean hijos de otros nodos creando una jerarquía de contenido en forma de árbol. El módulo ofrece:

  • Creación de menús jerárquicos con 1 clic
  • Pan rallado jerárquico
  • URL jerárquicas automáticas con Pathauto (y módulo de token)

    (por ejemplo: q = aboutus / history / begin).

  • Creación automática de menús jerárquicos si lo desea.
  • Integración de vistas opcionales.
  • Integración de acceso de nodo opcional.
CCMonkey
fuente
2

Tal vez esto ha cambiado para D7 / Views 3, pero no necesita ningún PHP para lograr el comportamiento deseado:

  1. instale los menús menu_views , menu_node y menu_node_views .
  2. crear una nueva vista de tipo "árbol de menú"
  3. agregue los campos "Menú: título del enlace" y "Menú: descripción"
  4. Agregar filtro / argumento contextual "Menú: ID de nodo"; Proporcione el valor predeterminado "ID de contenido de URL"
  5. Agregar relación "Menú: ID del enlace del menú principal"

voila No debería funcionar , pero lo hace.

Funciona bien solo con nodos, pero la ventaja de usar enlaces de menú sobre la jerarquía de nodos es que no está limitado a construir navegación alrededor de nodos. Incluso podría incluir enlaces externos en su vista.

aaronbauman
fuente
Esta es una buena opción para exponer enlaces de nodo (y me encanta que Aaron Bauman haya puesto esta vista de muestra para importar: pastebin.com/u2GjmWG7 ). Sin embargo, tuve algunos problemas para que los campos de nodos estuvieran disponibles para la vista, ya que el OP lo solicitaba. ¿Cómo se logra eso?
dudas1ejack
Debería poder exponer los campos de nodo agregando una relación a "Menú: ID de nodo". ¿Ves algo así?
aaronbauman
2

Hay un módulo relativamente nuevo del menú Vistas del nodo Filtros secundarios que parece hacer exactamente lo que desea:

Este módulo agrega un filtro contextual a Vistas que recuperará los nodos secundarios de un nodo de acuerdo con la estructura de un menú.

nwellnhof
fuente
0

¿Ha considerado usar Node Reference para este propósito?

  1. Proporcione un campo de referencia de nodo al tipo de contenido que desea mostrar.
  2. Utilice ese campo como filtro contextual en la Vista (valor predeterminado: ID de contenido de la URL ).
  3. Agregue esta vista de visualización como un bloque al contenido. El nodo en el que se muestra se verá como padre de los nodos que hacen referencia a él, por ejemplo.

Por lo tanto, puede lograr un resultado similar al que probablemente esté buscando.

cptstarling
fuente
0

La respuesta de Emile es correcta, pero tuve que pegar el código PHP mencionado en un filtro contextual del tipo " Menú: ID del enlace del menú principal ".

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
cptstarling
fuente
0

Si usa la traducción de entidades y el nodo está conectado a diferentes menús, aquí hay una adaptación del código que se filtra en el idioma actual. Debe copiar esto como código PHP para el filtro contextual (identificación del enlace del menú principal) en su vista como se explica en las otras respuestas

 if (function_exists('menu_node_get_links')) {
global $language;
$lang = $language->language;
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)) {
  foreach ($node->menu_node_links as $mlid => $data) {  
    if ($lang == $data->language) {
      return($mlid);
    }
  }
}
  }
bendev
fuente
0

De la cola de problemas de Vistas de nodo de menú tenemos esta buena solución:

  • agregue un filtro contextual con 'ID del enlace del menú principal',
  • seleccione 'Proporcionar valor predeterminado'
  • seleccione 'código php personalizado'
  • ingrese el siguiente código

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
tostinni
fuente