[Решено]Каталог на D7 с синонимом термина таксономии как аргумент

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

Аватар пользователя kopernik21187 kopernik21187 7 января 2013 в 1:32

Всех с Рождеством!!!

У меня такой вопрос: делаю на Drupal Commerce каталог товаров как например в этом магазине http://czech-cristal.ru . Т.е. я создал словарь таксономии "Категории товаров" с названием нужных товаров, где "Pattern for all Категории товаров paths" формируются так catalog/[term:name], ну и конечно на базе словаря создал соответственно менюшку, которая ссылается на Views(путь catalog/%) с передачей аргумента.

Вначале делал как написано в данном топике . И это работает, т.е. для каждого термина задаешь собственный url, его передаешь и все нормально работает. Но мне нужно чтобы ссылки имели именно вид catalog/[term:name] , вот как на http://czech-cristal.ru .

Так вот далее, с какими я проблемами столкнулся, я забил значит термины таксономии, менюшка появилась со ссылками catalog/obuv-timberland и catalog/novyy-termin . Сделал
Views с url catalog/%, контекстный фильтр задал " Содержимое: Имеет идентификатор термина таксономии (с глубиной) ", в критерии проверки выбрал PHP код, и в коде пишу следующее:

<?php
// ищем системный путь для синонима термина
//
$url drupal_lookup_path('source'$argument);
//$url = "taxonomy/term/12";

if ($url != false)
{
  
// если путь найден, проверяем, что это путь к термину таксономии
  //
  
$term_base_path 'taxonomy/term/';

  if (

strncmp($term_base_path$urlstrlen($term_base_path)) == 0)
  {
    
// вырезаем префикс 'taxonomy/term/', оставшееся значение преобразуем в число
    // и заменяем аргумент вьюса на полученный ID термина таксономии
    //
    
$handler->argument intval(str_replace($term_base_path''$url));
  }
}

return 

TRUE;

?>

так вот первый вопрос:
когда $url = "taxonomy/term/12" или $url = "taxonomy/term/13" то все работает правильно, когда $url = drupal_lookup_path('source', $argument), то выводит вообще все товары независимо от таксономии. Дело я так понимаю в переменной $argument, потому как в таблице url_alias нужные записи есть(скрин 1), подскажите, пожалуйста, как узнать значение переменной $argument в данном блоке кода php, и вообще сформировать $url корретно.

и второй вопрос:
как я уже говорил, когда напрямую передаешь $url = "taxonomy/term/12" или $url = "taxonomy/term/13", то все работает правильно и хорошо, но только в предпросмотре в самом редактировании Views, на самом же сайте, когда кликаешь по ссылкам catalog/obuv-timberland и catalog/novyy-termin, то выводится не каталог как во Views, а просто списком перечисляются материалы, ассоциированные с данными терминами(скрин 2 и скрин 3). Так вот второй вопрос: как сделать так, чтобы по адресам catalog/obuv-timberland и catalog/novyy-termin выводился каталог.

ВложениеРазмер
Иконка изображения 2013-01-07_001924.png193.94 КБ
Иконка изображения skrin2.png231.42 КБ
Иконка изображения skrin3.png105.71 КБ

Комментарии

Аватар пользователя Dan Dan 7 января 2013 в 5:49

Привет!

Решал я подобную задачу с помощью hook_views_pre_view.
Имеем: view с аргументом "Содержимое: Has taxonomy term ID"
Наобходимо: автоматически определять tid из пути.

Создаём собственный модуль, использующий hook_views_pre_view:

<?php

function ИМЯ-МОДУЛЯ_views_pre_view(&$view, &$display_id, &$args) {
// У меня несколько view, для которых необходимо определять tid
if(in_array($view->name, array('services', 'licenses', 'projects'))){
$path = arg(0).'/'.arg(1);
// Получаем системный путь для текущей страницы
if($url = drupal_lookup_path('source', $path)){
// Через роутер загружаем объект термина
if($term = menu_get_object('taxonomy_term', 2, $url)){
$args[0] = $term->tid;
}
}
}
}

?>

Аватар пользователя kopernik21187 kopernik21187 7 января 2013 в 18:17

Первый вопрос решил так:

<?php
$url 
drupal_lookup_path('source'"catalog/".$argument);

