Drupal создает узел с телом программно

Я пытаюсь создать узлы в Drupal 7, используя php-скрипт, который я затем выполняю, используя Drush.

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

Я пробовал два разных подхода, используя разные советы, которые я нашел на других форумах.

В первом случае, установка элементов узла напрямую:

...
$node->title = 'Your node title';
$node->body[$node->language][0]['value'] = "<p>this is a test</p>";
$node->body[$node->language][0]['summary'] = "body summary;
$node->body[$node->language][0]['format'] = 'full_html';

Во втором случае, используя Entity Wrappers:

$node_wrapper = entity_metadata_wrapper('node', $node);
$node_wrapper->body->set(array('value' => '<p>New content</p>', 'format' => 'full_html'));

В обоих случаях я сохраняю узел следующим образом:

$node = node_submit($node);
node_save($node);

И в обоих случаях я публикую новый узел, но тело никогда не устанавливается и не отображается.

Как правильно установить тело нового узла, который я сохраняю?

0

Решение

Чтобы создать узел с помощью оболочки (требуется модуль сущностей), попробуйте код ниже:

$entity_type = 'node';
$entity = entity_create($entity_type, array('type' => 'article'));
$wrapper = entity_metadata_wrapper($entity_type, $entity);
$wrapper->title = 'title';
$wrapper->body->value = 'body value';
$wrapper->body->summary = 'summary';
$wrapper->body->format = 'full_html';
$wrapper->save();

В примере Сергея Филимонова он не звонит node_object_prepare($node) (требуется node-> type), который устанавливает некоторые значения по умолчанию (включено ли комментирование, выполняется ли переход узла на первую страницу, задается автор, …), поэтому существуют различия между подходами.

$entity = entity_create($entity_type, array('type' => 'article'));

можно заменить на

$entity = new stdClass();
$entity->type = 'article';
2

Другие решения

Я вижу две проблемы здесь

  1. язык
  2. Тип пакета

Если это новый узел, используйте LANGUAGE_NONE или язык вашего сайта.

Для нового объекта $ node-> language будет пустым, и вы получите уведомление:

Примечание: неопределенное свойство: stdClass :: $ language

Этот код работает для меня:

$node = new stdClass();
$node->title = 'Your node title';
$node->type = 'article';
$node->language = LANGUAGE_NONE;
$node->body[$node->language][0]['value'] = '<p>this is a test</p>';
$node->body[$node->language][0]['summary'] = 'body summary';
$node->body[$node->language][0]['format'] = 'full_html';
$node = node_submit($node);
node_save($node);

Всегда устанавливайте правильный тип узла узла здесь $ node-> type. Это имя машины типа содержимого узла.

Перейдите на страницу администрирования / содержимого и посмотрите строку с вашим новым узлом:

  • пустой тип столбца — проблема с комплектом.
  • Неопределенный язык () — проблема с языком.

Однако вы можете попытаться загрузить свой узел с помощью функции node_load (), распечатать его с помощью var_dump () и взглянуть на ваши поля, может быть проблема с выводом узла.

1

Согласитесь с Сергеем и просто хотели добавить, что node_object_prepare () также должен вызываться:

https://api.drupal.org/api/drupal/modules%21node%21node.module/function/node_object_prepare/7.x

$node = new stdClass();
$node->type = 'article';
node_object_prepare($node);

А затем установить другие значения, заголовок, тело …

0
По вопросам рекламы [email protected]