Erstellen Sie programmgesteuert ein Menü in Drupal 7


15

Eine neue Frage, Jungs.

Irgendwelche Gedanken, wie kann ich ein Menü programmatisch erstellen? Sagt, ich habe 3 verschiedene Menüs, die ich erstellen möchte. Das erste Menü befindet sich oben links in der Kopfzeile. Das zweite Menü wird unter dem ersten Menü platziert. Das dritte Menü ist die Hauptnavigation.

Könnten diese die Menüs unter der gleichen Gruppe sein? Wäre es ein Problem beim Styling?

Vielen Dank

Antworten:


25

Wenn Sie versuchen, dies in einem Update-Skript zu tun, sollte dies funktionieren:

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

Kommentare sind willkommen, wenn mein Ansatz falsch ist. Vielen Dank.


Genau das möchte ich. Lassen Sie mich Ihren Code ausprobieren und später eine Rückmeldung geben. Vielen Dank für das Teilen
user8012

5
Anstatt die $ exists db-Abfrage auszuführen, wäre es eine zukunftssicherere (aber möglicherweise etwas langsamere) Methode, nur if (! Menu_load ($ menu ['menu_name'])) {menu_save ($ menu); }
Bala Clark

Coole, schöne!
Tyler Durden

Mein Vorschlag wäre, menu_get_menus () anstelle einer Abfrage zu verwenden. Dann können Sie die Menüs in einer if (!array_key_exists($menu, $menus)) {Variablen speichern und einfach Folgendes tun: - Wenn Sie auch den einzelnen Parameter FALSE zu menu_get_menus () hinzufügen, werden nur benutzerdefinierte Menüs zurückgegeben.
Christian

1
Auch wenn Sie prüfen, ob die Menüverknüpfung vorhanden ist: // Sehen Sie zuerst in der Tabelle nach, ob die Daten vorhanden sind. $ Exists = ... Sie müssen auch nach menu_name suchen, da dieselbe Verknüpfungskombination in verschiedenen Menüs vorhanden sein kann.
Hugronaphor

4

So füllen Sie ein Menü auf einfache Weise aus einem 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()ist alles, was Sie in Ihrem benutzerdefinierten Modul implementieren müssen. Informationen zum Erstellen eines benutzerdefinierten Moduls finden Sie in dieser Dokumentation .

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

Sie können das Menü in jeder Region ausdrucken, indem page.tpl.phpSie der Datei Ihres Themas den folgenden Code hinzufügen .

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

Sie müssen nicht drucken, third-menuda es standardmäßig im Navigationsmenü angezeigt wird.


HINWEIS: Dies ist keine bewährte Methode zum Erstellen eines Navigationsmenüs und zum Hinzufügen zu einer Seite. hook_menu () dient zum Erstellen von Seitenrückrufen und nicht zum Erstellen von Navigationsmenüs. Bitte lesen Sie DIESES , das die Unterschiede erklärt. Ich antwortete darauf, als ich anfing, Drupal zu lernen, und empfehle diese Antwort nicht mehr.


1
Dies ist überhaupt keine bewährte Methode zum Erstellen eines Navigationsmenüs und zum Hinzufügen zu einer Seite. hook_menu () dient zum Erstellen von Seitenrückrufen und nicht zum Erstellen von Navigationsmenüs. Bitte lesen Sie das Folgende, das die Unterschiede erklärt. api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
Christian

1
@Christian Ich habe gerade angefangen, Drupal zu lernen, als ich darauf geantwortet habe. Am liebsten habe ich Drupal gelernt, indem ich hier Fragen beantwortete, indem ich Dinge ausprobierte. Nach meinem derzeitigen Kenntnisstand würde ich diese Art von Antwort auf jeden Fall auch ablehnen. aber ich bin eigentlich ein bisschen stolz auf die Art und Weise, wie ich am Anfang gedacht habe :) Ich schätze die Art und Weise, wie du es erklärt hast und den bereitgestellten Link.
Ajits

Hey Ajits, alles gut - ich stimme nicht oft ab. Ich würde einfach vor der Antwort ein Update hinzufügen, das besagt, dass Sie diesen Ansatz nicht mehr vorschlagen. Danke für die Antwort.
Christian

habe meine downvote entfernt.
Christian

0

Sie können auch das Menü-Import- Modul ausprobieren . Es ist sehr cool und einfach für die Menübereitstellung. Sie können auf Ihrer Website manuell ein Menü erstellen und den generierten JSON verwenden. Sie können auch Knoten für nicht vorhandene Seiten erstellen.

Hier ist ein Beispiel für ein Exportskript:

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

Sie können dieses Skript mit hook_update_N () oder Update script processor ausführen


0

Um einen Menüblock zu erstellen, geben Sie in Ihrer .install-Datei hook_enable () ein

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

Implementieren Sie in derselben .install-Datei hook_uninstall ().

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

Weiter in Ihrer .module-Datei, während hook_menu () implementiert wird.

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

Die .inc-Datei enthält einen Ordner, der sich im mymodule-Ordner befindet.

Weitere Informationen finden Sie in den Abschnitten devel.install und devel.module des Devel- Moduls.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.