Wie setze ich programmgesteuert einen Taxonomiebegriff für einen Knoten?


9

Ich habe einige Schwierigkeiten beim Festlegen einer Taxonomie für einen Knoten. Derzeit verwende ich diesen 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();

Was bisher gut funktioniert (unter einem Bild der Felder "detailseite").

Geben Sie hier die Bildbeschreibung ein

Alles wird richtig eingestellt und ich kann die neu erstellten Knoten im Admin-Bereich finden, die richtig funktionieren. Jetzt muss ich 'field_meldungstyp' setzen, was eine Entitätsreferenz auf eine Taxonomie ist:

Geben Sie hier die Bildbeschreibung ein

welches bereits drei Einträge enthält:

Ich möchte die Knoten, die ich programmgesteuert erstellt habe, so einstellen, dass "field_meldungstyp" auf "Artikel" des "Meldungstyp" -Vokabulars gesetzt ist.

Ich habe bereits versucht hinzuzufügen:

'field_meldungstyp' => array( 'tid' => 19 ),

wobei 19 die Nachricht von "Artikel" des zuvor erwähnten Vokabulars ist. Und dort stecke ich fest. Auch https: //www.drupal.org/node/2402811 hat bei mir nicht funktioniert. Ebenso gut wie

$node->field_meldungstyp[$node->language][]['tid'] = 19;

hat auch nicht funktioniert.

einfach hinzufügen

$node = Node::create(array(
    ...
    'field_meldungstyp' => 19,
    ...
));

führt zum Absturz mit folgendem Fehler:

Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [HY000]: Allgemeiner Fehler: 1366 Falscher ganzzahliger Wert: 'datetime' für Spalte 'created' in Zeile 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) in Drupal \ Core \ Entity \ Sq> save () (Zeile 770 von core / lib / Drupal / Core / Entity / Sql / SqlContentEntityStorage.php). Drupal \ Core \ Database \ Statement-> execute (Array, Array) (Zeile: 610) Drupal \ Core \ Database \ Connection-> Abfrage ('INSERT INTO {taxonomy_index} (nid, tid,

Antworten:


9

Es muss ein verschachteltes Array sein.

'field_meldungstyp'  => [
      ['target_id' => 12345]
    ]

Versuche dies:

$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();

Das etwas stürzt auch mit (I ausgetauscht 12345zu 19entsprechend;))Drupal\Core\Entity\EntityStorageException: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: 'datetime' for column 'created' at row 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] => 188 [:db_insert_placeholder_1] => 19 [:db_insert_placeholder_2] => ... in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save()
— Eternal Black

Wenn Sie einen Fehler mit Ihrem "erstellten" Feld haben, muss es sich um einen Unix-Zeitstempel handeln. Wenn Sie das aus Ihrem Array erstellte entfernen, wird der Fehler behoben. Versuch es.
— oknate

12

In Drupal 7 gab es Taxonomie-Referenzfelder, die das Muster verwendeten ['tid' => NUMBER]. Dies sind Entitätsreferenzfelder. Das EntityReferenceItem hat die Eigenschaftsdefinitionen: target_idund entity. Ersteres ist entweder eine Ganzzahl oder eine Zeichenfolge, abhängig von den Einstellungen des Entitätsreferenzelements (im Grunde Entitätstyp config / content).

Dies ist auch eine ähnliche Frage wie beim programmgesteuerten Festlegen des Werts für ein mehrwertiges Feld in Drupal 8

Versuchen Sie also, das Muster zu verwenden

Als Teil von Entity :: create

Node::create([
  'field_meldungstyp' => [['target_id' => 19]]
]);

Verwenden von FieldableEntityInterface :: set

$entity->set('field_meldungstyp', ['target_id' => 19]);

Verwenden von TypedDataInterface :: setValue direkt für das Feldelement.

$entity->field_meldungstyp->setValue(['target_id' => 19]);

Mit magischer Methode

$entity->field_meldungstyp->target_id = 19;

Beachten Sie, dass dadurch alle aktuellen Werte des Feldes überschrieben werden.


Ich finde die Content Entity- Dokumentation etwas unvollständig, da nicht klar ist, wie ein anderes Feldelement als die Value Magic-Methode festgelegt werden soll. Bei Basisfeldern handelt es sich um eine Zeichenfolge oder eine Ganzzahl. Bei Feldelementen sollten jedoch die vollständigen Listenwerte für Feldelemente enthalten sein.
— mradcliffe

Leider führt dies immer noch zu einem -syntax-Fehler, unerwartet '=', erwartet ']' - für mich, wenn ich einen dieser Fehler direkt vor $ node-> save hinzufüge. Selbst wenn ich das Ganze auf "entity_create ('node', $ node)" ändere und Node :: create entferne, führt die Zeile zu einem Absturz. Vielleicht stimmt etwas mit meiner Drupal-Installation nicht, da mir etwas fehlt.
— Ewiges Schwarzes

Haben Sie den Syntaxfehler in meiner Antwort gesehen? Verbessere es. Es sollte =>nicht sein =. :-)
— mradcliffe

Ich glaube, ich brauche wirklich eine Pause; D (daran arbeitet =>ich schon den ganzen Tag) gibt mir immer noch syntax error, unexpected '=>' (T_DOUBLE_ARROW).
— Ewiges Schwarzes

1
"$ entity-> field_meldungstyp-> value = [['target_id' => 19]];". Das stimmt nicht Was Sie wollen, ist $ entity-> field_meldungstyp-> target_id = 19. Beachten Sie, dass auch das Bereitstellen von 19 ohne das Array für set (), setValue () und sogar $ node-> field-meldungstyp = 19 für einen einzelnen Wert funktionieren sollte Feld. Der Feldtyp versucht automatisch, ihn in die richtige Struktur umzuwandeln.
— Berdir

4

Hier ist, wie ich es für D8 gemacht habe.

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

// Neue Steuer erstellen

use Drupal\taxonomy\Entity\Term;

$new_term = Term::create([
    'vid' => "YOUR_VOCABULARY_MACHINE_NAME",
    'name' => "NAME_OF_YOUR_TERM",
]);
$new_term->save();

0

Ein anderer Ansatz wäre, den Knoten nach der Erstellung wie folgt zu aktualisieren:

$node = Node::create(array(
    ...
));
$node->save();
$node->field_meldungstyp->target_id = 19;
$node->save();

Versuchte das auch anfänglich und es stürzte ab. Ich werde die Ausgabe oben hinzufügen.
— Ewiges Schwarzes

okey - also versuchen Sie target_id
— rémy

Leider gleiche Ergebnisse / Fehlermeldung. :(
— Eternal Black

Dann würde ich das Feld nach der Erstellung aktualisieren (speichern) - meine Antwort aktualisiert. Haben Sie das verschachtelte Array mit dem Schlüssel target_id ausprobiert?
— Rémy

Ja, habe es versucht, leider der gleiche Fehler wie hier [link [( drupal.stackexchange.com/questions/217396/… )
— Eternal Black
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.