Несколько блоков из views на одной странице - исключить дублирование материалов

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

Аватар пользователя genfed genfed 21 января 2014 в 13:41

Есть новостной сайт. На одной странице выводится несколько блоков из views (дисплеи одного view). Api 2. У новостей много различных полей по которым и выводится новости в данные блоки (различные наборы Filters).

Проблема в том, что в разных блоках на одной странице могут дублироваться те же новости (ноды). Есть идея воспользоваться views api, а имеенно hook_views_post_execute - получить последовательно для каждого блока массив nid (глобальный - пополняется для каждого блока уникальными nids чтобы в дальнейшем использоваться как фильтр в последующих блоках по порядку вывода на странице - т.к. блоки выводятся функцией в шаблоне) и для каждого последующего блока использовать hook_views_query_alter добавляя в критерии чтобы исключить массив nid - уже выведенных новостей.

Проблема в том что hook_views_post_execute - ведет себя непонятным образом заполняйй сразу глобальный массив nid для первого же встреченного блока, т.е. не получается последовательно заполнять этот массив и каждый раз использовать его в изменении запроса для каждого последующего блока. Подскажите как исправить. Или же может быть есть более легкий способ решения?

p.s. в поиске нашел только исключение дублей в одном и том же блоке или странице, а мне нужно чтобы в разных блоках (на одной и той же странице) не было материалов с одинаковыми nid

Комментарии

Аватар пользователя Mnilionic Mnilionic 23 января 2014 в 15:36

Раз всё равно вызываете вьюсы в коде, то:
- Используйте EntityFieldQuery() для фильтрации нужных материалов и получения айдишников нужных материалов.
- Для каждого последующего блока добавляейте исключения по айдишникам, которые уже есть чтоб решить вашу проблему с дубликатами.
- После того как получите наборы айдишников для каждого блока вызывайте свои вьюсы. Только во вьюсах уже уберите все фильтры, а добавьте аргументы по айдишникам.

$args = array(join($nids, '+'));
$view = views_get_view('news');
$result = $view->execute_display('block_1', $args);
Аватар пользователя Orion76 Orion76 23 января 2014 в 16:53

"Mnilionic" wrote:
Используйте EntityFieldQuery()

Разве в шестерке это есть?

"genfed" wrote:
Или же может быть есть более легкий способ решения?

А по каким критериям "фильтруются" материалы для разных блоков?

Аватар пользователя Mnilionic Mnilionic 1 февраля 2014 в 22:57

orion76 wrote:

Разве в шестерке это есть?

Упс, просмотрел версию вопроса.

Тогда не знаю... можно посмотреть sql запросы, которые генерят вьюсы и использовать их для получению айдишников по фильтрам.