Taxonomy и views: "разные" виды для разных словарей

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

Аватар пользователя magway magway 25 ноября 2007 в 22:39

Мое видение решения данной проблемы (возможно и этой http://drupal.ru/node/8130). Используется методика, изложенная в http://drupal.ru/node/9250.
Исходные данные: словари для текстовых материалов (статьи, новости и т.д.); словарь "услуги", привязанный к типу cck.
Требуется: выводить ноды на страницах таксономии (/taxonomy/term) для текстовых материалов - в виде тизеров; для материалов из словаря "услуги" - в виде таблицы с определенными полями.
Решение.
Как уже писали ранее, в поле Argument Handling Code доступен объект $view, с которым можно делать все, что душа пожелает.
Открываем вид taxonomy/term для редактирования. Для этого вида создаются необходимые поля, как если бы он был табличным (я добавил 5 полей). Тип вида (Full nodes, Teaser list, Table view, List view) в данном случае не имеет значения. У созданного вида уже есть 2 аргумента: Taxonomy: Term ID и Node: Feed Selector - они остаются без изменений. В поле Argument Handling Code пишется следующий код:
<?php
$tid = taxonomy_get_term($args[0]); //получаем термин из адреса
switch($tid->vid){ //проверяем его принадлежость к тому или иному словарю
default: //для простых материалов
$view->page_type = 'teaser'; //делаем тип вида Teaser List
break;
case "1": //для словаря материалов cck (в моем случае = 1)
$view->page_type = 'table'; //делаем табличный вид
break;
} //все
?>
Теперь при открытии адреса /taxonomy/term/N этот код будет проверять к какому из словарей относится вызванный термин и соответственно менять тип вида.
В случаях, когда может понадобится три (4,5...) различных видов, ситуация несколько усложняется. Здесь вижу 2 варианта решения:
1. вписать в view все возможно необходимые поля для вывода, а в Argument Handling Code лишние убирать (например так:
<?php
unset ($view->field[3]); //где 3 - номер поля (нумерация идет с нуля)
?>

2. формировать массив с полями прямо в Argument Handling Code.

Написанное выше применимо не только к полям, но и к фильтрам, критериям сортировки, всяческим заголовкам (title, header, footer).

Рабочий пример написанного здесь: http://bestofbeauty.ru
http://bestofbeauty.ru/taxonomy/term/1 - табличный вид
http://bestofbeauty.ru/taxonomy/term/22 - тизеры

Комментарии

Аватар пользователя jason32 jason32 26 ноября 2007 в 11:38

Мда, решение. Просто надо несколько более сложное - чтобы не вид вывода менялся, а набор полей. ТО есть у них у обоих табличный вид, вот только поля разные. Есть на это какие-нибудь приемлемые решения?

Аватар пользователя magway magway 26 ноября 2007 в 13:25

Я написал, что есть два варианта решения:
1. сделать табличный вид со всеми полями, которые нужны для первого и второго видов; в AHC в условиях выбора словарей ненужные поля для конкретного вида убирать (например через unset($field[n]);
(возможно, что при таком решении будут лишние запросы из полей, которые не выводятся - это предположение, надо проверять);
2. второй вариант, прямо в AHC формировать массив с полями
<?php //например так:
$view->field = array (
array (
'tablename' => 'node',
'field' => 'title',
'label' => 'Название',
'handler' => 'views_handler_field_nodelink',
'sortable' => '1',
'options' => 'link',
),
array (
'tablename' => 'node_data_field_',
'field' => 'field__value',
'label' => 'Класс',
'handler' => 'content_views_field_handler_group',
'sortable' => '1',
'options' => 'default',
),);
?>

Аватар пользователя IrinaStasuk@drupal.org IrinaStasuk@dru... 17 апреля 2010 в 11:29

Огромное спасибо за код - помогло. У меня пятерка, а там в в поле Argument Handling Code написано, что нужно вставлять код без <?php и ?>. Это я написала для тех, кто как и я сначала ставит экперимент, а потом начинает разбираться, почему код не работает