Tạo một menu lập trình trong Drupal 7


15

Một người mới hỏi.

Bất kỳ suy nghĩ làm thế nào tôi có thể tạo ra một menu lập trình? Nói rằng tôi có 3 menu khác nhau mà tôi muốn tạo. Menu đầu tiên sẽ được đặt ở phía trên bên trái của tiêu đề. Menu thứ hai sẽ được đặt bên dưới menu đầu tiên. Menu thứ ba sẽ là điều hướng chính.

Những menu này có thể nằm trong cùng một nhóm không? Nó sẽ là một vấn đề trong phong cách?

Cảm ơn

Câu trả lời:


25

Nếu bạn đang cố gắng thực hiện điều này trong một kịch bản cập nhật, thì nó sẽ hoạt động:

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

Bình luận được hoan nghênh nếu cách tiếp cận của tôi là sai. Cảm ơn.


Đây chính xác là những gì tôi muốn. Hãy để tôi thử mã của bạn và sẽ cung cấp thông tin phản hồi sau. Cảm ơn đã chia sẻ
user8012

5
Thay vì chạy truy vấn db tồn tại, một phương thức chứng minh trong tương lai (nhưng có thể chậm hơn một chút) sẽ chỉ sử dụng if (! Menu_load ($ menu ['menu_name'])) {menu_save ($ menu); }
Bala Clark

Thật tuyệt, thật tuyệt!
Tyler Durden

Đề xuất của tôi sẽ là sử dụng menu_get_menus () thay vì truy vấn. Sau đó, bạn có thể lưu các menu vào một var và chỉ cần thực hiện if (!array_key_exists($menu, $menus)) {- đồng thời thêm param FALSE duy nhất vào menu_get_menus () chỉ trả về các menu tùy chỉnh.
Christian

1
Ngoài ra khi bạn kiểm tra xem liên kết menu có tồn tại hay không: // Nhìn vào bảng trước nếu dữ liệu tồn tại $ tồn tại = ... Bạn cũng cần kiểm tra menu_name vì có thể kết hợp cùng một liên kết trong các menu khác nhau.
hugronaphor

4

Đây là một cách để dễ dàng điền vào một menu từ một mảng:

<?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()là tất cả những gì bạn cần để thực hiện trong mô-đun tùy chỉnh của bạn. Để tạo mô-đun tùy chỉnh, tham khảo tài liệu này .

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

Bạn có thể in menu ở bất kỳ khu vực nào bằng cách thêm mã sau vào page.tpl.phptệp chủ đề của bạn.

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

Bạn không cần in third-menuvì theo mặc định, nó sẽ xuất hiện ở menu điều hướng.


LƯU Ý: Đây hoàn toàn không phải là cách thực hành tốt nhất để tạo menu điều hướng và thêm nó vào một trang. hook_menu () là để tạo các cuộc gọi lại trang chứ không phải để tạo các menu điều hướng. Xin vui lòng đọc NÀY , trong đó giải thích sự khác biệt. Tôi đã trả lời điều này khi tôi bắt đầu học Drupal và tôi không đề xuất câu trả lời này nữa.


1
Đây hoàn toàn không phải là cách thực hành tốt nhất để tạo menu điều hướng và thêm nó vào một trang. hook_menu () là để tạo các cuộc gọi lại trang chứ không phải để tạo các menu điều hướng. Xin vui lòng đọc những điều sau đây giải thích sự khác biệt. api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
Christian

1
@Christian Tôi mới bắt đầu học Drupal trong khi trả lời điều này; và cách tôi thích học Drupal là trả lời các câu hỏi ở đây bằng cách thực sự thử mọi thứ. Ở cấp độ kiến ​​thức hiện tại tôi có, tôi chắc chắn cũng sẽ bỏ phiếu loại câu trả lời này; nhưng tôi thực sự tự hào về cách tôi nghĩ lúc đầu :) Tôi đánh giá cao cách bạn giải thích và liên kết được cung cấp.
AjitS

Xin chào AjitS, tất cả đều tốt - tôi không bỏ phiếu trả lời thường xuyên. Tôi chỉ đơn giản là thêm một bản cập nhật trước câu trả lời nói rằng bạn không còn đề xuất phương pháp này nữa. Cảm ơn vi đa trả lơi.
Christian

đã loại bỏ downvote của tôi.
Christian

0

Bạn cũng có thể thử mô-đun Nhập Menu . Nó rất tuyệt và dễ dàng để triển khai menu. Bạn có thể tạo menu bằng tay trên trang web của mình và sử dụng JSON được tạo. Ngoài ra, bạn có thể tạo các nút cho các trang không tồn tại.

Dưới đây là ví dụ về tập lệnh xuất:

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

Bạn có thể chạy tập lệnh này với hook_update_N () hoặc Cập nhật bộ xử lý tập lệnh


0

Để tạo khối menu, trong tệp .install của bạn triển khai kiểu hook_enable ()

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

Trong cùng một tệp .install, triển khai hook_uninstall ().

function mymodule_uninstall() {
  if (module_exists('menu')) {
   if ($my_menu = menu_load('my-new-menu')) {
    menu_delete($my_menu);
  }
 }
}

Tiếp theo trong tệp .module của bạn, trong khi triển khai 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',
  ),
 );     
}

Tệp .inc đang héo bao gồm thư mục được đặt trong thư mục mymodule.

Xem tập tin devel.install và devel.module của mô-đun devel để biết thêm thông tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.