web-dev-qa-db-ja.com

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

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

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

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

enter image description here

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

enter image description here

これにはすでに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、status、sticky、created)VALUES( :db_insert_placeholder_0、:db_insert_placeholder_1、:db_insert_placeholder_2、:db_insert_placeholder_3、:db_insert_placeholder_4) '、配列、配列)(行:81)Drupal\Core\Database\Driver\mysql\Connection-> query(' 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、Array)(Line:32)Drupal\Core\Database\Driver\mysql\Insert-> execute ()(行:371)Drupal\Core\Database\Query\Merge-> execute()(行:525)taxonomy_build_node_index(Object)(行:479)taxonomy_node_insert(Object)call_user_func_array( 'taxonomy_node_insert'、Array)(行: 402)Drupal\Core\Extension\ModuleHandler-> invokeAll( 'node_insert'、Array)(Line:167)Drupal\Core\Entity\EntityStorageBase-> inv okeHook( 'insert'、Object)(Line:418)Drupal\Core\Entity\ContentEntityStorageBase-> invokeHook( 'insert'、Object)(Line:470)Drupal\Core\Entity\EntityStorageBase-> doPostSave(Object、)(行:304)Drupal\Core\Entity\ContentEntityStorageBase-> doPostSave(Object、)(行:395)Drupal\Core\Entity\EntityStorageBase-> save(Object)(行:761)Drupal\Core\Entity\Sql\SqlContentEntityStorage -> save(オブジェクト)(行:364)Drupal\Core\Entity\Entity-> save()(行:46)Drupal\awo_importer\Controller\T3ImporterController-> import()call_user_func_array(Array、Array)(行:123 )Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> Drupal\Core\EventSubscriber {closure}()(Line:574)Drupal\Core\Render\Renderer-> executeInRenderContext(Object、Object)(Line:124)Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> wrapControllerExecutionInRenderContext(Array、Array)(Line:97)Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber-> Drupal\Core\EventSubscriber {c losure}()call_user_func_array(Object、Array)(Line:144)Symfony\Component\HttpKernel\HttpKernel-> handleRaw(Object、1)(Line:64)Symfony\Component\HttpKernel\HttpKernel-> handle(Object、1、 1)(行:57)Drupal\Core\StackMiddleware\Session-> handle(Object、1、1)(行:47)Drupal\Core\StackMiddleware\KernelPreHandle-> handle(Object、1、1)(行:98 )Drupal\page_cache\StackMiddleware\PageCache-> pass(Object、1、1)(Line:77)Drupal\page_cache\StackMiddleware\PageCache-> handle(Object、1、1)(Line:47)Drupal\Core\StackMiddleware\ReverseProxyMiddleware-> handle(Object、1、1)(Line:50)Drupal\Core\StackMiddleware\NegotiationMiddleware-> handle(Object、1、1)(Line:23)Stack\StackedHttpKernel-> handle(Object、1、 1)(行:628)Drupal\Core\DrupalKernel-> handle(Object)(行:19)

8
Eternal Black

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

'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();
8
oknate

Drupal 7では、パターン['tid' => NUMBER]を使用した分類基準参照フィールドが存在しました。これらはエンティティー参照フィールドです。 EntityReferenceItem にはプロパティ定義があります:target_idおよびentity。前者は、エンティティ参照アイテムの設定(基本的には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;

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

11
mradcliffe

ここに私が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();
4
Rachid Chihabi

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

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