Créer un menu par programme dans Drupal 7

15

Une question de débutant les gars.

Avez-vous des idées comment créer un menu par programme? Dit que j'ai 3 menus différents que je veux créer. Le premier menu sera placé en haut à gauche de l'en-tête. Le deuxième menu sera placé sous le premier menu. Le troisième menu sera la navigation principale.

Ces menus peuvent-ils appartenir au même groupe? Serait-ce un problème de style?

Merci

user8012
la source

Réponses:

25

Si vous essayez de le faire dans un script de mise à jour, cela devrait fonctionner:

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

Les commentaires sont les bienvenus si mon approche est fausse. Merci.

ninjascorner
la source
C'est exactement ce que je veux. Laissez-moi essayer votre code et je vous ferai part de vos commentaires plus tard. Merci pour le partage
user8012
5
Au lieu d'exécuter la requête $ exist db, une méthode plus à l'épreuve du temps (mais peut-être légèrement plus lente) consisterait simplement à utiliser if (! Menu_load ($ menu ['menu_name'])) {menu_save ($ menu); }
Bala Clark
Cool, gentil!
Tyler Durden
Ma suggestion serait d'utiliser menu_get_menus () au lieu d'une requête. Ensuite, vous pouvez enregistrer les menus dans une var et simplement faire un if (!array_key_exists($menu, $menus)) {- l'ajout du seul paramètre FALSE à menu_get_menus () ne renvoie que des menus personnalisés.
Christian
1
De plus, lorsque vous vérifiez si le lien de menu existe: // Regardez d'abord le tableau si les données existent.
hugronaphor
4

Voici un moyen de remplir facilement un menu à partir d'un tableau:

<?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');
Adolescent
la source
2

hook_menu()est tout ce dont vous avez besoin pour implémenter votre module personnalisé. Pour la création d'un module personnalisé, reportez-vous à cette documentation .

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

Vous pouvez imprimer le menu dans n'importe quelle région en ajoutant le code suivant au page.tpl.phpfichier de votre thème.

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

Vous n'avez pas besoin d'imprimer third-menucar par défaut, il apparaîtra dans le menu de navigation.


REMARQUE: ce n'est pas du tout la meilleure pratique pour créer un menu de navigation et l'ajouter à une page. hook_menu () sert à créer des rappels de page et non à créer des menus de navigation. Veuillez lire CECI , qui explique les différences. J'ai répondu à cela quand j'ai commencé à apprendre Drupal et je ne recommande plus cette réponse.

AjitS
la source
1
Ce n'est pas du tout une bonne pratique pour créer un menu de navigation et l'ajouter à une page. hook_menu () sert à créer des rappels de page et non à créer des menus de navigation. Veuillez lire ce qui suit qui explique les différences. api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
Christian
1
@Christian Je venais de commencer à apprendre Drupal en répondant à cette question; et la façon dont j'ai préféré apprendre Drupal était de répondre aux questions ici en essayant réellement les choses. Au niveau actuel de connaissances que je possède, je voterais certainement pour ce type de réponse aussi; mais je suis en fait assez fier de la façon dont je pensais au début :) J'apprécie la façon dont vous avez expliqué et le lien fourni.
AjitS
Hey AjitS, tout va bien - je ne vote pas souvent les réponses. Je voudrais simplement ajouter une mise à jour avant la réponse qui dit que vous ne proposez plus cette approche. Merci pour la réponse.
Christian
ont supprimé mon downvote.
Christian
0

Vous pouvez également essayer le module Importation de menu . C'est très cool et facile pour le déploiement de menus. Vous pouvez créer un menu à la main sur votre site Web et utiliser le JSON généré. Vous pouvez également créer des nœuds pour des pages non existantes.

Voici un exemple de script d'exportation:

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

Vous pouvez exécuter ce script avec hook_update_N () ou Mettre à jour le processeur de script

milkovsky
la source
0

Pour créer un bloc de menu, dans votre fichier .install implémentant le type 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'),
    ));
  }
 }

Dans le même fichier .install, implémentation de hook_uninstall ().

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

Ensuite dans votre fichier .module, lors de l'implémentation de 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',
  ),
 );     
}

Le fichier .inc est withing inclut le dossier placé dans le dossier mymodule.

Voir le fichier devel.install et devel.module du module devel pour plus d'informations.

Sarathkm
la source