Drupal → Как получить список нод определённого типа со всеми полями

01.04.2011

Пример получения списка опубликованных материалов типа article со всеми полями и свойствами:

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->propertyCondition('status', 1);
$query->propertyCondition('type', 'article');
$result = $query->execute();
$nodes = node_load_multiple(array_keys($result['node']));
Написанное актуально для
Drupal 7
Похожие записи

Комментарии

у меня fieldCondition(...'NULL', 'IS NULL') работает. сомнения вызывает колонка target_id

Игорь
28.01.2013, 08:32

У меня находит значение NULL - если оно явно прописано(есть в базе)

$node->field_name['und'][0]['value'] = NULL;
$query->fieldCondition('field_name', 'value', 'NULL', 'IS NULL');

А если это:

$node->field_name (Array, 0 elements);

То это не находит.
(Версия СУБД 5.5.27-29.0)
Подскажите чем ещё можно воспользоваться, какой конструкцией поиска в базе?

Игорь
28.01.2013, 16:38

Сделал так:

  // $nodes = node_load_multiple(array_keys($result['node']));
  // почему то так захотелось...)))
  $nodes = entity_load('node', array_keys($result['node']));  
  // dsm($nodes);
  $node = NULL;
  foreach($nodes as $key => $value) {
    if(empty($value->field_id_review)) {
      $node = $value;
      break;
    }
    elseif(empty($value->field_name[LANGUAGE_NONE][0]['value'])) {
      $node = $value;
      break;
    }
  }

2 вариант: можно ведь присваивать NULL при сохранении новой ноды.
Как бы сделали вы? (Автор этого замечательного блога))))

можно создать свой CustomEntityFieldQuery унаследованный от EntityFieldQuery и переопределить в нём метод finishQuery — http://drupal.org/node/1226622
по другому никак

Игорь
30.01.2013, 09:29

Решение интересное, но я это ООП плохо понимаю...)))
Такие строчки: class EntityFieldQueryForNullFields extends EntityFieldQuery { - меня пугают...))) я даже не знаю куда это вставлять, просто в свой модуль?
Два запроса к базе это мне понятно... но это плохо...
EntityFieldQuery - находит NULL, если он явно есть в таблице этого поля, так что мне проще(и понятнее) было реализовать свой 2 вариант:

/**
 * Реализация hook_node_presave($node)
 * перед добавлением или обновлением ноды в БД
 */
function mymodule_node_presave($node) {
  // Если создаётся Cтраница (а не редактируется) 
  // Сохранить поле field_name как NULL
  if($node->type == 'page' && empty($node->nid)) {
    if(empty($node->field_name)) {
      $node->field_name[LANGUAGE_NONE][0]['value'] = NULL;
    }
  }
}
Сергей
18.10.2013, 02:45

Уважаемые программисты!
Как я могу в своем модуле вывести в виде чекбокс списка список заголовков нод определенного типа. Как это можно реализовать?

Игорь
18.12.2013, 23:58

Подскажите, а как вывести все в цикле по одной
например их 100 тыс

 while($nodes = node_load_multiple(array_keys($result['node']))) {
   // как то так но как правильно?
 }
Игорь
19.12.2013, 12:27

Вы видимо не посмотрели что их более 100 тыс пришлось выделить жирным...)))
1 тыс или даже 10.000 запросто но 100.000 - не хватает памяти(256 Мб) - 512 правда хватает.
Чтобы не напрягать сделал по 1000 цикл по count() а получаем по range().
EntityFieldQuery

Игорь
19.12.2013, 14:05
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node');
$query->propertyCondition('status', 1);
$query->propertyCondition('type', 'article');
$query->count(); // чтобы знать сколько всего
$count = $query->execute();
// $count = 160467;
$time1 = time();
for ($i=0, $n=1000; $i<$count; $i = $i+$n) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node');
  $query->propertyCondition('status', 1);
  $query->propertyCondition('type', 'article');
  $query->range($i,$n);
  $result = $query->execute();  
}
print 'прошло сек: '.( time()-$time1 );
Игорь
22.12.2013, 14:32

У меня вопросик: Можно ли по двум полям искать, но что бы получали id ноды если есть хотя бы одно из полей. Или делать два запроса по каждому полю? Как это можно сделать в одном запросе? Например:

$query->fieldCondition('field_name1', 'value', 'text1', '=');
$query->fieldCondition('field_name2', 'value', 'text2', '=');
Дмитрий
14.04.2016, 22:47

Уважаемый xandeadx, а подскажите пожалйста, а как получить ноду, если мы не знаем ее id.

К примеру программно загрузить объект ноды определенного типа материала (например order), у которой поле data (созданное по средством модуля Date API) имеет конкретное значение? (не прибегая к views)

Задача изначально стоит такова:
Есть список заявок. У каждой заявки есть поле "Порядковый номер". А так же есть поле "Дата посещения" (Date API). После создания ноды с определенной выбраной датой, нужно программно просканировать, есть ли еще заявки на эту же дату, если их нет, то присвоить программно полю порядковый номер "1", а если есть, то определить какой наибольший порядковый номер и присвоить на единицу больше.

Реализация:

$order_number_today = render($content['field_number_today'][0]['#markup']); // Присваиваем текущее значение порядкового номера ноде
$date_visit = render($content['field_date_visit']['#items'][0]['value']); // в формате 2016-04-16 00:00:00

if(empty($order_number_today)) { // если порядковый номер еще не присвоен
	// Тут должен быть какой то
	// код, который определяет
	// наибольший порядковый номер
	// по конкретной дате

сюда выложил свой некорректный код http://pastebin.com/22xaZjxz

Дмитрий
14.04.2016, 22:53

скопировал неправильно
по ссылке в строке 16 там не

$query->fieldCondition('field_date_visit', 'value', $date_transport, '==');

а

$query->fieldCondition('field_date_visit', 'value', $date_visit, '==');

но все равно не работает

Евгений
28.07.2016, 13:23

Скажите, а как добавить сортировку по дате?

EntityFieldQuery::propertyOrderBy
EntityFieldQuery::fieldOrderBy
EntityFieldQuery::entityOrderBy

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