ЧПУ для ноды вместе с адресом словаря и таксономии

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

Аватар пользователя ftomivec ftomivec 28 февраля 2012 в 19:12

Все привет!

Имею словарь: bomond, в нем термины, moda, sobytiya, tendencii, zvezdy (шаблон словаря: [term:vocabulary]/[term:root]/[term:name] )

bomond/moda/sobytiya taxonomy/term/6
bomond/moda/tendencii taxonomy/term/5
bomond/zvezdy taxonomy/term/3

Шаблон для статьи: ( [node:title] )
kollekciya-chanel-osen-zima-2011-2012 node/1
kollekciya-dolce-gabbana-osen-zima-2011-2012 node/2

Подскажите как сделать так чтобы чтобы статьи (ноды) открывались вместе с ЧПУ словаря и термина, к примеру так:

bomond/moda/sobytiya/kollekciya-dolce-gabbana-osen-zima-2011-2012

Комментарии

Аватар пользователя Andruxa Andruxa 29 февраля 2012 в 0:43

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

посоветую расковырять модуль token_example из examples - и, взяв его за основу, создать необходимый токен, который использовать в pathauto

Аватар пользователя mNigma@drupal.org mNigma@drupal.org 29 февраля 2012 в 1:50

"Andruxa" wrote:
по какому из них в таком случае стоить алиас, и как регламентировать выбор словаря для построения?

В 6 по самому главному(по весу)словарю формировался алиас.

Аватар пользователя mNigma@drupal.org mNigma@drupal.org 18 марта 2012 в 2:05

У меня словарь с вложенностью - 1 уровень. Т.е. если присваивается термин 1 уровня, нужно найти и родителя, чтобы адрес был таким раздел/подраздел/тайтл

В общем такой на данный момент расклад:

1 Скачиваем и устанавливает Custom Tokens
2 Создал токен для главного термина (словарь articles):
Token name - taxo_term, Token type - Материал[needs: node]
PHP replacement

<?php
$temp_node 
$data['node'];
    if(isset(
$temp_node->field_articles["ru"][0]["tid"])) {
    
$term_depth=db_query("SELECT parent FROM {taxonomy_term_hierarchy} WHERE tid = :tid_s", array(':tid_s'=>$temp_node->field_articles["ru"][0]["tid"]));
    foreach (
$term_depth as $row) {$term_depth=$row->parent;}
    if(
$term_depth>0){
         
$sql=(db_query("SELECT alias FROM {url_alias} WHERE source=:term LIMIT 1",array(':term'=> 'taxonomy/term/'.$term_depth)));
         foreach (
$sql as $row) {$return=$row->alias;}
    }else
         { 
                    
$sql=db_query("SELECT alias FROM {url_alias} WHERE source=:term LIMIT 1",array(':term'=> 'taxonomy/term/'.$temp_node->field_articles["ru"][0]["tid"]));
            foreach (
$sql as $row) {$return=$row->alias;}
        }

}else { 

$return "articles"; }
if(
$return=='')$return "articles";
return 
$return;
?>

3 Создал токен для подтермина:
Token name - taxo_term_next, Token type - Материал[needs: node]
PHP replacement

<?php
$temp_node 
$data['node'];
    if(isset(
$temp_node->field_articles["ru"][0]["tid"])) {
    
$term_depth=db_query("SELECT parent FROM {taxonomy_term_hierarchy} WHERE tid = :tid_s", array(':tid_s'=>$temp_node->field_articles["ru"][0]["tid"]));
    foreach (
$term_depth as $row) {$term_depth=$row->parent;}
    if(
$term_depth>0){
         
$sql=db_query("SELECT alias FROM {url_alias} WHERE source=:term LIMIT 1",array(':term'=> 'taxonomy/term/'.$temp_node->field_articles["ru"][0]["tid"]));
         foreach (
$sql as $row) {$return=$row->alias;}
    }else
         { 
$return "";
        }

}else { 

$return ""; }
return 
$return;
?>

UP:( убрал один "ручной" запрос, + поправил баг, который появился после изменения чпу для подтермина (вариант выше работал если подтермин имел адрес term-name, а не parent-term-name/term-name))
В п.2 тоже можно убрать "ручной" запрос.

- $sql=db_query("SELECT alias FROM {url_alias} WHERE source=:term LIMIT 1",array(':term'=> 'taxonomy/term/'.$temp_node->field_articles["ru"][0]["tid"]));
+ $temp_alias=explode("/",drupal_get_path_alias("taxonomy/term/".$temp_node->field_articles["ru"][0]["tid"]));
- foreach ($sql as $row) {$return=$row->alias;}
+ if(isset($temp_alias[1]))$return=$temp_alias[1]; else $return=$temp_alias[0];

4 В настройках адреса (сбросить кэш) - [node:taxo-term]/[node:taxo-term-next]/[node:title]

Если че напарил, извиняйте, ткните носом.
Интересуют и другие варианты, если кто что знает, пишите.