답변:
업데이트 스크립트에서이 작업을 수행하려는 경우 다음과 같이 작동합니다.
$menus = array(
array(
'menu_name' => 'menu_test_one',
'title' => 'My Menu One',
'description' => 'Lorem Ipsum',
),
array(
'menu_name' => 'menu_test_two',
'title' => 'My Menu Two',
'description' => 'Lorem Ipsum',
),
array(
'menu_name' => 'menu_test_three',
'title' => 'My Menu Three',
'description' => 'Lorem Ipsum',
),
);
$links = array(
array(
array(
'link_title' => 'Link1',
'link_path' => 'http://yourdomain.com/link1',
'menu_name' => 'menu_test_one',
'weight' => 0,
'expanded' => 0,
),
array(
'link_title' => 'Link2',
'link_path' => 'http://yourdomain.com/link2',
'menu_name' => 'menu_test_one',
'weight' => 1,
'expanded' => 0,
),
),
array(
array(
'link_title' => 'Link3',
'link_path' => 'http://yourdomain.com/link3',
'menu_name' => 'menu_test_two',
'weight' => 0,
'expanded' => 0,
),
array(
'link_title' => 'Link4',
'link_path' => 'http://yourdomain.com/link4',
'menu_name' => 'menu_test_two',
'weight' => 1,
'expanded' => 0,
),
),
array(
array(
'link_title' => 'Link5',
'link_path' => 'http://yourdomain.com/link5',
'menu_name' => 'menu_test_three',
'weight' => 0,
'expanded' => 0,
),
array(
'link_title' => 'Link6',
'link_path' => 'http://yourdomain.com/link6',
'menu_name' => 'menu_test_three',
'weight' => 1,
'expanded' => 0,
),
),
);
// Save menu group into menu_custom table
foreach ($menus as $menu) {
// Look the table first if the data does exist
$exists = db_query("SELECT title FROM {menu_custom} WHERE menu_name=:menu_name", array(':menu_name' => $menu['menu_name']))->fetchField();
// Save the record if the data does not exist
if (!$exists) {
menu_save($menu);
}
}
$item = '';
foreach ($links as $layer1) {
foreach ($layer1 as $link) {
// Build an array of menu link
$item = array(
'link_path' => $link['link_path'],
'link_title' => $link['link_title'],
'menu_name' => $link['menu_name'],
'weight' => $link['weight'],
'expanded' => $link['expanded'],
);
// Look the table first if the data does exist
$exists = db_query("SELECT mlid from {menu_links} WHERE link_title=:link_title AND link_path=:link_path", array(':link_title' => $link['link_title'], ':link_path' => $link['link_path']))->fetchField();
// Save the record if the data does not exist
if (!$exists) {
menu_link_save($item);
}
}
}
내 접근 방식이 잘못되면 의견을 환영합니다. 감사.
if (!array_key_exists($menu, $menus)) {
또한 단일 매개 변수 FALSE를 menu_get_menus ()에 추가하면 사용자 정의 메뉴 만 반환됩니다.
배열에서 메뉴를 쉽게 채우는 방법은 다음과 같습니다.
<?php
function populate_menu($links, $menu_name, $plid = 0) {
foreach ($links as $link) {
$ls = array(
'menu_name' => $menu_name,
'link_title' => $link['link_title'],
'link_path' => $link['link_path'],
'plid' => $plid,
);
$newpid = menu_link_save($ls);
if (!empty($link['childs'])) {
populate_menu($link['childs'], $menu_name, $newpid);
}
}
}
$items = array(
array(
'link_title' => 'Menu1',
'link_path' => '<front>',
'childs' => array(
array(
'link_title' => 'Sub Item 1',
'link_path' => '<front>',
'childs' => array(
array(
'link_title' => 'Link item 1',
'link_path' => '<front>',
),
array(
'link_title' => 'Link item 2',
'link_path' => '<front>',
),
),
),
array(
'link_title' => 'Sub Item 2',
'link_path' => '<front>',
'childs' => array(
array(
'link_title' => 'Link item',
'link_path' => '<front>',
),
),
),
),
),
);
populate_menu($items, 'main-menu');
hook_menu()
커스텀 모듈로 구현하기 만하면됩니다. 사용자 정의 모듈을 만들려면 이 설명서를 참조하십시오 .
//Define the menus in the function which goes in your MYMODULE.module file
function MYMODULE_menu() {
//the menu which will point to http://yoursite/first-menu
$items['first-menu'] = array(
'title' => 'First menu', // will appear as the name of the link
// Page callback, etc. need to be added here.
);
//the menu which will point to http://yoursite/second-menu
$items['second-menu'] = array(
'title' => 'Second menu', // will appear as the name of the link
// Page callback, etc. need to be added here.
);
//the menu which will point to http://yoursite/third-menu
$items['third-menu'] = array(
'title' => 'third menu', // will appear as the name of the link
// Page callback, etc. need to be added here.
);
return $items;
}
page.tpl.php
테마 파일에 다음 코드를 추가하여 어느 지역에서나 메뉴를 인쇄 할 수 있습니다 .
//add this line in <div id="header"></div> to print it in header.
<?php
$menu1 = menu_navigation_links('first-menu');
print theme('links__first_menu', array('links' => $menu1));
//print second menu just below first menu
$menu2 = menu_navigation_links('second-menu');
print theme('links__second_menu', array('links' => $menu1));
?>
third-menu
기본적으로 탐색 메뉴에 표시되므로 인쇄 할 필요가 없습니다 .
참고 : 탐색 메뉴를 만들어 페이지에 추가 할 때는 전혀 권장되지 않습니다. hook_menu ()는 탐색 메뉴를 만들지 않고 페이지 콜백을 만들기위한 것입니다. 차이점을 설명하는 THIS를 읽으십시오 . Drupal을 배우기 시작했을 때 나는 이것에 답했고 더 이상이 대답을 추천하지 않습니다.
메뉴 가져 오기 모듈을 사용해 볼 수도 있습니다 . 메뉴 배포가 매우 시원하고 쉽습니다. 웹 사이트에서 직접 메뉴를 만들고 생성 된 JSON을 사용할 수 있습니다. 또한 존재하지 않는 페이지에 대한 노드를 작성할 수 있습니다.
다음은 내보내기 스크립트의 예입니다.
$menu_name = 'menu-footer-secondary-menu';
// Create menu if doesn't exist.
if (!menu_load($menu_name)) {
$menu = array(
'menu_name' => $menu_name,
'title' => t('Footer secondary menu'),
'description' => '',
);
menu_save($menu);
}
// Import menu links from JSON.
$menu_string = 'Impressum {"url":"node\/1","options":{"attributes":[]}}
Datenschutzbestimmungen {"url":"node\/2","options":{"attributes":[]}}
Nutzungsbedingungen {"url":"node\/3","options":{"attributes":[]}}
';
$options = array(
//'link_to_content' => TRUE, // Look for existing nodes and link to them.
'create_content' => TRUE, // Create new content (also if link_to_content not set).
'remove_menu_items' => TRUE, // Removes current menu items.
'node_type' => 'page',
'node_body' => 'Page is in development...',
'node_author' => 1,
'node_status' => 1,
);
menu_import_string($menu_string, $menu_name, $options);
hook_update_N () 또는 Update script processor 로이 스크립트를 실행할 수 있습니다
hook_enable () 유형을 구현하는 .install 파일에서 메뉴 블록을 작성하려면
function mymodule_enable() {
$t = get_t();
if (module_exists('menu')) {
menu_save(array(
'menu_name' => 'my-new-menu',
'title' => $t('My New Menu'),
'description' => $t('My Menu description'),
));
}
}
동일한 .install 파일에서 hook_uninstall ()을 구현하십시오.
function mymodule_uninstall() {
if (module_exists('menu')) {
if ($my_menu = menu_load('my-new-menu')) {
menu_delete($my_menu);
}
}
}
다음은 .module 파일에서 hook_menu ()를 구현하는 동안입니다.
function mymodule_menu() {
return array(
'mypage' => array(
'title' => 'My Page',
'description' => 'My Page description',
'page callback' => 'my_page_callback_func',
'page arguments' => array(arg(0)),
'access arguments' => array('access content'),
'menu_name' => 'my-new-menu',
'file' => 'my.new.page.inc',
'file path' => drupal_get_path('module', 'mymodule') . '/includes',
),
);
}
.inc 파일에는 mymodule 폴더 내에 포함 된 폴더가 포함되어 있습니다.
자세한 정보는 devel 모듈의 devel.install 및 devel.module 파일을 참조하십시오.