プログラムで用語を作成しますか?


32

ボキャブラリーに多くの用語(〜200)を追加しようとしていますが、Drupal 8用に更新されたインポートモジュールが見つかりません。Drupal7でこれを行うための機能は存在しないようですDrupal 8.では、だれかがこれを行うための正しい方向に私を向けることができますか?

entity_createはコメントで示唆されているように、このコードでを試みました:

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

しかし、私はこのエラーを受け取りました:

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

何か案は?


1
用語は...そう、実体であるentity_create()
クライヴ

このコードでこれを実行しようとしました:$term_create = entity_create('taxonomy_term', array('name' => 'test', 'vocabulary_name' => 'client'));、エラーが発生しました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).-アイデアはありますか?
サムスカンチ14

vid代わりに試してくださいvocabulary_name。列のように見えるがまだあるvid中でtaxonomy_term_data、それは今単語名の代わりに、IDだ
クライヴ

エンティティデータはSQLテーブルから派生しないでください。以下を参照してください。

回答:


42

分類モジュールから何かが必要であることを知っているので、最初に調べる必要がありますDrupal\taxonomy\Entity-または対応するディレクトリ-あなたはTermそこにクラスを見つけるでしょう。ここで注釈を見て、それ@ContentEntityTypeがそこにあると言っています:

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

だから、あなたが欲しいのは

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

ので、labelエンティティキーがあるnamebundle、エンティティキーがありますvid->save()通話を追加しただけでなく、あなたもそれを保存したいと思います。


drupal8.ovh/en/tutoriels/55/…では、さらに多くのオプションを利用できます。
コラン

1
$term = \Drupal\taxonomy\Entity\Term::create(array( 'name' => 'whatever', 'vid' => 'tags', )); $term->save();私に致命的なエラーを与える:未定義のメソッドへのコールのDrupal \分類\エンティティ\ターム::のgetType
alberto56

15

この時点で、別の方法で用語を少し追加する必要があります(この回答と比較し)まず、ファイルに次のように記述します。

Drupal \ taxonomy \ Entity \ Termを使用します。

TermクラスがDrupal \ taxonomy \ Entityにリストされているため。そして、taxonomy_termパラメーターを渡す必要はありません

Term :: create

必要なパラメーターは1つだけなので(値を持つ配列)(分類法モジュールのこのメソッドのコードの下に記載)

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;
}

最後の例は

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

3
あなたが知りたいかもしれない何か。$ term Entity::save()は、intを返す可能性が最も高いため、1に等しくなります。定数SAVED_NEWまたはSAVED_UPDATED実行された操作に応じて。ただし、を削除し->save()てadd $term->save();を実行した場合$term、データベースに保存された情報で更新されていることがわかります。あなたが今できる例$tid = $term->tid->value;
一般的な田舎者

7
Term::create([
 'name' => ''Lama',
 'vid' => $vocabulary_id,
]);

他の答えはを使用しますがentity_create()、これは機能しますが、それほど良くありません。


6

entityTypeManager()

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

$term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create($term);

2

devel / devel_generateがこれをどのように行うかを見てみてください。

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

用語を作成する前に、用語が存在するかどうかを確認することをお勧めします。コードは次のとおりです。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.