Programmatisch einen Begriff erstellen?

32

Ich versuche, einem Vokabular viele Begriffe (~ 200) hinzuzufügen, aber ich kann keine Importmodule finden, die für Drupal 8 aktualisiert wurden, und es scheint, dass die Funktionen dafür in Drupal 7 nicht vorhanden sind Drupal 8. Kann mich jemand in die richtige Richtung weisen, um dies zu tun?

Ich habe versucht, dies entity_create, wie in den Kommentaren vorgeschlagen, mit folgendem Code zu tun :

$term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));

aber ich habe diesen Fehler bekommen:

Drupal\Core\Entity\EntityStorageException: Missing bundle for entity type taxonomy_term in Drupal\Core\Entity\FieldableEntityStorageControllerBase->create() (line 65 of core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php).

Irgendwelche Ideen?

Samsquanch
quelle
1
Ein Begriff ist eine Entität, also ...entity_create()
Clive
Ich habe versucht, dies mit diesem Code zu tun:, $term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));aber ich habe den Fehler erhalten Drupal\Core\Entity\EntityStorageException: Missing bundle for entity type taxonomy_term in Drupal\Core\Entity\FieldableEntityStorageControllerBase->create() (line 65 of core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php).- Irgendwelche Ideen?
Samsquanch
Versuchen Sie es vidanstelle von vocabulary_name. Sieht so aus, als wäre die Spalte noch vidin taxonomy_term_data, aber es ist jetzt der Vokabelname anstelle von id
Clive
Die Entitätsdaten sollten nicht aus den SQL-Tabellen abgeleitet werden, siehe unten.

Antworten:

42

Sie wissen, dass Sie etwas aus dem Taxonomiemodul wollen, also müssen Sie zuerst nachsehen Drupal\taxonomy\Entity- oder in das entsprechende Verzeichnis - Sie werden die TermKlasse dort finden. Nun sieh dir die Anmerkung an, heißt es @ContentEntityTypeund dort drin :

*   entity_keys = {
*     "id" = "tid",
*     "bundle" = "vid",
*     "label" = "name",
*     "uuid" = "uuid"
*   },

Also, was Sie wollen, ist

$term = Term::create([
  'name' => 'test', 
  'vid' => 'client',
])->save();

weil der labelEntitätsschlüssel nameund der bundleEntitätsschlüssel ist vid. Ich habe einen ->save()Anruf hinzugefügt und ich nehme an, dass Sie ihn auch speichern wollten.

Leksat
quelle
Weitere Optionen finden Sie unter drupal8.ovh/en/tutoriels/55/… .
Colan
1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();gibt mir schwerwiegenden Fehler: Aufruf der undefinierten Methode Drupal \ taxonomy \ Entity \ Term :: getType
alberto56
15

Zu diesem Zeitpunkt sollten Sie den Begriff auf eine andere Art und Weise hinzufügen (im Vergleich zu dieser Antwort). Zunächst müssen Sie in Ihre Datei schreiben

Verwenden Sie Drupal \ Taxonomy \ Entity \ Term.

Weil die Termklasse unter Drupal \ Taxonomy \ Entity aufgeführt ist. Und Sie müssen taxonomy_term parametr nicht an übergeben

Begriff :: erstellen

da nur ein Parameter benötigt wird (Array mit Werten) (unten stehender Code für diese Methode im Taxonomiemodul)

public function create(array $values = array()) {
  // Save new terms with no parents by default.
  if (empty($values['parent'])) {
    $values['parent'] = array(0);
  }
  $entity = parent::create($values);
  return $entity;
}

Das letzte Beispiel ist also

use Drupal\taxonomy\Entity\Term;
$categories_vocabulary = 'blog_categories'; // Vocabulary machine name
$categories = ['test 1', 'test 2', 'test 3', 'test 4']; // List of test terms
foreach ($categories as $category) {
  $term = Term::create(array(
    'parent' => array(),
    'name' => $category,
    'vid' => $categories_vocabulary,
  ))->save();
}
Сергей Пустынных
quelle
3
Etwas, das Sie vielleicht wissen möchten. $ term ist höchstwahrscheinlich gleich 1, da Entity::save()ein int zurückgegeben wird. Entweder die Konstanten SAVED_NEWoder SAVED_UPDATEDabhängig von der ausgeführten Operation. Wenn Sie jedoch das entfernen ->save()und hinzufügen $term->save();, werden Sie sehen, dass $termes mit den Informationen aktualisiert wird, die in der Datenbank gespeichert wurden. Beispiel, das Sie jetzt tun können$tid = $term->tid->value;
General Redneck
7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

Die anderen Antworten verwenden entity_create(), was funktioniert, aber nicht ganz so schön ist.

Wim Leers
quelle
6

Mit entityTypeManager():

$term = [
  'name'     => $name,
  'vid'      => $vocabulary,
  'langcode' => $language,
];

$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);
Sándor Juhász
quelle
2

Vielleicht möchten Sie sich ansehen, wie devel / devel_generate dies tut.

Aus devel_generate :

$values['name'] = devel_generate_word(mt_rand(2, $maxlength));
$values['description'] = "description of " . $values['name'];
$values['format'] = filter_fallback_format();
$values['weight'] = mt_rand(0, 10);
$values['langcode'] = LANGUAGE_NOT_SPECIFIED;
$term = entity_create('taxonomy_term', $values);
David Luhman
quelle
2

Bevor Sie einen Begriff erstellen, sollten Sie überprüfen, ob er existiert. Hier ist der Code:

use Drupal\taxonomy\Entity\Term;

if ($terms = taxonomy_term_load_multiple_by_name($term_value, 'vocabulary')) {
  // Only use the first term returned; there should only be one anyways if we do this right.
  $term = reset($terms);
} else {
  $term = Term::create([
    'name' => $term_value,
    'vid' => 'vocabulary',
  ]);
  $term->save();
}
$tid = $term->id();

Quelle: https://www.btmash.com/article/2016-04-26/saving-and-retrieving-taxonomy-terms-programmatically-drupal-8

ah gut
quelle