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

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

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

Пример получения списка опубликованных материалов типа 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
Похожие записи

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

Что то ни как у меня ... не выходит аленький цветок...)))
->fieldCondition('field_parent', 'target_id', 'NULL', 'IS NULL')
(Ни чего не помогает...)
Подскажите как получить пустые поля?

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

У меня находит значение 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)
Подскажите чем ещё можно воспользоваться, какой конструкцией поиска в базе?

Сделал так:

  // $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
по другому никак

Решение интересное, но я это ООП плохо понимаю...)))
Такие строчки: 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;
    }
  }
}

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

в статье пример - отвечает на половину вашего вопроса
ещё нужно передать это в форму - http://xandeadx.ru/blog/drupal/205
как то так.

Сергей, почитайте.

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

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

foreach ($nodes as $node) {
 
}

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

$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 );

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

$query->fieldCondition('field_name1', 'value', 'text1', '=');
$query->fieldCondition('field_name2', 'value', 'text2', '=');

Уважаемый 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

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

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

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

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

Все разобрался! 4 улетело
http://pastebin.com/ZgVzNxiM

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

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

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

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

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