it-swarm-ko.tech

hook_menu ()를 사용하여 만드는 메뉴 항목의 부모를 설정하는 방법은 무엇입니까?

데이터베이스의 값을 기반으로 일련의 메뉴 항목을 동적으로 작성해야합니다.

다음은 내 hook_menu() 함수의 예입니다. 이 스 니펫에서 DB 쿼리를 제거하고 개념을 증명하기 위해 배열을 추가했습니다.

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

이 작동하고 메인 메뉴에서 제목이 2011 Events Archive, 2010 Events Archive2009 Events Archive라는 세 가지 메뉴 항목을 얻습니다.

내가 겪고있는 문제는 기본 메뉴 트리에서 동적으로 생성 된 메뉴 항목의 위치입니다. 그것들은 최상위 레벨에 나타나지만 부모 Events 메뉴 항목 아래에 나타나기를 원합니다.

현재 메뉴 트리는 다음과 유사합니다.

  • 행사
  • 회사 소개
  • 문의하기
  • 2011 년 이벤트 아카이브
  • 2010 이벤트 아카이브 2009 이벤트 아카이브

다음과 같아야합니다.

  • 이벤트
    • 2011 년 이벤트 아카이브
    • 2010 이벤트 아카이브
    • 2009 년 이벤트 아카이브
  • 회사 소개
  • 문의하기

로그인 할 때 메뉴 편집기 UI를 사용하여 메뉴 항목을 이동할 수 있지만 시스템에서 자동으로 생성되므로 메뉴 항목을 이동할 수 있습니다. 사람의 개입없이 이벤트 아래에 자동으로 나타나야합니다.

어떻게 할 수 있습니까? 더 쉬운 방법이 있습니까?

5
Camsoft

Events 메뉴 항목은 events가 경로 별칭 인 노드에 연결되므로 다음 코드를 사용하여 메뉴 항목을 정의하면 달성하려는 작업이 작동해야합니다. (노드 ID로 "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;
}

eventsnode ​​/ 11의 경로 별칭 인 경우 Drupal 확장되지 않음 events/2011에서 node ​​/ 11/2011로, 같은 방식으로 events/edit에서 node ​​/ 11/edit로 확장하지 않습니다. 심지어 Node 모듈은 메뉴 항목 중 하나로 nodes/% node/edit를 정의한다고 생각했습니다.

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

방법은 다음과 같습니다. 먼저 그룹을 나타내는 메뉴 항목을 만듭니다.

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

그런 다음이 그룹 아래에 메뉴 항목을 추가하십시오.

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

이벤트는 작동하지만 (7.22에서 테스트 됨) 여전히 페이지 콜백의 중복성을 좋아하지 않습니다. MENU_GROUP이라는 유형 만 있다면 더 좋은 해결책을 얻을 수 있습니다.

0
stuchl4n3k