Я пытаюсь создать узлы в 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);
И в обоих случаях я публикую новый узел, но тело никогда не устанавливается и не отображается.
Как правильно установить тело нового узла, который я сохраняю?
Чтобы создать узел с помощью оболочки (требуется модуль сущностей), попробуйте код ниже:
$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';
Я вижу две проблемы здесь
Если это новый узел, используйте 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 () и взглянуть на ваши поля, может быть проблема с выводом узла.
Согласитесь с Сергеем и просто хотели добавить, что 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);
А затем установить другие значения, заголовок, тело …