Программное создание ноды, комментария и термина в Drupal 7

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

Содержание статьи


Подготовка

Самый легкий способ - это обойтись без создания полноценного модуля, а просто создать php файл в корне друпала.
Первое что мы должны сделать это загрузить все функции друпала, чтобы использвовать все доступные функции.

<?php
define('DRUPAL_ROOT', getcwd());
$_SERVER['REMOTE_ADDR'] = "localhost"; // Необходимо при работе из командной строки
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);


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

$node = new stdClass(); // Создаем объект node
$node->type = "article"; // Определяем тип создаваемого материала
node_object_prepare($node); // добавляем настройки по-умолчанию

$node->title    = "Название"; // Название материала
$node->language = LANGUAGE_NONE; // Или например 'ru', если включен модуль locale

$node->uid = 1; // UID пользователя

// Заполнение поля body
$bodytext = 'Текст ноды.'
$node->body[$node->language][0]['value'] = $bodytext;
$node->body[$node->language][0]['summary'] = text_summary($bodytext);
$node->body[$node->language][0]['format']  = 'filtered_html';

$node->path = array('alias' => 'path_to_this_node'); // путь к материалу, для модуля path

// Дополнительные  свойства ноды
$node->status = 1; // Опуликовано (1) или нет (0)
$node->promote = 1; // Размещено на главной  (1) или нет (0)
$node->sticky = 1; // Закреплено вверху списков  (1) или нет (0)
$node->comment = 2; // Комментарии включены  (2) или нет (1)

if($node = node_submit($node)) { // Подготовка к сохранению
    node_save($node); // Сохранение ноды, теперь доступен nid новой ноды $node->nid
}


Добавление полей


Текстовые или числовые поля

$node->field_fnordtext[$node->language][0]['value'] = "Значение";

Множественные значения, если это указано в настройка поля:
$node->field_author[$node->language][]['value'] = "Значение 1";
$node->field_author[$node->language][]['value'] = "Значение 2";


Поля даты от модуля Date (datetime, date, datestamp)

// Для datetime
$node->field_datetest[$node->language][0][value] = "2012-04-13 12:35:58";

// Для date
$node->field_datetest[$node->language][0][value] = "2012-04-13T12:35:58";

// Для datestamp
$node->field_datetest[$node->language][0][value] = strtotime("2012-04-13 12:35:58");

Обратате внимание что вам не нужно указывать полную дату; для datetime и date , можно заполнить недостающие значения нулями, например: "2012-04-00 00:00:00" (datetime), "2012-00-00T00:00:00" (date), и т.д. Для datestamp можно писать так strtotime("2012-04-13").


Поля с булевыми значениями

$node->field_bork[$node->language][0]['value'] = 1;


Поле Term reference (taxonomy)

$node->field_tags[LANGUAGE_NONE][]['tid'] = 25;


Node and User references (References)

// 1 nid ноды
$node->field_node_reference[$node->language][]['nid'] = 1;

//  2 uid пользователя
$node->field_user_reference[$node->language][]['uid'] = 2;

Для множественные связей, просто продублируйте код.


Изображение

// создаем объект
$file_path = drupal_realpath('foo.jpg');
$file = (object) array(
            'uid' => 1,
            'uri' => $file_path,
            'filemime' => file_get_mimetype($file_path),
            'status' => 1,
);

// сохраняем файл
$file = file_copy($file, 'public://'); // можно указать поддерикторию, например: public://foo/

// добавляем к материалу
$node->field_image[$node->language][0] = (array) $file;


Поле ссылка (Link)

$node->field_url[$node->language][0]['title'] = “druit.ru”;
$node->field_url[$node->language][0]['url'] = “<a href="http://druit.ru">http://druit.ru</a>”;


Программное создание комментария

$comment = new stdClass();  // Создаем объект comment
$comment->nid = $node->nid; // nid ноды к которой нужно добавить комментарий
$comment->cid = 0; // оставить как есть
$comment->pid = 0; // id родительского комментария
$comment->uid = 1; // uid автора комментария
$comment->mail = '<a href="mailto:email@example.ru">email@example.ru</a>'; // email пользователя
$comment->name = 'ИМя пользователя'; // если пользователь зарегистрирован, то можно оставить пустым, оно заполнится автоматически, а если анонимный, то нужно указать
$comment->thread = '01/'; // Необязательно. Указывается при иерархических комментариях
$comment->hostname = '127.0.01' // Необязательно. IP для логов
$comment->created = time(); // Необязательно. Дата публикации комментария
$comment->is_anonymous = 0; // оставить как есть
$comment->homepage = ''; // Домашняя старница
$comment->status = COMMENT_PUBLISHED; // Опубликован
$comment->language = LANGUAGE_NONE; // Такой же как и у ноды
$comment->subject = 'Заголовок комментария';

$comment->comment_body[$comment->language][0]['value'] = 'Текст комментария';
$comment->comment_body[$comment->language][0]['format'] = 'filtered_html';

if ($comment = comment_submit($comment)) {
  comment_save($comment); // сохраниние комментария
}


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

Если вам нужно программно создать новый термин таксономии можно воспользоваться функцией taxonomy_term_save(), как здесь:

$new_term = array(
    'vid' => 1, // vid словаря таксономии
    'name' => 'Новый термин',
    // Можно задать родительский термин: 'parent' => 25
);
$new_term = (object) $new_term;
taxonomy_term_save($new_term);

после сохранения в объекте термина будет доступен его tid: $new_term->tid.

Комментарии

Спасибо за материал! Очень помогло, но у меня не получилось выставить язык типа 'ru' для body. Поэтому оставил 'und', что и хранится в LANGUAGE_NONE, язык-то все равно хранится в таблице node, а не в field_data_body.

        $node->language = 'ru';
        $node->body['und'][0]['value'] = $bodytext;
        $node->body['und'][0]['summary'] = text_summary($bodytext);
        $node->body['und'][0]['format']  = 'filtered_html';

У меня термин создается, но не выводится в списке терминов к данному словарю.

а как добавить мета-теги к записи?

Around the implementation of ethnic regional autonomy, a deep investigation research, suggestion establish and strengthen regional ethnic autonomy of form Discount Woman Handbags (http://www.imalls.me/item/Handbags-2.html) a complete set of legal system and method, the relevant policies to boost its implementation.