Comment créer par programmation des nœuds avec des champs de date et d'image?
Je sais que je peux le faire en Drupal 7 avec le code suivant.
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);
Quel est le code équivalent pour Drupal 8?
Le code suivant vous aidera à enregistrer une image dans un nouveau nœud.
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();
Pour plus d'informations, voir http://realityloop.com/blog/2015/10/08/programmatically-attach-files-node-drupal-8 .
Je pense que cette méthode orientée objet est plus pratique, non?
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();
Dans drupal 8 entités sont des objets et en tant que tel, créer une entité revient à créer une instance de la classe de type de l'entité. Si vous connaissez la classe de l'entité, vous pouvez soit utiliser le nouveau mot-clé ou la fonction de création.
C'EST À DIRE. $foo = new Foo();
ou $foo = Foo::create();
Si vous ne connaissez pas la classe d'entité (uniquement le nom de la machine), vous pouvez utiliser la demande de la classe Storage comme ceci: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();
Pour remplir les champs d'une entité, vous pouvez utiliser la méthode $entity->set($key, $value)
sur l'objet entité ou passer un tableau key=>value
Au constructeur de l'entité. En tant que tel:
$foo = new Foo([
'name'=>'bar',
'baz'=> TRUE,
'multi_value' => [
'first',
'second',
'third',
]
]);
Pour enregistrer une entité, il suffit d'appeler la méthode $entity->save()
sur l'objet entité.
Étant donné que les fichiers dans drupal 8 sont également des entités, vous devez soit transmettre l'id de l'entité de fichier, soit l'entité de fichier réelle, comme valeur.
$file_1 = File::load(1);
$foo->set('bar_files', [
$file_1,
2
]);
Voici un code pour votre scénario spécifique:
$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();
Si vous voulez le faire de la manière la plus propre (testable), utilisez entity_type.manager
un service:
$storage = $this->entityTypeManager->getStorage($entity_type_id);
$my_entity = $storage->create([
....
]);
Le problème avec Node::create
fonction, qu'il s'agit d'un appel statique, et c'est pourquoi vous ne pouvez plus vraiment tester votre classe à l'unité. Évitez de faire des appels statiques chaque fois que cela est possible. Cela rendra votre code plus lisible (car les dépendances seront claires).
Le code suivant fonctionne pour moi
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();
Une autre façon de créer un nœud avec une image est:
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();
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);