web-dev-qa-db-fra.com

Comment définir par programmation un terme de taxonomie pour un nœud?

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").

enter image description here

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:

enter image description here

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)

8
Eternal Black

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();
8
oknate

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.

11
mradcliffe

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();
4
Rachid Chihabi

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();
0
rémy