it-swarm.com.de

Programmgesteuert einen Begriff erstellen?

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 die Funktionen dafür zu sein dies in Drupal 7 existiert nicht in Drupal 8. Kann mir jemand die richtige Richtung dafür geben?

Ich habe versucht, dies mit entity_create Zu tun, wie in den Kommentaren vorgeschlagen, mit diesem Code:

$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?

33
Samsquanch

Sie wissen, dass Sie etwas vom Taxonomiemodul möchten, also müssen Sie zuerst in Drupal\taxonomy\Entity - oder dem entsprechenden Verzeichnis - suchen. Dort finden Sie die Klasse Term. Schauen Sie sich nun die Anmerkung an, auf der steht @ContentEntityType Und dort:

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

Also, was du willst ist

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

weil der Entitätsschlüssel labelname und der Entitätsschlüssel bundlevid ist. Ich habe einen ->save() -Aufruf hinzugefügt und ich nehme an, Sie wollten ihn auch speichern.

43
user49

Zu diesem Zeitpunkt sollten Sie den Begriff auf eine etwas andere Weise hinzufügen (im Vergleich zu this answer). Zunächst sollten Sie in Ihrer Datei schreiben

verwenden Sie Drupal\taxonomy\Entity\Term.

Weil die Begriffsklasse unter Drupal\taxonomy\Entity aufgeführt ist. Und Sie müssen den Parameter taxonomy_term nicht an übergeben

Term :: create

da nur ein Parameter benötigt wird (Array mit Werten) (unter dem unten aufgeführten 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();
}
Term::create([
 'name' => 'Lama',
 'vid' => $vocabulary_id,
]);

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

8
Wim Leers

Mit entityTypeManager():

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

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

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

Von 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);
2
David Luhman

Bevor Sie einen Begriff erstellen, überprüfen Sie besser, ob er vorhanden ist. 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-programmatisch-drupal-8

2
ahgood