web-dev-qa-db-fra.com

Comment définir le parent des éléments de menu créant à l'aide de Hook_Menu ()?

J'ai besoin de créer une série d'éléments de menu de manière dynamique sur la base de valeurs de la base de données.

Voici un exemple de ma fonction hook_menu(); Dans cet extrait, j'ai supprimé les requêtes de DB et je viens d'ajouter un tableau pour prouver le concept:

function MYMODULE_menu() {
  $years = array(2011, 2010, 2009);

  foreach ($years as $year) {
    $items['events/' . $year] = array(
      'title' => $year . ' Events Archive',
      'page callback' => 'page_archive',
      'page arguments' => array(1),             
      'access callback' => TRUE,
      'type' => MENU_NORMAL_ITEM,
      'menu_name' => 'main-menu',
    );  
  }

  return $items;
}

Cela fonctionne et je reçois trois éléments de menu dans le menu principal intitulé Archives d'événements 2011, Archives d'événements 201 et 2009 Archives d'événements.

Le problème que j'ai d'avoir est la position des éléments de menu créés de manière dynamique dans l'arborescence du menu principal; Ils apparaissent au niveau supérieur, mais je veux qu'ils apparaissent sous l'élément de menu parent événements.

Actuellement, mon arbre de menu a l'air similaire à ce qui suit.

  • Accueil
  • Événements
  • À propos de nous
  • Nous contacter
  • Archives d'événements 2011
  • Archives d'événements de 2010 Archives d'événements 2009

Cela devrait ressembler à ce qui suit.

  • Accueil
  • Événements
    • Archives d'événements 2011
    • Archives d'événements de 2010
    • Archives d'événements de 2009
  • À propos de nous
  • Nous contacter

Je sais que vous pouvez déplacer les éléments de menu à l'aide de l'éditeur de menu UI lors de la connexion, mais comme elles seront automatiquement créées par le système; Ils doivent apparaître automatiquement sous des événements sans intervention humaine.

Comment cela peut-il être fait? Y a-t-il un moyen plus facile de faire cela?

5
Camsoft
<?php
/**
 * GOAL AND STRATEGY:
 *
 * node/6 is a top level menu item in a custom menu called 'menu-main-menu'. I'm
 * creating a child menu item using hook_menu with the path of 'member/pick'. I
 * want this menu item to be rendered as a child of node/6 in the main menu, and
 * I want all of this to happen programatically.
 * 
 * Here's how...
 * 
 * 1. Create the child item using hook_menu
 * 2. In hook_menu_link_alter, lookup the mlid of node/6 and apply it as the
 * plid of the child item
 * 
 */

/**
 * Implementation of hook_menu()
 */
function hook_menu() {
  $items = array();
  $items['member/pick'] = array(
    'title' => 'Member Pick',
    'menu_name' => 'menu-main-menu',
    'page callback' => 'member_pick_page',
    'access callback' => TRUE,
    'type' => MENU_NORMAL_ITEM,
  );    
  return $items;
}

/**
 * Implementation of hook_menu_link_alter
 */
function hook_menu_link_alter(&$item) {
  if ($item['page callback'] == 'member_pick_page') {
    $parent_normal_path = 'node/6';
    $plid = db_result(db_query("SELECT mlid FROM {menu_links} WHERE link_path = '%s'", $parent_normal_path));
    $item['plid'] = $plid;
  }
}
2
Aaron Klump