Я задал себе два ключевых вопроса: предоставляет ли Views надежный API и действительно ли нужен этот функционал или это просто стандартная практика. В итоге я отказался от модуля Views при разработке Drupal-проекта.
Вместо Views я выбрал EntityFieldQuery — встроенный в ядро Drupal 7 класс для извлечения объектов на основе условий. Синтаксис данного класса компактен, выразителен и прост в использовании.
Пример базового запроса
$node = menu_get_object();
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->propertyCondition('status', 1)
->propertyCondition('type', array('article', 'product', 'blog'))
->propertyCondition('uid', $node->uid)
->propertyOrderBy('created', 'DESC')
->range(0, 5);
$result = $query->execute();
Ключевые особенности
Методы класса обычно связаны (method chaining). Операторы по умолчанию гибко адаптируются к типу данных. EntityFieldQuery автоматически находит таблицы полей и выполняет объединение.
Расширение функционала
Я создал собственный класс EnergyEntityFieldQuery, наследующий EntityFieldQuery, чтобы добавить поддержку Organic Groups и стандартные условия для всех запросов.
Практическое применение
В проекте используется пользовательский интерфейс, позволяющий менять параметры запросов — количество и категорию выводимых нод. Мне удалось решить около 90% случаев использования вывода списков нод с помощью своего расширенного класса.
Для визуализации данных рекомендую модуль Bean как альтернативу блокам Views.