drupal 8の複数値フィールドの値をプログラムで設定する方法


8

Drupal 8で投票の選択肢をプログラムで保存していました。Drupal8の投票選択肢モジュールを使用しました。

$node_poll = Poll::load($pollid);
//print_r($node_poll);exit;
$i = array(13,14,15);
foreach($i as $key => $value){
  $node_poll->choice->setValue(
        [
            ['target_id' => $value]
        ]
  );
// But I want to save multiple target ids. now this is saving 15 all the time.

}
$node_poll->question->setValue([
  'value' => 'test',
]);
$node_poll->save();

次のスニペットは正常に動作しています。

$node_poll->choice->setValue(
        [
            ['target_id' => 13]
       ],
       [
            ['target_id' => 14]
       ],
        [
            ['target_id' => 15]
       ]
    );

ターゲットIDを動的に保存するにはどうすればよいですか?


1
いくつかの質問を整理しました。確認して、すべてが正しいことを確認できますか?
Stefanos Petrakis

はい、しかし私はそれについての答えが必要です。助けていただけませんか?Drupal 7では配列は正常に機能していました。つまり、配列のパス値は機能しますが、drupal 8では配列の値を渡しても機能しません。
harsh_behl_0007 2016

こんにちは@harsh、私はあなたが別の答えを正しいものとして選んだのを見ました。その理由についてフィードバックをいただけますか?コメント?とても役に立ちます。
Stefanos Petrakis 16

回答:


16

このようにコードを書き直します。
注意:これは元の回答の編集されたバージョンであり、コメントから得られるいくつかの役立つポイントに従っています。

$poll = Poll::load($pollid);

$poll->question->setValue(['value' => 'test']);

$target_ids = array(13,14,15);
foreach($target_ids as $target_id){
  $poll->choice->appendItem($target_id);
}
$poll->save();

これでうまくいきますように!


1
助けてくれてありがとう。私はdrupal8の初心者です。私の時間を節約してくれてありがとう。
harsh_behl_0007

1
どういたしまして。やってみましたか?その場合は、回答も受け入れる必要があります。そうでない場合は、私に知らせてください。これをさらに調べることができます。
Stefanos Petrakis

1
2つの注記:変数としての$ node_pollは意味がありません。D8のポーリングはノードではありません。次に、直接$ poll-> choice-> appendItem(13);を呼び出すこともできます。ループ内など、はるかに簡単です。
Berdir

5

配列のような複数値フィールドを操作できます。フィールドインターフェイスはこれを変換してデータベースに格納します。それをさらに単純化するには:

$target_ids = array(13,14,15);
$node_poll = Poll::load($pollid);
foreach($target_ids as $target_id) {
  $node_poll->choice[] = $target_id;
}
$node_poll->question->value = 'test';
$node_poll->save();

これにより、IDがフィールドに追加され、既存のIDは上書きされません。これを行う場合は、最初に空の配列を設定できます。

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