Drupal → Программная работа с представлениями в Views 3

03.01.2013

Простейший пример получения результатов дефолтного дисплея представления foo:

$view = views_get_view('foo');
$view->execute();
debug($view->result);

Более сложный пример:

$view = views_get_view('foo');

// устанавливаем активный дисплей
$view->set_display('page');

// устанавливаем значения аргументов (контекстных фильтров)
$view->set_arguments(array(123, 456));

// устанавливаем значения раскрытых фильтров (field_category_tid это имя параметра, передающегося в $_GET)
$view->set_exposed_input(array('field_category_tid' => 123));

// изменяем количество записей на страницу
$view->set_items_per_page(10);

// устанавливаем страницу (страницы считаются с нуля)
$view->set_current_page(2);

// добавляем сортировку по node.created (возможно только для таблиц участвующих в выборке)
$view->add_item($view->current_display, 'sort', 'node', 'created', array('order' => 'DESC'));

// добавляем фильтр по node.created (возможно только для таблиц участвующих в выборке)
$view->add_item($view->current_display, 'filter', 'node', 'created', array(
  'operator' => '>',
  'value' => array(
    'value' => '-7 day',
  ),
));

// изменяем значение фильтра по node.type (при этом фильтр уже должен существовать и иметь значение)
$filter = $view->get_item($view->current_display, 'filter', 'type');
$filter['value']['article'] = 'article';
$view->set_item($view->current_display, 'filter', 'type', $filter);

// отключаем выполнение отдельного запроса на получение общего числа строк в запросе
$view->get_total_rows = FALSE;

$view->execute();
debug($view->result);

// посмотреть получившийся запрос
debug((string)$view->build_info['query']);

По материалам Drupal: calling a view programmatically.

Ещё примеры программной работы с Views:
Рассылка списка новых материалов с помощью Simplenews
Программно добавить поле в представление
Как программно вывести представление Views

Написанное актуально для
Views 3
Похожие записи

Комментарии

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

И еще вопрос. Где об этом можно прочитать, чтобы не дергать вас? По верхней ссылке этого нет, а http://views.doc.logrus.com/ у меня почему-то лежит

Гость
16.04.2013, 02:11

А как программно переопределить шаблон ?
Допустим с views-view.tpl.php в views-view--MY.tpl.php.

Гость
14.07.2013, 10:41

Как в последствии сгенерировать html?

Игорь
10.03.2014, 18:42

Например: commerce_embed_view

   // Prepare and execute the View query.
  $view->pre_execute();

А то без этого ошибка php была: Notice: Undefined property: view::$dom_id в функции template_preprocess_views_view()...
Не нашел где все опции посмотреть...

Игорь
07.02.2015, 03:15

А фасетные фильтры, которые в url видны можно $view указать?
например: /page_view?f[0]=field_term:3265
Я и через

$filter = $view->get_item($view->current_display, 'filter', 'type');
$filter['value']['field_term'] = 3265;
$view->set_item($view->current_display, 'filter', 'type', $filter);

И так:

$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();

Не учитывает и все.
Или фасетные фильтры во вьюсе не работают в программном выводе ?

Гость
17.02.2015, 15:58

Как передать даты для фильтра от и до, пробовал как в get:
$view->set_exposed_input(array(
'product' => $_POST['selectBlock'],
'dt%5Bmin%5D%5Bdate%5D' => $dfrom.'T00%3A00%3A00',
'dt%5Bmax%5D%5Bdate%5D' => $dto.'T23%3A59%3A59'
));
не работает

Гость
17.02.2015, 16:10

dt[min][date] и dt[max][date] - имена полей exposed фильтра

Гость
17.02.2015, 16:48

решено:
'dt' => array('min' => array('date' => $dfrom.'T00:00:00'), 'max' => array('date' => $dto.'T23:59:59'))
Спасибо, хорошая статья...

Игорь
26.04.2015, 23:36

Возможно ли удалить(отменить) фильтр? На пример:

