ЗАДАЧА:
Есть типы категория(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 в котором вызываем файл
// $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 но безрезультатно
Комментарии
subscribe
up
неужели никто не сталкивался с подобным?
up
Я только что столкнулся с этой проблемой. Подумываю перейти на drupal_execute .
Какое решение нашли Вы ?
Привет, давно было не помню точно что к чему.
Но кажется проблемы с чпу возникали только при node status unpublish
Если нет нужно после node_save найти и запустить функцию по созданию чпу. В апи наверняка найдетею
Или прямыми запросами в дб, но лучше использовать функционал, так апдейто-устойчивей выйдет
Хорошо, спасибо.
Пока ждал ответа, попробовал drupal_execute -- через него синонимы создаются нормально.
Но в моем случае пока еще не все работает идеально: я во время перевода одной ноды создаю цепочку родительских нод (без явного указания переводов) этой ноды и получаю полный коллапс:
каждая нода имеет в качестве источника перевода изначально переводимую ноду, а не ту, хотя вообще не должна такой иметь..
В случае node_save дебаг показывает, что pathauto получает токен [menupath] пустым при обработке созданной ноды, если язык ноды не совпадает с языком интерфейса...
Ладно, буду дальше разбираться.
Если у кого-нибудь будут рекоммендации, с удовольствием рассмотрю их.