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

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

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

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
Похожие записи

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

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

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

читайте логи

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

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

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

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

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

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

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

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

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

что за url?

http://xandeadx.ru/blog/drupal/441 извиняюсь я имел ввиду alias )))Благодарю!

$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.

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

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

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

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

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