J'ai eu quelques difficultés à définir une taxonomie pour un nœud. Actuellement, j'utilise ce code.
$node = Node::create(array(
'type' => 'detailseite',
'title' => $data[$headlineIndex],
'langcode' => 'de',
'uid' => '1',
'status' => 1,
'field_headline' => $data[$headlineIndex],
'field_intro' => $data[$introIndex] . $categories[$data[$categoryIndex]],
'created' => $data[$dateIndex],
'field_autor' => $data[$autorIndex],
'field_teaser_text' => $data[$shortIndex],
'field_fields' => array(),
));
$node->save();
Ce qui fonctionne bien jusqu'à présent (en dessous d'une image des champs de "detailseite").
Tout est réglé correctement et je peux trouver les nœuds nouvellement créés dans la zone d'administration qui fonctionnent correctement. Maintenant, je dois définir 'field_meldungstyp' qui est une référence d'entité à une taxonomie:
qui contient déjà trois entrées:
Je veux obtenir le ou les nœuds que j'ai créés par programmation pour que "field_meldungstyp" soit réglé sur "Artikel" du vocabulaire "Meldungstyp".
J'ai déjà essayé d'ajouter:
'field_meldungstyp' => array( 'tid' => 19 ),
où 19 est le tid de "Artikel" du vocabulaire mentionné précédemment. Et c'est là que je suis coincé. Https: //www.drupal.org/node/2402811 ne fonctionnait pas non plus pour moi. Aussi bien que
$node->field_meldungstyp[$node->language][]['tid'] = 19;
n'a pas fonctionné non plus.
ajoutant simplement
$node = Node::create(array(
...
'field_meldungstyp' => 19,
...
));
entraîne un plantage avec l'erreur suivante:
Drupal\Core\Entity\EntityStorageException: SQLSTATE [HY000]: Erreur générale: 1366 Valeur entière incorrecte: 'datetime' pour la colonne 'créé' à la ligne 1: INSERT INTO {taxonomy_index} (nid, tid, status, sticky, created) VALUES (: db_insert_placeholder_0,: db_insert_placeholder_1,: db_insert_placeholder_2,: db_insert_placeholder_3,: db_insert_placeholder_4); Array ([: db_insert_placeholder_0] => 343 [: db_insert_placeholder_1] => 19 [: db_insert_placeholder_2] => 1 [: db_insert_placeholder_3] => 0 [: db_insert_placeholder_4] => datetime) dans Drupal\Core\Entity\Sqtl save () (ligne 770 de core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php). Drupal\Core\Database\Statement-> execute (Array, Array) (Ligne: 610) Drupal\Core\Database\Connection-> query ('INSERT INTO {taxonomy_index} (nid, tid, status, sticky, created) VALUES ( : db_insert_placeholder_0,: db_insert_placeholder_1,: db_insert_placeholder_2,: db_insert_placeholder_3,: db_insert_placeholder_4) ', Array, Array) (Ligne: 81) Drupal\Core\Database\Driver\mysql\Connection-> query (' INSERT INex} tid, status, sticky, created) VALUES (: db_insert_placeholder_0,: db_insert_placeholder_1,: db_insert_placeholder_2,: db_insert_placeholder_3,: db_insert_placeholder_4) ', Array, Array) (Ligne: 32) Drupal\Core\Database\Driver\mysq () (Ligne: 371) Drupal\Core\Database\Query\Merge-> execute () (Ligne: 525) taxonomy_build_node_index (Objet) (Ligne: 479) taxonomy_node_insert (Objet) call_user_func_array ('taxonomy_node_insert', Array) (Ligne: 402) Drupal\Core\Extension\ModuleHandler-> invokeAll ('node_insert', Array) (Ligne: 167) Drupal\Core\Entity\EntityStorageBase-> inv okeHook ('insert', Object) (Line: 418) Drupal\Core\Entity\ContentEntityStorageBase-> invokeHook ('insert', Object) (Line: 470) Drupal\Core\Entity\EntityStorageBase-> doPostSave (Object,) ( Ligne: 304) Drupal\Core\Entity\ContentEntityStorageBase-> doPostSave (Object,) (Ligne: 395) Drupal\Core\Entity\EntityStorageBase-> save (Object) (Ligne: 761) Drupal\Core\Entity\Sql\SqlContentEntityStorage -> save (Object) (Ligne: 364) Drupal\Core\Entity\Entity-> save () (Ligne: 46) Drupal\awo_importer\Controller\T3ImporterController-> import () call_user_func_array (Array, Array) (Ligne: 123 ) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> Drupal\Core\EventSubscriber {fermeture} () (ligne: 574) Drupal\Core\Render\Renderer-> executeInRenderContext (objet, objet) (ligne: 124) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> wrapControllerExecutionInRenderContext (Array, Array) (ligne: 97) Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> Drupal\Core\EventSubscriber {c losure} () call_user_func_array (Object, Array) (Line: 144) Symfony\Component\HttpKernel\HttpKernel-> handleRaw (Object, 1) (Line: 64) Symfony\Component\HttpKernel\HttpKernel-> handle (Object, 1, 1) (Ligne: 57) Drupal\Core\StackMiddleware\Session-> handle (Object, 1, 1) (Ligne: 47) Drupal\Core\StackMiddleware\KernelPreHandle-> handle (Object, 1, 1) (Ligne: 98 ) Drupal\page_cache\StackMiddleware\PageCache-> passer (objet, 1, 1) (ligne: 77) Drupal\page_cache\StackMiddleware\PageCache-> gérer (objet, 1, 1) (ligne: 47) Drupal\Core\StackMiddleware\ReverseProxyMiddleware-> handle (Object, 1, 1) (Line: 50) Drupal\Core\StackMiddleware\NegotiationMiddleware-> handle (Object, 1, 1) (Line: 23) Stack\StackedHttpKernel-> handle (Object, 1, 1) (Ligne: 628) Drupal\Core\DrupalKernel-> handle (Object) (Ligne: 19)
Il doit s'agir d'un tableau imbriqué.
'field_meldungstyp' => [
['target_id' => 12345]
]
Essaye ça:
$node = Node::create(array(
'type' => 'detailseite',
'title' => $data[$headlineIndex],
'langcode' => 'de',
'uid' => '1',
'status' => 1,
'field_headline' => $data[$headlineIndex],
'field_intro' => $data[$introIndex] . $categories[$data[$categoryIndex]],
'created' => $data[$dateIndex],
'field_autor' => $data[$autorIndex],
'field_teaser_text' => $data[$shortIndex],
'field_meldungstyp' => [
['target_id' => 12345]
]
));
$node->save();
Dans Drupal 7, il existait des champs de référence de taxonomie utilisant le modèle ['tid' => NUMBER]
. Ce sont des champs de référence d'entité. EntityReferenceItem a les définitions de propriété: target_id
et entity
. Le premier est un entier ou une chaîne en fonction des paramètres de l'élément de référence d'entité (essentiellement le type d'entité config/content).
C'est aussi une question similaire à Comment définir la valeur du champ à valeurs multiples dans drupal 8 par programme
Essayez donc d'utiliser le modèle
Dans le cadre d'Entity :: create
Node::create([
'field_meldungstyp' => [['target_id' => 19]]
]);
Utiliser FieldableEntityInterface :: set
$entity->set('field_meldungstyp', ['target_id' => 19]);
Utilisation de TypedDataInterface :: setValue directement sur l'élément de champ.
$entity->field_meldungstyp->setValue(['target_id' => 19]);
Avec méthode magique
$entity->field_meldungstyp->target_id = 19;
Notez que cela remplace toutes les valeurs actuelles du champ.
Voici comment je l'ai fait pour D8.
use Drupal\node\Entity\Node;
//To create new node
$node = Node::create(['type' => 'YOUR_CONTENT_TYPE_HERE']);
//To load a node by its ID
//$node = \Drupal\node\Entity\Node::load(NODE_ID);
$nodeTerms = [1,2,3...]; // 1,2,3 = terms IDs
$node->set('YOUR_FIELD_OF_TERMS', $nodeTerms);
$node->save();
// Pour créer une nouvelle taxe
use Drupal\taxonomy\Entity\Term;
$new_term = Term::create([
'vid' => "YOUR_VOCABULARY_MACHINE_NAME",
'name' => "NAME_OF_YOUR_TERM",
]);
$new_term->save();
Une autre approche serait de mettre à jour le nœud après sa création, comme ceci:
$node = Node::create(array(
...
));
$node->save();
$node->field_meldungstyp->target_id = 19;
$node->save();