Drupal 7에서 프로그래밍 방식으로 메뉴 만들기


15

초보자 질문들.

프로그래밍 방식으로 메뉴를 어떻게 만들 수 있습니까? 만들고 싶은 메뉴가 3 개 있다고 말합니다. 첫 번째 메뉴는 헤더의 왼쪽 상단에 배치됩니다. 두 번째 메뉴는 첫 번째 메뉴 아래에 배치됩니다. 세 번째 메뉴는 기본 탐색 메뉴입니다.

이 메뉴들이 같은 그룹에 속할 수 있습니까? 스타일링에 문제가 있습니까?

감사

답변:


25

업데이트 스크립트에서이 작업을 수행하려는 경우 다음과 같이 작동합니다.

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

내 접근 방식이 잘못되면 의견을 환영합니다. 감사.


이것이 바로 내가 원하는 것입니다. 코드를 시험 해보고 나중에 의견을 보내 드리겠습니다. 공유해 주셔서 감사합니다
user8012

5
$ exists db 쿼리를 실행하는 대신보다 미래의 증거 (약간 느리지 만) 방법은 if ​​(! menu_load ($ menu [ 'menu_name'])) {menu_save ($ menu); }
Bala Clark

시원하고 좋은 것!
Tyler Durden

내 제안은 쿼리 대신 menu_get_menus () 를 사용 하는 것입니다. 그런 다음 메뉴를 var에 저장하고 간단하게 수행 할 수 있습니다. if (!array_key_exists($menu, $menus)) {또한 단일 매개 변수 FALSE를 menu_get_menus ()에 추가하면 사용자 정의 메뉴 만 반환됩니다.
Christian

1
또한 메뉴 링크가 존재하는지 점검 할 때 : // 데이터가 존재하면 먼저 테이블을보십시오 $ exists = ... 동일한 링크 조합이 다른 메뉴에있을 수 있으므로 menu_name도 점검해야합니다.
hugronaphor

4

배열에서 메뉴를 쉽게 채우는 방법은 다음과 같습니다.

<?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');

2

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을 배우기 시작했을 때 나는 이것에 답했고 더 이상이 대답을 추천하지 않습니다.


1
탐색 메뉴를 작성하여 페이지에 추가하는 것은 좋지 않습니다. hook_menu ()는 탐색 메뉴를 만들지 않고 페이지 콜백을 만들기위한 것입니다. 차이점을 설명하는 다음을 읽으십시오. api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
Christian

1
@Christian 나는 이것에 답하면서 Drupal을 배우기 시작했습니다. Drupal을 배우는 것을 선호하는 방식은 실제로 시도해 보면서 여기에 질문에 답하는 것입니다. 내가 아는 현재의 지식 수준에서, 나는 이런 유형의 답변에도 투표 할 것입니다. 그러나 나는 실제로 처음에 생각한 방식을 자랑스럽게 생각합니다. :) 당신이 설명 한 방식과 제공된 링크에 감사드립니다.
AjitS

안녕 AjitS, 모두 좋은-나는 자주 답변을 투표하지 않습니다. 더 이상이 방법을 제안하지 않는다는 답변 앞에 업데이트를 추가하기 만하면됩니다. 답장을 보내 주셔서 감사합니다.
Christian

내 downvote를 제거했습니다.
Christian

0

메뉴 가져 오기 모듈을 사용해 볼 수도 있습니다 . 메뉴 배포가 매우 시원하고 쉽습니다. 웹 사이트에서 직접 메뉴를 만들고 생성 된 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 로이 스크립트를 실행할 수 있습니다


0

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 파일을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.