// изменяем значение фильтра по node.type (при этом фильтр уже должен существовать и иметь значение)
$filter = $view->get_item($view->current_display, 'filter', 'type');
$filter['value']['article'] = 'article';
$view->set_item($view->current_display, 'filter', 'type', $filter);

Удалить действие этого фильтра?

$view->set_item($view->current_display, 'filter', 'type', NULL);
Игорь
27.04.2015, 11:46

// Установить / изменить количество записей на страницу просто

$view->set_items_per_page(5);

А я вывожу это в блоке и хочу отключить постраничный навигатор - все эти функции есть в файле view.inc И этот $this->query->pager надо как то отключить.
init_pager() - Инициализация пейджер. Как инициализации стиля, инициализация пейджер не проводится до конца. Для обеспечения переопределения. - Но где это переопределение? То что можно сделать другой вьюс без пейджера мне понятно, но вдруг можно отключить его?! ;-)

Игорь
27.04.2015, 19:15

set_items_per_page() - изменяет кол-во элементов на странице, а пейджер остаётся - ( страницы 1 2 3 ...) Вот пейджер из футера вьюса как удалить?

$view->display_handler->default_display->options['pager']['type'] = 'some';
Сергей
12.06.2015, 12:49

Уважаемый xandeadx!
Ваши статьи очень полезны, тысячу раз выручали...
Вот и на этот раз надеюсь на помощь.

Каким образом можно добавить свой CSS класс в $row вьюсины, используя views_get_view? Как добавить в tpl знаю, но пишу модулек, и желательно без tpl...

Сергей
12.06.2015, 13:05

Немного не то... Мне нужно каждому $row добавить свой класс, а не подключить таблицу CSS в модуле

смотрите как в template_preprocess_views_view_unformatted() добавляются классы

Сергей
12.06.2015, 13:20

перепробовал тьму вариантов

$view->style_plugin->options['row_class'] = 'my_class';
$view->style_options['row_class'] = 'my_class';

эти тоже не работают...

Сергей
12.06.2015, 13:39

Пример покажите, пожалуйста! Это вообще возможно через views_get_view сделать? В Google не нашел ни одного примера

в hook_preprocess_views_view_unformatted добавьте класс, пример есть в template_preprocess_views_view_unformatted

Сергей
12.06.2015, 14:00

Разобрался! Спасибо огромное... Просто искал функционал для views_get_view, а оказалось только через хук можно сделать...

Гость
08.07.2015, 23:49

Доброго времени.
А не подскажете как можно вывести несколько пейджеров для одного views. Пример: включен views_load_more но под ним нужен вывод еще и обычного пейджера.

Валерий
25.09.2015, 22:36

$view->add_item возможно только для таблиц участвующих в выборке.
как добавить фильтр по полю которого нет в фильтрах выбранного представления?

Евгений
19.10.2015, 11:11

xandeadx,нааверняка, вы можете подсказать, я буду вам очень благодарен. У меня есть view с раскрытым фильтром (текстовый input), нужно его значение установить в качестве значения по умолчанию ("предоставить аргумент по умолчанию") в контекстном фильтре. Как это можно сделать? Заранее благодарен.

Андрей
21.12.2015, 20:21

Подскажите, пожалуйста, как можно вывести представления Commerce Line Item? использую Commerce Kickstart.. ни один из найденных и известных мне методов, не помог....

Добрый день.
Как во views сделать переключение между видами отображения (список, таблица, плитка), нужно чтоб выбранный режим сохранялся в браузере, + переключался аяксом сохраняя все фильтры, сортировку, и pager?
Может кто подскажет или ссылки кинет, как это можно реализовать.

Дмитрий S
20.02.2022, 15:11

Класс! Кажется это то что я искал. НЕ подскажете какой примерно хук списка выбора в фильтре по таксономии должен быть, чтоб в этом списке показывались только те термины у которых в дополнительном поле $term->field_user['und'][0]['uid'] стоит ID текущего авторизованного пользователя?
Отправил запрос на друпалру https://drupal.ru/node/144524 , но пока не нашел ответ

Добавить комментарий