以编程方式创建节点


34

如何以编程方式创建带有日期和图像字段的节点?

我知道我可以在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的等效代码是什么?



Node :: create($ node_data_array)-> save()
Eyal

@Eyal,请提供更多详细信息。这个问题将来会被提及过多
Yusef

Answers:


56

以下代码将帮助您将图像保存在新节点中。

use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;

// Create file object from remote URL.
$data = file_get_contents('https://www.drupal.org/files/druplicon.small_.png');
$file = file_save_data($data, 'public://druplicon.png', FILE_EXISTS_REPLACE);

// Create node object with attached file.
$node = Node::create([
  'type'        => 'article',
  'title'       => 'Druplicon test',
  'field_image' => [
    'target_id' => $file->id(),
    'alt' => 'Hello world',
    'title' => 'Goodbye world'
  ],
]);
$node->save();

有关更多信息,请参见http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8


在此特定示例中,我们不需要\ Drupal \ file \ Entity \ File,因为我们直接从Internet获取图像文件。但是,如果您看到此链接Realityloop.com/blog/2015/10/08/…,那么您将找到正在使用的File实体的示例,//从本地复制的文件创建文件对象。$ uri = file_unmanaged_copy('public://source.jpg','public://destination.jpg',FILE_EXISTS_REPLACE); $ file = File :: Create(['uri'=> $ uri,]); $ file-> save();
amitgoyal

示例图片不存在。这可以做到:drupal.org/files/druplicon-small.png
KariKääriäinen17年

13

在drupal 8中,实体是对象,因此,创建实体就是创建实体类型类的实例。如果您知道实体的类,则可以使用new关键字或create函数。

IE浏览器$foo = new Foo();$foo = Foo::create();

如果您不知道实体类(仅机器名称),则可以使用以下存储类请求: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

要填充实体的字段,可以$entity->set($key, $value)在实体对象上使用方法,也可以将key=>value数组传递给实体构造函数。因此:

$foo = new Foo([
  'name'=>'bar',
  'baz'=> TRUE,
  'multi_value' => [
    'first',
    'second',
    'third',
  ]
]);

要保存实体,您只需要$entity->save()在实体对象上调用方法。

由于drupal 8中的文件也是实体,因此您需要传递文件实体的ID或实际文件实体作为值。

$file_1 = File::load(1);
$foo->set('bar_files', [
  $file_1,
  2
]);

这是您特定情况的代码:

$node_entity_type = \Drupal::entityTypeManager()->getDefinition('node');
// The [file_save_upload][1] function returns an array of all the files that were saved.
$poster_images = file_save_upload($upload_name, $validators, $destination);
$node = new Node([
  $node_entity_type->getKey('bundle') => 'movie',
  $node_entity_type->getKey('label') => 'Foo',
  'field_release_date' => '1/1/2015',
  'field_poster_image' => $poster_images,
]);
$node->save();

我想添加一个图像字段和一个日期字段,请使用此字段类型提供答案。
优素福

但是,如何在创建节点时在Drupal 8中以编程方式填充文本字段?
WM

$ node_data中的数据直接映射到节点字段。如果要将文本添加到名为field_body的字段中,只需添加另一个带有key_field_body的条目。
Eyal

我已经更新了更多详细信息。别客气。
Eyal

1
更新了我的答案
Eyal

12

我认为面向对象的方式更方便,不是吗?

use Drupal\node\Entity\Node;

$my_article = Node::create(['type' => 'article']);
$my_article->set('title', 'My article');
$my_article->set('field_text', 'My text');
$my_article->set('field_image', FID);
$my_article->set('field_user', UID);
$my_article->enforceIsNew();
$my_article->save();

7

如果要以最干净的方式(可测试)进行操作,请使用以下entity_type.manager服务:

$storage = $this->entityTypeManager->getStorage($entity_type_id);
$my_entity = $storage->create([
   ....
]);

Node::create函数的问题是静态调用,这就是为什么您不能再对单元进行单元测试了。尽可能避免进行静态调用。它将使您的代码更具可读性(因为相关性会很清楚)。


2

以下代码对我有用

use \Drupal\node\Entity\Node;
use \Drupal\file\Entity\File;

$node = entity_create('node', array(
'type' => 'article',
'title' => $form_state->getValue('title'),
'body' => array(
'value' => $form_state->getValue('body'),
'format' => 'basic_html',
),
'uid' => $uid,
));
$node->save();

1
entity_create已弃用
Eyal,

此外,$form_state仅在特定情况下可用;否则,您将无法访问它。
kiamlaluno

2

用图像创建节点的另一种方法是:

use \Drupal\file\Entity\File;

// Create file object from remote URL.
$data = file_get_contents('https://www.drupal.org/files/druplicon.small_.png');
$file = file_save_data($data, 'public://druplicon.png', FILE_EXISTS_REPLACE);

$node = \Drupal::entityTypeManager()->getStorage('node')->create(array(
  'type'        => 'article',
  'title'       => 'Druplicon test',
  'field_image' => [
    'target_id' => $file->id(),
    'alt' => 'Hello world',
    'title' => 'Goodbye world'
  ],
));
$node->save();

0
use Drupal\Core\Language\Language;


$definition = \Drupal::entityTypeManager()->getDefinition('node');
$values = [
    $definition->getKey('bundle') => 'basic_page',
    'langcode'                    => Language::LANGCODE_NOT_SPECIFIED,
    'title'                       => '...',
];
$entity = \Drupal::entityTypeManager()->getStorage('node')->create($values);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.