2012-02-24 3 views
2

Надеюсь, это не глупый вопрос, который я искал большую часть дня!Drupal - Views. Настройка фильтра программно

У меня есть тип содержимого (документы), который просто содержит заголовок, файл и категорию. Значение категории требуется и «включено» по таксономии.

Теперь я хочу создать представление, которое отобразит эти документы, сгруппированные и названные термином таксономии.

Используя мои ограниченные знания Drupal, я намерен выполнить итерацию соответствующих идентификаторов условий (используя taxonomy_get_tree($vid)), а затем визуализировать каждый вид соответственно.

Для этого я надеялся использовать этот фрагмент.

view = views_get_view('documents'); 

$view->set_display($display_id); 

$filter = $view->get_item($display_id, 'filter', 'field_dl_category'); 

$filter['value']['value'] = $filter_value; 

$view->set_item($display_id, 'filter', 'field_dl_category', $filter); 

$viewsoutput = $view->render(); 

Но это не работает; когда я запрашиваю значение $filter($view->get_item($display_id, 'filter', 'field_dl_category')), я возвращаю null.

Возможно, это имя фильтра не совпадает с именем поля CCK?

Я использую Drupal 7.

Любая помощь очень ценится, я бегу из идей (и времени).

+0

Итак, действительно ли существует представление «документы»? т. е. вы создали его из пользовательского интерфейса Views? –

+0

Да Амара вид существует. –

ответ

0

Мне, наконец, удалось получить эту работу, но я принял несколько иной подход.

Я изменил свое представление и добавил соответствующий контекстный фильтр, а затем использовал эту функцию views_embed_view, чтобы получить мои требуемые результаты.

Если это поможет! это мое решение:

$display_id = 'default'; 
$vid = 7; 
$terms = taxonomy_get_tree($vid); 

foreach($terms As $term){  
    $content = views_embed_view('documents', $display_id, $term->tid); 

    //now we see if any content has been provided 
    if(trim($content) != ''){ 
     print "<h3>" . $term->name . "</h3>"; 
     print $content;   
    } 
} 

В моем случае облицовка ($ содержание) возвращает «» без данных как шаблон представления был отредактирован, это не может быть для всех.

Я очень новый разработчик Drupal, поэтому я уверен, что есть намного лучшие способы сделать это, если это так, пожалуйста, отправляйте сообщение.

0

Я собираюсь продолжить и предположить, что вы хотите показать, используя Views, список документов узлы, сгруппированные по категориям, в которых они были отмечены.

Есть два (из, возможно, более) способов, с помощью которых вы можете сделать это в соображениях 3:

(а) выбрать стиль отображения, который позволяет выбрать поле группировки. (Вы можете попробовать стиль таблицы, который поставляется с представлениями по умолчанию). Предположим, что вы правильно связали таблицу node с таблицей taxonomy_term_data через отношения «Представления», вы можете выбрать taxonomy_term_data.name в качестве поля группировки.

Обратите внимание, что это группировка выполняется перед представлением вида. Таким образом, ваш запрос просто должен будет выбрать плоский список (контент, тег).

(b) Вы также можете использовать тип отображения вложения для достижения чего-то подобного. Покажите категорий в первую очередь в списке, нажав на который будет отображаться страница (приложение) со всеми документами, помеченными в выбранной категории.

Чтобы понять, как это сделать (a) или (b), включите модуль advanced_help (который не является реквизитом Views, но рекомендуется).

Для (а), прочитайте раздел о группирования в стилях т.е. views/help/style-grouping.html и
Для (б), прочитайте раздел на дисплее Приложения т.е. views/help/display-attachment.html

Несколько вещей о своем подходе:

(a) Он отобразит все термины из этого словаря независимо от того, были ли они использованы для пометки хотя бы одного документа.

(b) views_embed_view() вернет NULL, даже если текущий пользователь не имеет доступа к представлению. Итак, убедитесь, что вы поймаете этот случай.

0

Вот альтернатива:

$view = views_get_view('view_machine_name'); 
$view->init_display('default'); 
$view->display_handler->display->display_options['filters']['your_filter_name']['default_value'] = 'your_value'; 
$view->is_cacheable = FALSE; 
$view->execute(); 
print $view->render(); 

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