xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Простейший пример получения результатов дефолтного дисплея представления 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 3
Похожие записи

Комментарии RSS

Для простых сниппетов есть views_embed_view()

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

$view->set_current_page(2);

Спасибо, буду пробовать :)

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

откройте includes/view.inc ;)

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

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

Например: commerce_embed_view

   // Prepare and execute the View query.
  $view->pre_execute();
А то без этого ошибка php была: Notice: Undefined property: view::$dom_id в функции template_preprocess_views_view()...
Не нашел где все опции посмотреть...

А фасетные фильтры, которые в 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();

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

$_GET['f'][0] = 'field_term:3265';

:)

Как передать даты для фильтра от и до, пробовал как в 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'
));
не работает

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

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

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

// изменяем значение фильтра по 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);

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

$view->set_items_per_page(5);

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

чем set_items_per_page() не устраивает?

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

$view->display_handler->default_display->options['pager']['type'] = 'some';

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

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

в модуле - drupal_add_css();

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

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

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

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

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

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

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

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

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

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

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

return $_GET['field_name'];

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

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

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании