¿Cómo puedo inyectar un menú de taxonomía como el submenú de un elemento de menú estándar?

12

Tengo un menú principal, con una estructura de nivel superior similar a la siguiente:

Home - Categories - Something Else - ... - Contact

Cada uno de esos enlaces de nivel superior va a una página de nodo apropiada.

Tengo un vocabulario para Categorías (multinivel), y necesito obtener esos términos de taxonomía en un submenú debajo del elemento "Categorías". Me gustaría evitar codificar los elementos en el menú principal, ya que el submenú debería crecer / reducirse como lo hace el vocabulario.

En el pasado, he escrito un código excesivamente elaborado para lograr esto, que se engancha en las operaciones de taxonomía y administra los subelementos de un menú en particular en función de eso (muy similar a lo que hace el Menú de taxonomía , pero sin tener que tener un menú diferente para cada vocabulario).

Si bien ese método funciona, no es ideal y ciertamente no es genérico. No puedo simplemente levantar ese código del antiguo proyecto al nuevo, requeriría una cantidad razonable de personalización.

No puedo evitar sentir que debe haber una solución 'estándar' basada en módulos para esto.

He visto algunas sugerencias para usar un montón de módulos diferentes en combinación (incluso algunos sugieren usar módulos basados ​​en Vistas, por extraño que parezca). Estoy abierto a cualquier sugerencia, pero si se trata de instalar más de 1 o 2 módulos, y una carga de configuración específica de contexto codificada, probablemente no sea de gran ayuda en este caso.

Clive
fuente
1
Creo que lo he visto ... Un tema similar contiene una idea sobre el uso de reglas para crear elementos basados ​​en taxonomía en el menú, pero eso también parece lejos de ser ideal.
Mołot
Si entendí correctamente, ¿se parece a este módulo? Drupal.org/project/taxonomy_treemenu , puede integrarse con un buen menú, pero para D6
Bala
¿Tiene que tener elementos de menú reales o es viable agregar los términos del árbol de taxonomía al menú cuando se procesa?
rooby
Gracias @Bala, necesitan una solución D7 aunque
Clive
1
Clive tengo una sugerencia. Como sé, puede generar un menú taxonomu con el nombre del vocabulario incluido y luego simplemente agregar otros enlaces de menú directamente en el menú generado. Los elementos de la taxonomía pueden actualizarse automáticamente ... No sé si funcionará, simplemente pruébelo.
milkovsky

Respuestas:

13

Opción a) A menos que me equivoque, ¿no puede simplemente elegir dónde se emparejará su Menú de taxonomía (Ubicación del menú) cuando lo cree? El único problema que creo que puede tener es que creo que requiere que reconstruya el menú cada vez que se actualiza la taxonomía.

Opción b) He hecho algo razonablemente similar a esto en mi sitio, utilicé el módulo Vistas de menú , para permitirme poner una vista en mi menú principal.

Si crea una nueva vista que enumera todos sus términos de taxonomía, como una visualización de bloque, aplique cualquier filtro / modificación adicional en la vista si es necesario (puede que no, pero en mi ejemplo quería). Luego, cuando agrega un nuevo enlace a su menú principal, puede seleccionar usar una vista en lugar de un enlace. Desde allí, elija la vista que desea usar, seleccione el elemento de menú 'Categoría' como principal y guarde (después de guardar, debe habilitarlo en el menú, que parece ser un error con el módulo en sí)

No puedo garantizar que esta sea la mejor solución para usted, pero funcionó cuando lo probé

Andrew Morris
fuente
1
Sí, resulta que he sido bastante estúpido: el menú de taxonomía tiene esta funcionalidad exacta incorporada (su opción a). El menú particular con el que estoy tratando es bastante pequeño, y las categorías no cambiarán con frecuencia, por lo que la reconstrucción no es un problema. Muchas gracias por el control de cordura
Clive
3

Menupoly tiene una API para "fuentes de árbol de menú" personalizadas. Realmente nunca he hecho uso de esto para algo más que enlaces de menú, por lo que puede haber problemas que tenemos que solucionar en el camino. Pero la arquitectura básica está ahí.

