Drupal 7'de programlı bir menü oluşturma


15

Acemi bir soru çocuklar.

Herhangi bir düşünce programlı bir menü nasıl oluşturabilirim? Oluşturmak istediğim 3 farklı menüm olduğunu söylüyor. İlk menü başlığın sol üst köşesine yerleştirilecektir. İkinci menü ilk menünün altına yerleştirilecektir. Üçüncü menü ana navigasyon olacaktır.

Bunlar menüler aynı grupta olabilir mi? Stil oluşturmada sorun olur mu?

Teşekkürler

Yanıtlar:


25

Bunu bir güncelleme komut dosyasında yapmaya çalışıyorsanız, bunun çalışması gerekir:

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

Yaklaşımım yanlışsa yorumlarınızı bekliyoruz. Teşekkürler.


Bu tam olarak istediğim şey. Kodunuzu deneyeyim ve daha sonra geri bildirimde bulunacağım.
Paylaştığınız

5
$ Exist db sorgusu çalıştırmak yerine, gelecekteki bir kanıt (ama belki biraz daha yavaş) yöntemi sadece (! Menu_load ($ menu ['menu_name']))) {menu_save ($ menu); }
Bala Clark

Güzel, güzel biri!
Tyler Durden

Benim önerim sorgu yerine menu_get_menus () kullanmak olacaktır . Daha sonra menüleri bir if (!array_key_exists($menu, $menus)) {var'a kaydedebilir ve basitçe bir - FALSE parametresinin menu_get_menus () öğesine eklenmesi yalnızca özel menüler döndürür.
Christian

1
Ayrıca menü bağlantısının var olup olmadığını kontrol ettiğinizde: // Veriler mevcutsa önce tabloya bakın $ exist = ... Aynı menü birleşiminin farklı menülerde olabileceği için menü_adı da kontrol etmeniz gerekir.
hugronaphor

4

İşte bir diziden bir menüyü kolayca doldurmanın bir yolu:

<?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()size özel modülde uygulamanız gereken tek şey. Özel modül oluşturmak için bu belgelere bakın .

//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.phpTemanızın dosyasına aşağıdaki kodu ekleyerek herhangi bir bölgedeki menüyü yazdırabilirsiniz .

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

Yazdırmanıza gerek yoktur, third-menuçünkü varsayılan olarak gezinme menüsünde görünecektir.


NOT: Bu, bir gezinme menüsü oluşturmak ve bir sayfaya eklemek için en iyi yöntem değildir. hook_menu (), sayfa geri aramaları oluşturmak içindir, gezinme menüleri oluşturmak için değildir. Lütfen farklılıkları açıklayan BU makaleyi okuyun . Drupal öğrenmeye başladığımda bunu cevapladım ve artık bu cevabı önermiyorum.


1
Bu, bir gezinme menüsü oluşturmak ve bir sayfaya eklemek için en iyi yöntem değildir. hook_menu (), sayfa geri aramaları oluşturmak içindir, gezinme menüleri oluşturmak için değildir. Lütfen farklılıkları açıklayan aşağıdakileri okuyun. api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
Christian

1
@Norist buna cevap verirken Drupal öğrenmeye yeni başlamıştım; ve Drupal'ı öğrenmeyi tercih ettiğim yol, burada gerçekten bir şeyler deneyerek soruları cevaplamaktı. Mevcut bilgi düzeyimde, bu tür bir cevabı da kesinlikle oylarım; ama aslında başlangıçta düşündüğüm şekilde gurur duyuyorum :) Açıkladığınız ve verilen bağlantıyı takdir ediyorum.
AjitS

Hey AjitS, hepsi iyi - cevapları sık sık oylamıyorum. Sadece bu yaklaşımı önermediğinizi söyleyen cevaptan önce bir güncelleme ekleyeceğim. Cevap için teşekkürler.
Christian

benim oyumu sildim.
Christian

0

Menü İçe Aktarma modülünü de deneyebilirsiniz . Menü dağıtımı için çok havalı ve kolaydır. Web sitenizde elinizle menü oluşturabilir ve oluşturulan JSON'u kullanabilirsiniz. Ayrıca mevcut olmayan sayfalar için düğümler oluşturabilirsiniz.

Dışa aktarma komut dosyası örneği:

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

Bu komut dosyasını hook_update_N () veya Update script işlemci ile çalıştırabilirsiniz.


0

Bir menü bloğu oluşturmak için, hook_enable () türünü uygulayan .install dosyanızda

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

Aynı .install dosyasında hook_uninstall () uygulanıyor.

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

Daha sonra hook_menu () uygularken .module dosyanızda.

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

.İnc dosyası mymodule klasörüne yerleştirilen klasörü içeriyor.

Daha fazla bilgi için devel modülünün devel.install ve devel.module dosyasına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.