web-dev-qa-db-ja.com

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テーブルに作成されますが、空のlink_pathが含まれているため、nidで作成されたノードを取得できません。 また、install_finished()をオーバーライドして、メニューを作成するための関数を.installまたは.profileファイルに配置しますが、それは同じです。任意のアイデア?

2
Ossama
$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
Ossama

これを使用してメニュー項目を追加できます

$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();
0
user36425