プログラムでノードの分類用語を設定するにはどうすればよいですか?


9

ノードの分類を設定するのにいくつかの問題が発生しました。現在、私はこのコードを使用しています。

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

これまでのところうまくいきます(「詳細」のフィールドの画像の下)。

ここに画像の説明を入力してください

すべてが正しく設定され、正しく動作する管理領域で新しく作成されたノードを見つけることができます。次に、分類法へのエンティティ参照である「field_meldungstyp」を設定する必要があります。

ここに画像の説明を入力してください

これにはすでに3つのエントリが含まれています。

プログラムで作成したノードを取得して、 "field_meldungstyp"を "Meldungstyp" -Vocabularyの "Artikel"に設定します。

私はすでに追加しようとしました:

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

19は、前述の語彙の「Artikel」のtidです。そして、それは私が行き詰まっているところです。また、https://www.drupal.org/node/2402811が機能しませんでした。と同様

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

どちらも動作しませんでした。

単に追加する

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

次のエラーでクラッシュします:

Drupal \ Core \ Entity \ EntityStorageException:SQLSTATE [HY000]:一般エラー:1366不正な整数値:行1の列 'created'の 'datetime':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); Drupal \ Core \ Entity \ Sql \ SqlContentEntityStorage>の配列([:db_insert_placeholder_0] => 343 [:db_insert_placeholder_1] => 19 [:db_insert_placeholder_3] => 0 [:db_insert_placeholder_4] => datetime) save()(core / lib / Drupal / Core / Entity / Sql / SqlContentEntityStorage.phpの行770)。Drupal \ Core \ Database \ Statement-> execute(Array、Array)(Line:610)Drupal \ Core \ Database \ Connection-> query( 'INSERT INTO {taxonomy_index}(nid、tid、

回答:


9

ネストされた配列である必要があります。

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

これを試して:

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

(それ1234519応じて交換しました;))でも多少クラッシュします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

「作成」フィールドにエラーがあり、UNIXタイムスタンプである必要があります。作成したアレイから削除すると、エラーはなくなります。それを試してみてください。
oknate 2016年

12

Drupal 7では、パターンを使用する分類基準参照フィールドが存在しました['tid' => NUMBER]。これらはエンティティ参照フィールドです。EntityReferenceItemは、プロパティ定義を持っていますtarget_identity。前者は、エンティティ参照アイテムの設定(基本的にはconfig / contentエンティティタイプ)に応じて、整数または文字列になります。

これは、drupal 8の複数値フィールドにプログラムで値を設定する方法と同様の質問です

だからパターンを使用してみてください

Entity :: createの一部として

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

FieldableEntityInterface :: setの使用

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

TypedDataInterface :: setValueをフィールドアイテムで直接使用します。

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

魔法の方法で

$entity->field_meldungstyp->target_id = 19;

これにより、フィールドの現在の値が上書きされることに注意してください。


値のマジックメソッド以外のフィールドアイテムの設定方法が明確でないため、コンテンツエンティティのドキュメントは少し不完全です。基本フィールドの場合は文字列または整数ですが、フィールドアイテムには完全なフィールドアイテムリストの値を含める必要がありますか?
mradcliffe 2016年

残念ながら、$ node-> saveの直前にこれらのいずれかを追加すると、-syntaxエラー、予期しない「=」、「]」を期待する結果になります。全体を "entity_create( 'node'、$ node)"のようなものに変更してNode :: createを削除しても、この行によりクラッシュが発生します。Drupalのインストール自体に何か問題があるのか​​もしれません。
Eternal Black

私の答えに構文エラーがありましたか?修正してください。=>ないはず=です。:-)
mradcliffe 2016年

私は本当に休憩が必要だと思います; D(その日はすでにその日に取り組んでいます)=>でもまだ私に与えますsyntax error, unexpected '=>' (T_DOUBLE_ARROW)
エターナルブラック

1
"$ entity-> field_meldungstyp-> value = [['target_id' => 19]] ;;" 不正解です。必要なのは$ entity-> field_meldungstyp-> target_id = 19です。配列なしで19を指定するだけでも、set()、setValue()で機能し、$ node-> field-meldungstyp = 19でも単一の値で機能することに注意してくださいフィールド。フィールドタイプは、自動的に正しい構造に変換しようとします。
Berdir 2016年

4

ここに私がD8のためにそれをした方法があります。

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

//新しい税金を作成するには

use Drupal\taxonomy\Entity\Term;

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

0

別のアプローチは、次のように、作成後にノードを更新することです。

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

あまりにも初期にそれを試して、それがクラッシュしました。出力を上部に追加します。
エターナルブラック

オーケー-そうTARGET_IDしてみてください
レミー

残念ながら同じ結果/エラーメッセージ。:(
エターナルブラック

次に、作成後にフィールドを更新します(保存)-回答を更新しました。キーtarget_idでネストされた配列を試しましたか?
レミー

うん、[リンク[(ここと、残念ながら同じエラーがそれを試してみましたdrupal.stackexchange.com/questions/217396/...
永遠の黒
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.