Как программно создавать ссылки меню с только что созданными узлами во время установки профиля в aegir? не удается получить nid!


Я создаю набор узлов в профиле установки. Когда я пытаюсь создать ссылки меню для них в том же PROFILE_NAME.install, ссылки не создаются.

Я также пытался создать ссылки на меню в отдельном модуле и использовать hook_update_N() для их включения, но это также не работает.

Когда я удаляю модуль и повторно активирую его, он правильно создает ссылки в моем меню.

Я попытался использовать hook_install_tasks() и вставил его в MYPROFILE_NAME.profile или MYPROFILE_NAME.install, но это также не работает.

Как я могу создать ссылки меню для узлов, созданных как часть профиля установки?

Мой код для создания узлов в MY_PROFILE_NAME.install:

// creation of my nodes (same content for all)
   $nodi = array(
       // i have other 14 nodes  
      'title' => array('Home'),
       // i have other 14 paths for the nodes
      'path' => array('home'),
   );
$titoli = array();
$titoli = $nodi['title'];
$percorsi = array();
$percorsi = $nodi['path'];
//CREAZIONI DEL CONTENUTO PROGRAMMATICAMENTE
  for($i = 0; $i< count($titoli); $i++){
$testo_body = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec feugiat velit eget metus placerat,varius eros facilisis. Aenean aliquam imperdiet nisl ut dapibus...';
           $node = new stdClass(); // nuovo oggetto nodo
           $lingua = 'it'; 
           $node->type = "page"; //
           $node->title = $titoli[$i];
           $node->language = $lingua; 
           $node->path = array('alias' => $percorsi[$i]); // i think here is the problem !!!
           $node->uid = 1; // admin
           $node->status = 1;
           // Body field    
           $body_field_info = field_info_field('body');
           if (field_is_translatable('node', $body_field_info)) {
              $body_lingua = field_valid_language($lingua);
           }else{
              $body_lingua = LANGUAGE_NONE;
           }
           $node->body[$body_lingua][0]['value'] = $testo_body;
           $node->body[$body_lingua][0]['summary'] = 'text...';
           $node->body[$body_lingua][0]['format'] = 'full_html';
           $node = node_submit($node); // Prepare node for a submit
           node_save($node); // After this call we'll get a nid

И мой код для создания ссылок в меню:


    // Create a Home link in the main menu.   
  $path = drupal_lookup_path('source', 'home');
  $item = array(
    'link_path' => $path,
    'router_path' => $path,
    'link_title' => st('Home'),
    'menu_name' => 'main-menu',
    'weight' => -50,
    'customized' => 1,
    'plid' => 0, // Parent menu item, 0 if menu item is on top level
  );
  menu_link_save($item);
  menu_rebuild();

Обновление 2

Меню создаются в таблице menu_links, но с пустым путем к ссылке , поэтому я не могу получить nid созданных узлов. Я также хотел переопределить install_finished() и поместил мою функцию для создания меню в файлы .install или .profile, но это одно и то же. Есть какие-нибудь идеи?

Author: kenorb, 2016-01-13

2 answers

Вы можете добавить пункт меню, используя этот

$item = array(
        'menu_name' => 'menu-name',
        'link_title' => 'Link title',
        'link_path' => 'node/'. $nid,
      );
menu_link_save($item);
//don't forget to clear menu cache after saving menu item
menu_cache_clear_all();

Надеюсь, это поможет

Обновленный ответ Когда я заглянул в установочный файл стандартного профиля Drupal 7, то есть standard.install (строка № 413), вы можете увидеть там создание ссылки "Главная".

// Create a Home link in the main menu.
  $item = array(
    'link_title' => st('Home'),
    'link_path' => '<front>',
    'menu_name' => 'main-menu',
  );
  menu_link_save($item);

  // Update the menu router information.
  menu_rebuild();
 1
Author: , 2016-01-14 06:01:56
$nodi = array(
        'title' => array(
                 'Home' ,
                 'Presentazione' ,
                         'Obiettivi' ,
                         'Comitato organizzatore' ,
                         'Patrocini' ,
                         'Edizioni passate' ,
                        // 'Calendario eventi' ,
                 'Materiali' ,
                         'Cartelle stampa' ,
                         'Documentazione' ,
                         'Video' ,
                 'Dove siamo' ,
                 'Contatti',
        ),
        'path' => array(
                 'home' ,
                 'presentazione' ,
                         'obiettivi' ,
                         'comitato-organizzatore' ,
                         'patrocini' ,
                         'edizioni-passate' ,
                  //'calendar-node-field-date/month' ,
                 'materiali' ,
                         'cartelle-stampa' ,
                         'documentazione' ,
                         'video' ,
                 'dove-siamo' ,
                 'contatti',
        ),
    );
    $titoli = array();
    $titoli = $nodi['title'];
    $percorsi = array();
    $percorsi = $nodi['path'];
    $miei_path = array();
    $alias = array();

    //CREAZIONI DEL CONTENUTO PROGRAMMATICAMENTE
      for($i = 0; $i< count($titoli); $i++){
        //SE È IL CALENDARIO O GALLERIA DELLE IMMAGINI NON CREARE LE PAGINE PERCHÉ CI SONO GIÀ

               $testo_body = 'Lorem ipsum dolor ..';
               $node = new stdClass(); // nuovo oggetto nodo
               $lingua = 'it'; 
               $node->type = "page";

               node_object_prepare($node); // Set some default values.

               $node->title = $titoli[$i];
               $node->language = $lingua; //non settato LANGUAGE_NONE
               $node->path['pathauto'] = 0;
               $node->uid = 1; // admin
               $node->status = 1;
               $node->comment = 0;
               $node->promote = 0;
               $node->moderate = 0;
               $node->sticky = 0;
               // Body field
               $body_field_info = field_info_field('body');
               if (field_is_translatable('node', $body_field_info)) {
                  $body_lingua = field_valid_language($lingua);
               }else{
                  $body_lingua = LANGUAGE_NONE;
               }
               $node->body[$body_lingua][0]['value'] = $testo_body;
               $node->body[$body_lingua][0]['summary'] = 'Questo è un testo esempio.';
               $node->body[$body_lingua][0]['format'] = 'full_html';
              $node = node_submit($node); // Prepare node for a submit

               $node->path = array('alias' => ('content/'.$percorsi[$i]));         // Setting a node path
              node_save($node); // After this call we'll get a nid

              $mio_path = $node->nid;
              $miei_path[$i] = $mio_path;
              $mio_alias[$i] = $node->path['alias'];
              watchdog(WATCHDOG_INFO, "E' stato creato il nodo " . $titoli[$i] . " correttamente, con alias  ".$percorsi[$i] ."---- " . $mio_alias[$i]. "   ".var_dump($node->path), $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL);
              $fornt = "node/".$miei_path[0];
              variable_set('site_frontpage', $fornt);
        }
 0
Author: Ossama, 2016-04-11 13:29:50