Buat menu secara pemrograman di Drupal 7


15

Seorang pemula bertanya, kawan.

Ada pemikiran bagaimana saya bisa membuat menu secara terprogram? Mengatakan saya memiliki 3 menu berbeda yang ingin saya buat. Menu pertama akan ditempatkan di kiri atas tajuk. Menu kedua akan ditempatkan di bawah menu pertama. Menu ketiga akan menjadi navigasi utama.

Mungkinkah menu ini berada di bawah grup yang sama? Apakah itu menjadi masalah dalam penataan?

Terima kasih

Jawaban:


25

Jika Anda mencoba melakukan ini dalam skrip pembaruan, ini akan berfungsi:

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

Komentar diterima jika pendekatan saya salah. Terima kasih.


Inilah yang saya inginkan. Biarkan saya mencoba kode Anda dan akan memberikan umpan balik nanti. Terima kasih telah berbagi
user8012

5
Alih-alih menjalankan $, ada db query metode pembuktian lebih lanjut di masa depan (tapi mungkin sedikit lebih lambat) adalah dengan hanya menggunakan if (! Menu_load ($ menu ['menu_name'])) {menu_save ($ menu); }
Bala Clark

Keren, bagus!
Tyler Durden

Saran saya adalah menggunakan menu_get_menus () alih-alih kueri. Kemudian Anda dapat menyimpan menu ke var dan cukup melakukan if (!array_key_exists($menu, $menus)) {- juga menambahkan param tunggal FALSE ke menu_get_menus () mengembalikan hanya menu kustom.
Christian

1
Juga ketika Anda memeriksa apakah tautan menu ada: // Lihat tabel terlebih dahulu jika data memang ada $ exist = ... Anda juga perlu memeriksa menu_name karena kombinasi tautan yang sama dapat berada di menu yang berbeda.
hugronaphor

4

Berikut cara mudah mengisi menu dari array:

<?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()adalah yang Anda butuhkan untuk mengimplementasikan modul kustom Anda. Untuk pembuatan modul khusus, lihat dokumentasi ini .

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

Anda dapat mencetak menu di wilayah mana saja dengan menambahkan kode berikut ke menu page.tpl.php file tema Anda.

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

Anda tidak perlu mencetak third-menukarena secara default akan muncul di menu navigasi.


CATATAN: Ini bukan praktik terbaik sama sekali untuk membuat menu navigasi dan menambahkannya ke halaman. hook_menu () adalah untuk membuat panggilan balik halaman dan bukan untuk membuat menu navigasi. Silakan baca INI , yang menjelaskan perbedaannya. Saya menjawab ini ketika saya mulai belajar Drupal dan saya tidak merekomendasikan jawaban ini lagi.


1
Ini bukan praktik terbaik sama sekali untuk membuat menu navigasi dan menambahkannya ke halaman. hook_menu () adalah untuk membuat panggilan balik halaman dan bukan untuk membuat menu navigasi. Silakan baca yang berikut yang menjelaskan perbedaannya. api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
Christian

1
@Christian Saya baru saja mulai belajar Drupal saat menjawab ini; dan cara saya lebih suka belajar Drupal adalah dengan menjawab pertanyaan di sini dengan benar-benar mencoba berbagai hal. Pada tingkat pengetahuan yang saya miliki saat ini, saya pasti akan memilih jenis jawaban ini juga; tapi saya sebenarnya agak bangga dengan cara saya berpikir di awal :) Saya menghargai cara Anda menjelaskan dan tautan yang disediakan.
AjitS

Hei AjitS, semuanya baik-baik saja - saya jarang memberikan jawaban. Saya hanya akan menambahkan pembaruan sebelum jawaban yang mengatakan bahwa Anda tidak lagi menyarankan pendekatan ini. Terima kasih balasannya.
Christian

telah menghapus downvote saya.
Christian

0

Anda juga dapat mencoba modul Menu Impor . Ini sangat keren dan mudah untuk penyebaran menu. Anda dapat membuat menu dengan tangan di situs web Anda dan menggunakan JSON yang dihasilkan. Anda juga dapat membuat simpul untuk halaman yang tidak ada.

Berikut ini contoh skrip ekspor:

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

Anda dapat menjalankan skrip ini dengan hook_update_N () atau Perbarui skrip prosesor


0

Untuk membuat blok menu, dalam file .install Anda, implementasikan tipe 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'),
    ));
  }
 }

Dalam file .install yang sama, mengimplementasikan hook_uninstall ().

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

Selanjutnya dalam file .module Anda, saat menerapkan 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',
  ),
 );     
}

File .inc withing menyertakan folder yang ditempatkan di dalam folder mymodule.

Lihat file devel.install modul devel dan devel.module untuk informasi lebih lanjut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.