Créer des nœuds par programme

34

Comment créer par programme des nœuds avec des champs de date et d'image?

Je sais que je peux le faire dans 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?

Yusef
la source
Veuillez consulter ce fil drupal.org/node/178506
Aryashree Pritikrishna
Node :: create ($ node_data_array) -> save ()
Eyal
@Eyal s'il vous plaît fournir plus de détails.Cette question soit trop renvoyée à l'avenir
Yusef

Réponses:

56

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 .

amitgoyal
la source
Dans cet exemple spécifique, nous n'avons pas besoin de \ Drupal \ file \ Entity \ File car nous obtenons directement le fichier image d'Internet. Mais si vous voyez ce lien realityloop.com/blog/2015/10/08/… , vous y trouverez des exemples d'entité Fichier utilisée, // Créer un objet fichier à partir d'un fichier copié localement. $ uri = file_unmanaged_copy ('public: //source.jpg', 'public: //destination.jpg', FILE_EXISTS_REPLACE); $ file = File :: Create (['uri' => $ uri,]); $ fichier-> save ();
amitgoyal
L'image d'exemple n'existe pas. Celui-ci fait: drupal.org/files/druplicon-small.png
Kari Kääriäinen
13

Dans Drupal 8, les entités sont des objets et, en tant que telles, 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 utiliser le nouveau mot-clé ou la fonction create.

IE $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 suit: \Drupal::entityTypeManager()->getStorage($entity_type_id)->create();

Pour renseigner les champs d'une entité, vous pouvez utiliser la $entity->set($key, $value)méthode sur l'objet entité ou transmettre un key=>valuetableau au constructeur de l'entité. En tant que tel:

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

Pour sauvegarder une entité, il suffit d'appeler la $entity->save()méthode sur l'objet entité.

Comme les fichiers de Drupal 8 sont également des entités, vous devez soit passer l’ID de l’entité de fichier, soit l’entité de fichier réelle, en tant que 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();
Eyal
la source
Je veux ajouter un champ image et une date ffield, donnez votre réponse avec ce type de champ.
Yusef
Mais comment renseigner des champs de texte par programmation dans Drupal 8, au moment de la création du nœud?
WM
Les données de $ node_data sont directement mappées sur les champs du nœud. Si vous souhaitez ajouter du texte à un champ appelé field_body, ajoutez simplement une autre entrée avec la clé field_body.
Eyal
J'ai mis à jour ma réponse avec plus de détails. Je vous en prie.
Eyal
1
Mise à jour de ma réponse
Eyal
12

Je pense que la méthode orientée objet est plus pratique, n'est-ce pas?

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();
Eugene
la source
7

Si vous voulez le faire de la manière la plus propre (testable), utilisez entity_type.managerservice:

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

Le problème avec la Node::createfonction, c’est qu’il s’agit d’un appel statique, c’est pourquoi vous ne pouvez plus réellement tester votre classe à l’unité. Évitez de faire des appels statiques chaque fois que c'est possible. Cela rendra votre code plus lisible (car les dépendances seront claires).

sibal
la source
3

Une autre façon de créer un noeud 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();
JHONATAN DAVID FERNANDEZ ROSA
la source
2

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();
visabhishek
la source
1
entity_create est obsolète
Eyal
En outre, $form_stateest disponible uniquement dans des contextes spécifiques; sinon, vous ne pouvez pas y accéder.
kiamlaluno
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);
Sándor Juhász
la source