if (

$url != false)
{
  
// если путь найден, проверяем, что это путь к термину таксономии
  //
  
$term_base_path 'taxonomy/term/';

  if (

strncmp($term_base_path$urlstrlen($term_base_path)) == 0)
  {
    
// вырезаем префикс 'taxonomy/term/', оставшееся значение преобразуем в число
    // и заменяем аргумент вьюса на полученный ID термина таксономии
    //
    
$handler->argument intval(str_replace($term_base_path''$url));
  }
}

return 

TRUE;
?>

т.е. нужно было всего навсего сделать $url = drupal_lookup_path('source', "catalog/".$argument);

2 Dan по поводу Вашего варианта. Так как я сначала проверяю данное дело в админке в самой Views, то немного переделал:

<?php
function my_catalog_views_pre_view(&$view, &$display_id, &$args) {
  
// У меня несколько view, для которых необходимо определять tid
  
if(in_array($view->name, array('catalog'))){
    
// $path = arg(0).'/'.arg(1);
    
$path "catalog/".$view->args[0];// так как другой alias
    
    
    // Получаем системный путь для текущей страницы
    
if($url drupal_lookup_path('source'$path)){
      
// Через роутер загружаем объект термина
      
if($term menu_get_object('taxonomy_term'2$url)){
        
$args[0] = $term->tid;
      }
    }
  }
}

?>

Спасибо отличный способ! Но проверить на самой странице скажем на catalog/obuv-timberland и catalog/novyy-termin у меня не удается, это как раз второй вопрос. Почему выводится не каталог, а материалы, ассоциированные с данным термином?

Аватар пользователя Dan Dan 8 января 2013 в 0:01

Видимо срабатывает стандартный вывод термина или view по умолчанию для термина.
То есть надо смотреть, кто является обработчиком пути taxonomy/term/123, ведь catalog/obuv-timberland есть синоним к taxonomy/term/123, я правильно понимаю?

PS: не понял, а зачем сначала обрабатывать аргумент во view, а потом в модуле? В смысле, зачем двойная обработка?

Аватар пользователя kopernik21187 kopernik21187 8 января 2013 в 12:54

Незачем)))А я в модуле и не стал пользоваться Вашим методом, своим обошелся. Но и Ваш опробовал, он тоже сработал, взял на будущее на заметку. Спасибо!

PS. над обработчиком в данный момент колдую)

Аватар пользователя kopernik21187 kopernik21187 8 января 2013 в 13:22

В принципе вот тут написано как переопределить путь. Но только для D6. В словаре таксономии в Menu path type нужно выбрать Custom path как пишут. Но в этом же топике отмечается что с D7 такого нет. Так что вопрос переопределения стандартного пути для вывода материалов пока открыт...Где же этот Custom path?

Аватар пользователя djset djset 10 ноября 2015 в 11:49

Друзья, почему у меня не получается?
имеется словать терминов "Каталог" в котором есть термины "Арматура" "Круг" "Квадрат" "Сетка" "Трубы" и так далее в них есть еще подтермины названий подкатегорий типа "Арматура класса III" или "Арматура фирмы такой-то" или в общем скрин_1
У каждой подкатегории есть материал, который создаётся путём добавления материала. Материал является ни что иной как просто профиль данного товара например:
как на скрине_2
----------
ЛИСТ СТАЛЬНОЙ ПРОФИЛИРОВАНЫЙ - (родитель-термин-главный)
Лист стальной профилированный PRINTECH (камень, бревно, дерево, светлый кирпич) - (подкатегория - термин)
С10-1100-0,45 / 2 м ОП - (материал - профиль)
С10-1100-0,45 / 2 м ОП - (материал - профиль)
С10-1100-0,45 / 2 м ОП - (материал - профиль)
С10-1100-0,45 / 2 м ОП - (материал - профиль) - их может быть куча в категории (Лист стальной профилированный PRINTECH...)
----------
Я создал странцу catalog/ где выводятся весь каталог со всеми категориями даже пустыми (скрин_3), но но когда перехожу на страницу с аргументом catalog/% то хотелось бы видеть все категории одного главного термина как например трубы как скрине_4 но путь там не такой как надо, а именно catalog/трубы , а как на catalog/trubi сделать я не знаю, ваш метод работает, но аналогично Родительскому термину тоесть выводит инфу по адресу catalog/2 например а мне надо catalog/armatura
Помогите плиз!!!