Drupal → Как программно создать ноду (материал)

08.06.2010

Drupal 7:

$node = new stdClass();
$node->type = 'story';
node_object_prepare($node);
$node->title = 'Заголовок ноды';
$node->language = LANGUAGE_NONE;
$node->body[LANGUAGE_NONE][0]['value'] = 'Содержание ноды';
$node->body[LANGUAGE_NONE][0]['summary'] = 'Текст анонса';
$node->body[LANGUAGE_NONE][0]['format'] = 'filtered_html';
$node->uid = 1;     // необязательно
$node->status = 1;  // необязательно
$node->promote = 1; // необязательно
node_save($node);

Способ с помощью модуля Entity API:

$node = entity_create('node', array(
  'type' => 'page',
  'title' => 'test',
  'body' => array(
    'und' => array(
      array(
        'value' => 'body value',
        'summary' => 'body teaser',
        'format' => 'filtered_html',
      ),
    ),
  ),
));
node_save($node);

Drupal 6:

$node = new stdClass();
$node->type = 'story';
$node->title = 'Заголовок ноды';
$node->body = 'Содержание ноды';
$node->teaser = 'Текст анонса';
$node->uid = 1;                  // id автора
$node->status = 1;               // 1 - опубликовано, 0 - нет
$node->promote = 1;              // 1 - показывать на главной, 0 - нет
node_save($node);
Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

Александр
11.11.2011, 11:17

А как же node_submit() перед node_save() ?

Тимур
15.02.2012, 21:56

Добрый день!
Использую указанный Вами код в модуле для 7-ки.
Почему-то если заголовок и значение поля кириллические, то открывается "На сайте произошла непредвиденная ошибка. Пожалуйста, повторите попытку позже." и нода соответственно не создается. При латинском заголовке и полях все нормально.
Подскажите, пожалуйста, в чем может быть проблема?

Тимур
17.02.2012, 01:53

Выдает ошибку
PDOException: в функции field_sql_storage_field_storage_write() (строка 448 в файле /home/u120949/mysiteru/www/modules/field/modules/field_sql_storage/field_sql_storage.module)
Гуглил, связано с кодировкой БД, но вменяемого решения так и не нашел :(

Гость
15.03.2012, 16:52

Проблема в кодировке файла модуля, а не БД

milkovsky
20.03.2012, 19:48

Нету ли способа, чтобы весь шаблон объекта ноды уже был собран(со всеми полями),
а значения полей можно было просто дописать в сформированый объект?

Можно через node_load() загрузить ноду такого же типа изменить нужные поля и сохранить.

Тимур
21.03.2012, 01:51

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

milkovsky
21.03.2012, 12:27

Можно через node_load() загрузить ноду такого же типа изменить нужные поля и сохранить.

Я уже думал об этом. Если ноду, которую я загружал, ктотоо удалит, то код не будет работать. Или сайт чистый, и на нет нет еще контента, код не сработает.

milkovsky
21.03.2012, 14:17

При создании новой ноды или доугой entity нужно приходится сохранять значение созданых полей. Нашел хороший способ тут .
Поля присоеденины к новому товару с помощью функции field_attach_submit.

Костик Корепин
05.06.2012, 23:40

А как url необходимый задать?

Гость
28.09.2012, 13:28
$node = new stdClass();   /* Создаём объект node */
$node->type = 'article';    /* Указываем тип материала */
node_object_prepare($node);  /* Подготавливаем объект ноды  */
 
$node->title = 'Заголовок ноды ' ; 
/* язык, для сайтов без мультиязычной поддержки */
$node->language = LANGUAGE_NONE;
$node->body[$node->language][0]['value']   = 'Содержание ноды.';
$node->body[$node->language][0]['summary'] = 'Текст анонса.';
$node->body[$node->language][0]['format']  = 'filtered_html';
 
$node->uid = 1;
$node->status = 1;
$node->promote = 1;

 /* Адрес ноды, можно не указывать, тогда путь будет вида node/номер_ноды */
 /* $path = 'content/programmatically_created_node_' . date('YmdHis'); */
 /* $node->path = array('alias' => $path); */

node_save($node); 

Стоит обратить внимание на функцию node_object_prepare(), которая делает сразу несколько полезных вещей:
- заполняет объект ноды данными по умолчанию для этого типа ноды (например, флаги статуса, комментариев,
показа и подобное).
- заносит идентификатор текущего пользователя в $node->uid (делает пользователя автором материала)
- вызывает хуки hook_prepare() и hook_node_prepare()

Если создание ноды прошло успешно, то в $node->nid будет содержаться идентификатор ноды, а $node->is_new будет установлено в TRUE.

Александр
10.04.2013, 15:36

Добрый день уважаемый xandeadx!
Как мне создать программно ноду с данными, которые я предварительно отправил из формы?
Заранее спасибо!

Alex Milkovsky
10.04.2013, 15:41

В функции сабмита твоей формы достаешь все данные. Они находятся в $form_state['values'];

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