php - info - ¿Cómo obtener todos los elementos del menú debajo de un cierto padre en drupal 7?
drupal 8 modules (2)
¿Qué tal algo como esto?
function your_module_menu_link__your_menu($variables){
$element = $variables[''element''];
$sub_menu = '''';
if ($element[''#below'']) {
$sub_menu = drupal_render($element[''#below'']);
}
$ouput = "";
if($element[''#original_link''][''plid''] > 0 || $element[''#below'']){
$link = l($element[''#title''], $element[''#href''], $element[''#localized_options'']);
$ouput = ''<li'' . drupal_attributes($element[''#attributes'']) . ''>'' . $link . $sub_menu . "</li>/n";
}
return $ouput;
}
Actualmente estoy trabajando en un módulo que descubre el elemento del menú principal por ruta url luego muestra la estructura de árbol actual de ese menú relacionado buscando el principal superior y lo más importante solo mostrando ese elemento de menú y submenús desde ese menú.
Una solución simple sería tener un bucle foreach a través de todos los elementos o una matriz con todos los elementos como claves.
path = ''/system/menu/submenu'';
parent = ''system'';
output = parent + parent submenus.
Todos los elementos del menú en "Menú personalizado":
- System
- Menu wrapper
- SubMenu 1A
- SubMenu 2A
- SubMenu 3A
- Main
- SubMenu 1B
- SubMenu 2B
- SubChildMenu 3B
El código PHP debería devolver esto:
- System
- Menu wrapper
- SubMenu 1A
- SubMenu 2A
- SubMenu 3A
Mi código (actualmente no funciona):
$menu = menu_tree(''my-custom-menu'');
return = theme(''my_custom_menu'', array(''system'' => $menu_tree));
Aviso: Esto solo debe ser código php y código php, el resto de los módulos no son compatibles solo con la selección manual. El contenido se muestra a través de un bloque.
"Para la navegación, Drupal llamará a menu_tree_page_data a través de menu_navigation_links, que solo devolverá un único nivel de enlaces. Puede seguir esta función hasta menu_main_menu y luego template_preprocess_page antes de que (que es cómo termina como una variable en page.tpl.php )
Sin embargo, si inserta un menú como un bloque menu_tree_page_data es llamado por menu_tree (que llama a menu_tree_output inmediatamente después de lo cual hace un trabajo adicional a la matriz para el marcado final.) Después de que ambos hayan ejecutado, tiene todo su árbol de menús disponible como una matriz que Luego corrí a través de un código PHP personalizado para recorrer la matriz y convertirla en una lista HTML ".
La gente ha preguntado esto antes, pero he intentado con sus soluciones y ninguna causa probable es que esas preguntas sean para drupal 6. Actualmente estoy trabajando con drupal 7.
Su ayuda es muy apreciada, gracias ...
Preguntas relacionadas:
Restringir árbol de menú al primer nivel
cómo obtener todos los elementos del menú debajo de un cierto padre en drupal?
https://drupal.stackexchange.com/questions/30112/displaying-a-menus-child-links
Lo primero que necesita es el mlid de la página en la que se encuentra actualmente:
$q = variable_get(''site_frontpage'', ''node'') == $_GET["q"] ? ''<front>'' : $_GET["q"];
$current_menu_item = db_select(''menu_links'' , ''ml'')
->condition(''ml.link_path'' , $q)
->fields(''ml'', array(''mlid'', ''plid''))
->execute()
->fetchAll();
Ahora bien, si la cantidad de este elemento del menú es 0, entonces sabemos que es un elemento de menú de nivel superior, si no es 0, entonces necesitamos obtener el elemento principal. Entonces, el mejor mlid del árbol que queremos obtener es:
$top_level_mlid = $current_menu_item->plid == 0 ? $current_menu_item->mlid : $current_menu_item->plid;
Entonces necesitas cargar tu menú completo:
$full_menu_items = menu_tree_all_data(''main-menu'');
Ahora recorra todos los elementos del menú y obtenga el bit que queremos:
foreach($full_menu_items as $menu_item) {
if($menu_item[''link''][''mlid''] == $top_level_mlid) {
$links = $menu_item[''below''];
break;
}
}
$ enlaces ahora contienen todos los enlaces de la parte específica del menú que está buscando.
Y para mostrar esa matriz como un menú en la página:
echo theme(''links__system_secondary_menu'', array(
''links'' => $links,
''attributes'' => array(
''id'' => ''secondary-menu'',
''class'' => array(''links'', ''clearfix'')),
''heading'' => array(
''text'' => t(''Secondary menu''),
''level'' => ''h2'',
''class'' => array(''element-invisible'')
)
));