Использование EntityFieldQuery для доступа к нодам в Drupal 7

По сути класс EntityFieldQuery позволяет организовать доступ к любым сущностям внутри Drupal. Но наиболее интересен вариант использования EntityFieldQuery для доступа к элементам узлов (Node) на которых можно построить любой сложности контент.
Небольшой пример из жизни дальше.

Для определенных задач был создан специальный тип материалов event со сложной системой дополнительных полей. По ходу работы возникла задача загружать эти данные в соотвествии со значениями этих дополниетльных полей. Для загрузки данных удобней всего использовать EntityFieldQuery.

Например следующим образом:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->propertyCondition('type', 'event');
$query->propertyCondition('status', 1);
$query->fieldCondition('field_begin', 'value', date('Y-m-d 00:00:00'), '>');
$query->fieldOrderBy('field_begin', 'value', 'ASC');
$query->range(0, 5);
$result = $query->execute();

В данном примере мы загружаем опубликованные (status = 1) записи у которых тип материала event (это машинное имя). При этом дополнительное условие что дата в поле field_begin должна быть больше текущей. При этом загружаем только первые (сортировка ASC) пять записей (вызов range).
По этому примеру понятны основные принципы использования методов класса EntityFieldQuery.

В результате исполнения запроса он возвращает массив с данными. В данном случае интересен элемент $result[‘node’]. Это массив вида id узла =>данные. Данный массив содержит информацию о загруженных нодах, попадающих под требуемые условия.

Получить же полную информацию о данных нодах можно следующим образом:

if (isset($result['node'])) {
    $nodes = node_load_multiple(array_keys($result['node']));
}

Дальнешие операции с массивом $nodes могут быть разнообразны. Следует остановится на моменте получения значения дополнительного поля. Сделать это можно с помощью функции field_get_items

Например, так:

foreach ($nodes AS $node) {
  $dates = field_get_items('node', $node, 'field_begin');
  $date = $dates[0]['value'];
  ...
}

Здесь получаем значение поля с машинным именем field_begin из каждой node полученной в запросе чуть выше.

Дополнительная информация про EntityFieldQuery на сайте сообщества Друпал

Запись опубликована в рубрике Drupal, Работа с метками , . Добавьте в закладки постоянную ссылку.

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