Функции Drupal API для работы с нодами

08 февраля 2014 - 23:27

При разработке сайтов на Друпал нередко возникает необходимость получить объект ноды, узнать ее автора, значения полей, создать ноду программно в своем модуле и т.п. Для решения подобных задач в Drupal API предусмотрен ряд полезных функций, которые и будут рассмотрены в данной статье.

Получаем объект ноды по ее nid

Для решения этой распространенной задачи в Drupal служит функция node_load(), которая возвращает объект ноды, содержащий всю необходимую информацию - время создания и последнего изменения ноды, уникальный идентификатор пользователя, создавшего ноду (uid), а также значения полей и т.п.

Загружаем объекты нескольких нод

Чтобы получить объекты нескольких нод, можно воспользоваться функцией node_load_multiple(), передав в нее массив из nid. Собственно, эта же функция используется внутри node_load() для загрузки одного объекта ноды.

Получаем объект ноды текущей страницы

Если путь текущей страницы принадлежит ноде, то объект ноды можно получить с помощью функции menu_get_object(). Собственно эта функция, как следует из описания в документации, может возвращать объекты и другой сущности Друпал, но для этого в нее нужно передать параметр $type, отличный от 'node'.

Примеры получения объекта ноды:

<?php
  $node = node_load(1);
  print $node->title; // Заголовок ноды
  print $node->submitted; // Метка времени создания ноды
  print $node->uid; // Идентификатор пользователя-автора ноды
?>
<?php
  if ($node = menu_get_object()) {
    print $node->title;
  }
?>

Программное создание ноды

Сразу привожу код:

  <?php
    $node = new stdClass();
    $node->type = 'article';
    node_object_prepare($node);
    $node->title = 'Моя статья';
    $node->language = LANGUAGE_NONE;
    $node->body[$node->language][0]['value'] = '<p>Эта статья была создана программно</p>';
    $node->body[$node->language][0]['format']  = 'filtered_html';
    node_save($node);
  ?>

Как видно из примера программного создания материала типа "статья", для решения данной задачи понадобились две функции Drupal API - node_object_prepare() и node_save(). Первая дополняет объект ноды такой информацией как uid текущего пользователя, время создания и версия редакции. Вторая осуществляет сохранение (запись в базу данных) ноды и значений ее полей.

Получаем html ноды

Такая задача возникает при необходимости вывести ноду в заданном режиме отображения, например, если по какой-то причине не используется модуль Views. На помощь приходит функция node_view(), аргументами которой являются объект ноды, режим отображения (по умолчанию full) и код языка. Возвращаемым значением данной функции является массив для рендеринга ноды. Пример вывода ноды с помощью функции node_view():

  <?php
    $node = node_load(1); // Загружаем объект нужной ноды
    $node_array = node_view($node); // Получаем массив для рендеринга ноды
    print render($node_array); // Выводим html ноды
  ?>

Обратите внимание, в функцию node_view мы передали лишь объект ноды, это означает, что мы получим сформированный для рендеринга массив для режим отображения "full". Если бы нас интересовал анонс материала, то вторым параметром следовало передать строку "teaser".

Вот пожалуй и все о функциях Drupal API для работы с нодами, в следующих статьях я напишу о программной работе с таксономией, а также о других полезных функциях.

Комментарии

Появился интерес.
Допустим нужно получить вывод файлов из ноды. Создаем ячейку в базе file для добавления файлов.
Нудно будет выводить по такому типу, как:

$node = node_load(1);
while ($node){
print $node->file;
}

Я правильно понимаю?) или без цикла while?

Чтобы добавить файлы к ноде, нужно для данного типа материала добавить поле типа "файл", например, с машинным именем field_file. Тогда значения этого поля можно получить, обратившись к свойству объекта ноды через $node -> field_file. Я обычно это делаю в цикле foreach, но можно и через while конечно. Также значения любого поля ноды (или любой другой сущности) можно с помощью функции field_get_items(). Второй вариант пожалуй самый правильный.

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

Дмитрий, здравствуйте, если вы знаете лишь значение поля, то этой информации недостаточно для получения объекта ноды, поскольку это значение может быть у нескольких нод. Но если вас это устраивает и вам необязательно получить одну конкретную ноду, а все, имеющие данное значение, то вы это можете сделать с помощью запроса к базе - примеры использования db_select(), вот ссылки https://api.drupal.org/api/drupal/includes!database!database.inc/function/db_select/7, http://xandeadx.ru/blog/drupal/88.
По поводу подписки на комментарии - одно время на блоге работал модуль Comment Notify, сейчас он выключен, уже не помню, по какой причине решил от него отказаться. Заходите почаще на блог и точно получите ответ на свой вопрос:)