Si sigues esta ruta, lo harías

  • Use su menú principal existente, sin enlaces de términos de taxonomía más allá de la página "Categorías".
  • Crea tu árbol de taxonomía independiente de eso.
  • Escriba una "fuente de árbol de menú" personalizada que obtenga de menu_links de forma normal, pero cuando encuentre un término de taxonomía, en su lugar, buscará la taxonomía.
    Por lo tanto, de alguna manera debe ser capaz de detectar que el enlace "Categorías" está relacionado con la taxonomía.
  • Si un enlace de menú está relacionado con la taxonomía y al mismo tiempo tiene un submenú regular, debe mezclar de alguna manera los dos tipos de hijos.

Esta ruta sería un trabajo, pero podría ser útil para otros, y probablemente sea más elegante y reutilizable que la lógica específica de su sitio.

Actualmente ni siquiera existe una "fuente de árbol de menú" de taxonomía, por lo que tal vez ese sería un primer paso razonable antes de comenzar con un complemento mixto.

Don Quijote
fuente
Dicho esto, la respuesta aceptada por Andrew Morris podría ser lo suficientemente buena. Y significa menos trabajo para mí :) Todavía quería publicar esto para cualquiera que pueda encontrarlo útil.
donquixote
V. interesante, gracias. La respuesta aceptada es hacer el trabajo bien, pero también estoy muy interesado en obtener soluciones de código. ¿Puedo suponer si es uno de sus módulos que todo está construido sobre la bondad de PSR-0? :)
Clive
Este utiliza el modo de compatibilidad PHP 5.2 de xautoload, que es algo así como PEAR pero con directorios poco profundos. Por lo tanto, no se aprobó PSR. Podría ir a PSR-0 algún día ...
donquixote
aunque estoy muy interesado en PSR-X (que nunca podría entrar en D8, lamentablemente)
donquixote
2

Metro Menus cumplirá con sus requisitos e incluso tiene las máscaras integradas y puede crear las suyas propias, que funcionan igual que buenos menús. Con este módulo, puede seleccionar cualquier elemento secundario con cualquier profundidad desde el menú o la taxonomía y no lo estoy usando antes.

Compatibilidad con pantalla táctil (iPad, iPhone y etc.).

ingrese la descripción de la imagen aquí

Bala
fuente
2

Puede usar el módulo de menú Om Maxi para lo mismo. Permitirá al administrador crear menús con bloques que desee como archivos adjuntos, módulos como vistas, presentación de diapositivas, menú, usuario, menús agradables, pestañas rápidas y bloques personalizados con tablas, listas, imágenes, videos, etc.

Puede crear un menú separado usando el Menú de taxonomía y puede adjuntar este menú como subenlace al menú generado por om maxi menu.

Gracias

Jayendra Kainthola
fuente
2

Recientemente he hecho algo similar para un menú de categoría de producto. Esto fue solo para 1 nivel de profundidad, pero podría modificarse fácilmente para mostrar más niveles.

/**
 * Implements theme_menu_link().
 */
function THEME_menu_link__main_menu($variables) {

  $sub_menu = '';
  $element = $variables['element'];
  $menu_string = $element['#title'];

  if (module_load_include('inc','pathauto','pathauto') !== FALSE) {
    $menu_string =  pathauto_cleanstring($menu_string);
  }

  if ($menu_string == 'categories') {
    $sub_menu = get_categories_menu();
  }

  if ($sub_menu) {
    $element['#attributes']['class'][] = 'haschildren';
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

function get_categories_menu() {

  $current_category = arg(2); // Get current category from path
  $volcab = taxonomy_vocabulary_machine_name_load('product-categories');
  $tree = taxonomy_get_tree($volcab->vid,0,1);

  $output = '<ul class="menu product-category">';
  foreach ($tree as $term) {
    $safe_term = pathauto_cleanstring($term->name);
    $class = ($current_category==$safe_term) ? ' class="active"' : '';
    $output .= '<li><a' . $class . ' href="/drupal//path/to/' . $safe_term . '">' . $term->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}

La función get_category_menu está mejor como un bloque, pero se muestra aquí como otra función en template.php por conveniencia.

Espero que ayude o que sea al menos un paso hacia una solución.

Pablo

paul.linney
fuente