Создавайте контент программно

9

В Drupal 8, как я могу создавать контент программно? Из администрации «Drupal 8» я создал новый тип «Дом» (содержит описание, изображение, поле ссылки для пользователей ...). Как я могу создать тип объекта "Дом" из пользовательского модуля?

В моем пользовательском модуле у меня есть файл формы (содержит класс, который расширяет FormBase). В обратном вызове отправки я хочу создать новый «дом», установить значения и сохранить новый объект.

Я не нахожу примеры в Интернете, в основном ...

Матье Лопес
источник
Ваш второй вопрос "Как я могу создать объект типа" Дом "?" немного сбивает с толку. Я думаю, что вопрос "Как я могу создать узел типа" Дом "из пользовательского модуля?" Неоднозначность проистекает из использования «типа сущности», который имеет очень специфическое значение в Drupal, и вопрос может быть «Как я могу создать собственный тип сущности с именем« Дом »из пользовательского модуля?» или «Как я могу создать пользовательский объект, который использует пакет« Дом »»?
Мрадклифф

Ответы:

15

Вот простой пример создания узла в Drupal 8.

$data = [
  'type' => 'article', 
  'title' => 'My new title', 
  'uid' => 1
];
$node = Drupal::entityTypeManager()
  ->getStorage('node')
  ->create($data);
$node->save();

Обновлено, чтобы удалить устаревшую функцию согласно комментариям от @mradcliffe. Спасибо!

К вашему сведению, для тестирования таких маленьких фрагментов кода drush core-cliкоманда отлично работает. Смотрите: http://www.drushcommands.com/drush-7x/core/core-cli

дровокол
источник
1
Перед сохранением с помощью entityManager можно узнать для каждого поля: какой тип данных должен быть установлен? (текст для текстового поля, fid для файла и т. д.)
Матье Лопес
Единственный способ, который я знаю на данный момент, - это использовать другой устаревший метод EntityManager :: getDefinitions (), но я думаю, что если вы создадите экземпляр EntityDataDefinition с помощью статического метода create, вы можете вызвать getPropertyDefinitions (). Оба возвращают определения для каждого свойства, такого как заголовок или поле. Существует также getFieldStorageDefinitions (), который возвращает то же самое, но из объекта хранения (см. Выше getStorage ('node')). Однако это может быть недоступно для драйверов, отличных от SQL.
Мрадклифф
0

Начиная с Drupal 8, узлы теперь рассматриваются как сущности. Вы можете просто создать узел с помощью следующего кода

$new_page_values = array();
$new_page_values['type'] = 'my_content_type';
$new_page_values['title'] = $form_state['values']['page_title'];
$new_page_values['path'] = $new_page_path;

$new_page = entity_create('node', $new_page_values);
$new_page->save();
Шабир А.
источник
2
entity_create () - устаревший метод, который мы должны избегать. Внедрение EntityManager в класс Form или использование \ Drupal :: entityManager являются стандартными способами управления объектами.
Мрадклифф