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,

Ewiges Schwarz
quelle

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

mradcliffe
quelle
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();
Rachid Chihabi
quelle
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();
rémy
quelle
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