Программное создание ноды и добавление к ней изображения в Drupal 7

В этой статье описывается программное создание ноды, загрузка и прикрепление к ней изображений.

Бывают задачи, где необходимо программно создавать ноды в Drupal 7, а так же изменять значения её полей, таких как изображения, содержимое, категорию и другие.

Приведу пример. Есть интернет магазин, который отдаёт xml файл с выгрузкой всех своих товаров. Нашему сайту необходимо эту выгрузку скачать себе, распарсить и добавить/обновить товары в своём каталоге.

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

Первое, что нужно сделать это создать нужную ноду, с которой будем работать. Для этого нужно объявить следующий объект:

$node = (object) array(
    // Заголовок ноды
    'title' => 'Эта нода создана программно',
    // Содержимое ноды
    'body' => array(
      LANGUAGE_NONE => array(
        0 => array(
          // Основной текст ноды
          'value' => 'Текст программно созданной ноды',
          // Анонс
          'summary' => 'Анонс программно созданной ноды',
          // Формат текста: full_html, filtered_html
          'format' => 'filtered_html',
        )
      ),
    ),
    // Тип материала, к которому относится нода
    'type' => 'article',
    'language' => LANGUAGE_NONE,
    // uid пользователя, который создаёт ноду
    'uid' => 1,
  );

Следующим шагом нужно вызвать drupal функцию node_object_prepare (ссылка на докумендацию Drupal 7). Функция "подготовит" объект для Drupal 7, установит недостающие значения и вызовет хук hook_node_prepare.

node_object_prepare($node);

Добавление изображений к ноде

Здесь всё просто. Нужно скачать изображение в папку с файлами Drupal, создать объект файла и добавить его к нашей ноде.

// Путь до скачиваемого изображения
$img_url = 'https://nikitakiselev.ru/images/logo.png';

// Скачивание изображения в папку '/sites/default/files/files'
$data = drupal_http_request($image);

if($data->code==200){
    $file = file_save_data($data->data, 'public://' . basename($img_url));
    if ($file) {
        // Добавляет изображение к ноде
        $node->field_image[LANGUAGE_NONE][] = (array)$file;
    }
}