Не создается ЧПУ при клонировании(переводе) ноды, паттерн [menupath-raw]

Главные вкладки

Аватар пользователя kuzyakiev kuzyakiev 15 октября 2010 в 11:29

ЗАДАЧА:
Есть типы категория(typical), подкатегория(subtypical).
Нужно при создании страницы subtypical делать для неё чпу типа www.site.com/typical/subtypical
И создавать ноды перевода на все остальные языки с чпу типа www.site.com/en/typical/subtypical

РЕШЕНИЕ:
Создадим по меню в каждом языке. В меню будем добавлять наши typical и subtypical
ЧПУ задаётся pathauto при помощи паттерна [menupath-raw].html
Для клонирования нод при создании, модулем rules ловим событие After saving new content с условием IF Created content is Subtypical и командой DO Execute custom PHP code в котором вызываем файл

<?php
// $node->promote = 1 | 0; use as my publish\unpublish
   
    $node->tnid = $node->nid;
    $_node = new stdClass();
    $_node = drupal_clone($node);
    $node->promote = 1;
    node_save($node);
   
    // Delete unique params
    unset($_node->nid);
    unset($_node->vid);
   
    // Get menu parent id from format menu-logical-ru:652 where «menu-logical-ru» and 652 is id of parent menu(not node id)
    $def_lang_plid = substr($node->menu['parent'],16);
    // Take parrent menu node->nid from link_path (stored in format «node/%»)
    $def_parrent_nid = substr(db_result(db_query("SELECT link_path FROM menu_links WHERE mlid = '$def_lang_plid'")),5);
    // Take parrent node->tnid
    $def_parrent_tnid = db_result(db_query("SELECT tnid FROM node WHERE nid = '$def_parrent_nid'"));
   
    // Take list of languages except our node->langeage
    $languages = language_list('enabled');
    unset($languages[1][$node->language]);
    foreach ($languages[1] as $langcode => $language) {
        //select parrent node nid in this language
        $pnid = db_result(db_query("SELECT nid FROM node WHERE language = '$langcode' AND tnid = '$def_parrent_tnid'"));
        //select parrent MENU id in this language
        $plid = db_result(db_query("SELECT mlid FROM menu_links WHERE link_path = 'node/$pnid'"));
       
       
        $tnode = drupal_clone($_node);                
        $tnode->language = $langcode;
        $tnode->menu['menu_name'] = "menu-logical-$langcode";
        $tnode->menu['parent'] = "menu-logical-$langcode:$plid";
        $tnode->menu['plid'] = $plid;
        $tnode->menu['mlid'] = 0;
        $tnode->menu['language'] = $tnode->language;        
        if (empty($tnode->menu['link_title']))
        $tnode->menu['link_title'] = $node->title;        
       
        node_save($tnode);
        //todo -c pathauto: need update path aliath for tnodes !!!
        unset($tnode);
    }
    node_save($node);

ПРОБЛЕМА:
Не создается path alias для языков на которые нода клонирована. (В меню пишется и создаётся номр.)
Если в Content » List Выбрать Update URL alias то всё обновляется. Я пытался воспользоваться функциями pathauto.module но безрезультатно

Комментарии

Аватар пользователя kuzyakiev kuzyakiev 9 июля 2011 в 15:21

Привет, давно было не помню точно что к чему.
Но кажется проблемы с чпу возникали только при node status unpublish

Если нет нужно после node_save найти и запустить функцию по созданию чпу. В апи наверняка найдетею
Или прямыми запросами в дб, но лучше использовать функционал, так апдейто-устойчивей выйдет

Аватар пользователя warobushek warobushek 9 июля 2011 в 17:01

Хорошо, спасибо.
Пока ждал ответа, попробовал drupal_execute -- через него синонимы создаются нормально.

Но в моем случае пока еще не все работает идеально: я во время перевода одной ноды создаю цепочку родительских нод (без явного указания переводов) этой ноды и получаю полный коллапс:
каждая нода имеет в качестве источника перевода изначально переводимую ноду, а не ту, хотя вообще не должна такой иметь..

В случае node_save дебаг показывает, что pathauto получает токен [menupath] пустым при обработке созданной ноды, если язык ноды не совпадает с языком интерфейса...

Ладно, буду дальше разбираться.
Если у кого-нибудь будут рекоммендации, с удовольствием рассмотрю их.