Créer du contenu par programmation

9

Dans Drupal 8, comment créer du contenu par programmation? A partir de l'administration "Drupal 8", j'ai créé un nouveau type "Maison" (contenant une description, une image, un champ de référence aux utilisateurs ...). Comment puis-je créer un type d'entité "Maison" à partir d'un module personnalisé?

Dans mon module personnalisé, j'ai un fichier de formulaire (contient une classe qui étend FormBase). Dans le rappel de soumission, je veux créer une nouvelle "maison" et définir des valeurs et enregistrer la nouvelle entité.

Je ne trouve pas d'exemples sur le web, en gros ...

matthieu lopez
la source
Votre deuxième question "Comment puis-je créer un type d'entité 'Maison'?" est un peu déroutant. Je pense que la question est "Comment puis-je créer un nœud du type de nœud" Maison "à partir d'un module personnalisé?" L'ambiguïté provient de l'utilisation du "type d'entité" qui a une signification très spécifique dans Drupal et la question pourrait être "Comment puis-je créer un type d'entité personnalisé appelé" Maison "à partir d'un module personnalisé?" ou "Comment créer une entité personnalisée qui utilise le bundle" Maison ""?
mradcliffe

Réponses:

15

Voici un exemple simple de création d'un nœud dans Drupal 8.

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

Mis à jour pour supprimer la fonction obsolète selon les commentaires de @mradcliffe. Merci!

Pour info, pour tester de petits extraits de code comme celui-ci, la drush core-clicommande fonctionne très bien. Voir: http://www.drushcommands.com/drush-7x/core/core-cli

couperet
la source
1
Avant la sauvegarde, avec l'entityManager, est-il possible de savoir pour chaque champ: quel type de données faut-il paramétrer? (texte pour champ texte, fid pour fichier etc ...)
matthieu lopez
La seule façon que je connaisse pour le moment est d'utiliser une autre méthode obsolète, EntityManager :: getDefinitions (), mais je pense que si vous instanciez une EntityDataDefinition via la méthode create statique, vous pouvez appeler getPropertyDefinitions (). Les deux renverront des définitions pour chaque propriété, comme le titre ou un champ. Il y a aussi le getFieldStorageDefinitions () qui retourne la même chose, mais à partir de l'entité de stockage (voir getStorage ('node') ci-dessus). Cependant, cela peut ne pas être disponible pour les pilotes non SQL.
mradcliffe
0

Depuis Drupal 8, les nœuds sont désormais traités comme des entités. Vous pouvez simplement créer un nœud par le code suivant

$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();
Shabir A.
la source
2
entity_create () est une méthode obsolète que nous devons éviter d'utiliser. L'injection de EntityManager dans la classe Form ou l'utilisation de \ Drupal :: entityManager sont les méthodes standard de gestion des entités.
mradcliffe