Как программно создать узлы с полями даты и изображения?
Я знаю, что могу сделать это в Drupal 7 с помощью следующего кода.
global $user;
$node = new stdClass();
$node->title = "YOUR TITLE";
$node->type = "YOUR_NODE_TYPE";
node_object_prepare($node); // Sets some defaults. Invokes hook_prepare() and hook_node_prepare().
$node->language = LANGUAGE_NONE; // Or e.g. 'en' if locale is enabled
$node->uid = $user->uid;
$node->status = 1; //(1 or 0): published or not
$node->promote = 0; //(1 or 0): promoted to front page
//image field
$existing_filepath = "/home/nzcodarnoc/sites/default/files/imported/picture.jpg"
$new_filepath = "public://picture.jpg"
// Create the file object
$drupal_file = file_save_data(file_get_contents($existing_filepath), $new_filepath);
$drupal_file->alt = $node->title;
$drupal_file->title = $node->title;
// Assign the file object to the node, as an array
$node->field_my_file[$node->language][0] = get_object_vars($drupal_file);
//date field
$node->birth_date[LANGUAGE_NONE][0]['value'] = time();
$node = node_submit($node); // Prepare node for saving
node_save($node);
Каков эквивалентный код для Drupal 8?
Ответы:
Следующий код поможет вам сохранить изображение в новом узле.
Для получения дополнительной информации см. Http://realityloop.com/blog/2015/10/08/programmatics-attach-files-node-drupal-8 .
источник
В drupal 8 сущности являются объектами, и поэтому создание сущности означает создание экземпляра класса типа сущности. Если вы знаете класс сущности, вы можете использовать ключевое слово new или функцию create.
IE
$foo = new Foo();
или$foo = Foo::create();
Если вы не знаете класс сущности (только имя машины), вы можете использовать запрос класса Storage следующим образом:
\Drupal::entityTypeManager()->getStorage($entity_type_id)->create();
Чтобы заполнить поля сущности, вы можете использовать
$entity->set($key, $value)
метод объекта сущности или передатьkey=>value
массив конструктору сущности. В качестве таких:Чтобы сохранить объект, вам нужно только вызвать
$entity->save()
метод объекта объекта.Так как файлы в drupal 8 также являются сущностями, вам нужно либо передать в качестве значения идентификатор сущности файла, либо фактическую сущность файла.
Вот код для вашего конкретного сценария:
источник
Я думаю, что объектно-ориентированный способ более удобен, не так ли?
источник
Если вы хотите сделать это наиболее чистым способом (тестируемым), используйте
entity_type.manager
сервис:Проблема с
Node::create
функцией в том, что это статический вызов, и поэтому вы не можете больше тестировать свой класс. Старайтесь не делать статических звонков, когда это возможно. Это сделает ваш код более читабельным (потому что зависимости будут понятны).источник
Другой способ создать узел с изображением:
источник
Следующий код работает для меня
источник
$form_state
доступно только в определенных контекстах; в противном случае вы не сможете получить к нему доступ.источник