it-swarm-eu.dev

Jak nastavit nadřazené položky nabídky vytvářené pomocí hook_menu ()?

Potřebuji dynamicky vytvářet řadu položek menu na základě hodnot z databáze.

Zde je příklad mé funkce hook_menu(); v tomto úryvku jsem odstranil dotazy DB a právě přidal pole, abych dokázal tento koncept:

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;
}

Funguje to a v hlavní nabídce dostanu tři položky menu s názvem Archiv událostí 2011, Archiv událostí 201 a Archiv událostí 2009.

Problém, který mám, je pozice dynamicky vytvořených položek nabídky ve stromu hlavní nabídky; objevují se na nejvyšší úrovni, ale chci, aby se objevily pod položkou nabídky dálosti.

Můj strom nabídky v současné době vypadá podobně jako následující.

  • Domov
  • Události
  • O nás
  • Kontaktujte nás
  • Archiv událostí 2011
  • Archiv událostí 2010 Archiv událostí 2009

Mělo by to vypadat takto.

  • Domov
  • Události
    • Archiv událostí 2011
    • Archiv událostí 2010
    • Archiv událostí 2009
  • O nás
  • Kontaktujte nás

Vím, že můžete při přihlášení přesouvat položky nabídky pomocí uživatelského rozhraní editoru nabídek, ale protože je systém automaticky vytvoří; musí se objevit automaticky v rámci událostí bez zásahu člověka.

Jak to lze dosáhnout? Existuje snadnější způsob, jak toho dosáhnout?

5
Camsoft

Protože položka nabídky dálosti odkazuje na uzel, pro který dálosti je alias cesty, to, co se snažíte dosáhnout, by mělo fungovat, pokud definujete položky nabídky pomocí následujícího kódu (Jako ID uzlu používám „11“).

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

  foreach ($years as $year) {
    $items['node/11/' . $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;
}

To je nutné, protože pokud dálosti je alias cesty pro zel/11, Drupal se nerozšiřuje dálosti/2011 na zel/11/2011. Stejným způsobem se nerozbalí dálosti/upravit na zel/11/upravit , i když modul Node definuje zly /% uzel/editovat jako jednu ze svých položek nabídky.

6
kiamlaluno
<?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

Zde je návod, jak to udělat ... Nejprve vytvořte položku nabídky, která bude představovat skupinu:

$items['admin/content/example'] = array(
  'title' => 'Example menu group',
  'page callback' => 'example_page_2011',
  'access arguments' => array('administer nodes'),
);

Potom do této skupiny přidejte položky nabídky:

foreach ($years as $year) {
  $items['admin/content/example/' . $year] = array(
    'title' => $year,
    'page callback' => 'example_page_' . $year,
    'access arguments' => array('administer nodes'),
    'type' => MENU_LOCAL_TASK,
  );
}

Událost sice funguje (testováno na 7.22), ale i tak se mi tato redundance v zpětném volání stránky nepáči. Kdyby existoval typ nazvaný MENU_GROUP ... Ocení se lepší řešení.

0
stuchl4n3k