プログラムでフィールドの値を更新する


14

ノードが更新されたときに、ノードフィールドの値を更新したい。

ここで言及したコードを使用して、ノードDrupal 8をプログラムで更新してみました

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

しかし、うまくいきませんでした。ノードの保存後に500エラーが表示されます。また、ifステートメントを取り出してノードIDを指定してみました$node = Node::load(1);

Drupal 8でプログラムでノード/エンティティ更新することも試しました

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

しかし、運もありません。

また、異なるフックentity_presave、entity_update、node_updateを使用してみましたが、違いはありませんでした。

回答:


25

このコードを試すことができます:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}

これがうまくいったおかげで、他の誰かが他の可能なバリエーションを追加したい場合は、別の答えを自由に追加してください。
いいえSssweat

1
@NoSssweat:この答えに示されているコード内の「body」を含む行は、あなたの質問に答えるために本当に必要ではないと仮定するのは正しいですか?そして、この行は、あなたが(例えば)身体で同様のことをする方法をむしろ示していますか?また、あなたの質問は「フィールド」に関するものであるため、マシン名(たとえば)field_my_extra_fieldを使用して、カスタムフィールドの「body」を含む行と同様の行を使用できますか?新しい質問をするために答えをハイジャックしているように見えるのは申し訳ありませんが、答えに「コードを表示する」だけで(説明はまったくありません)、ここでも適切なプラクティスとして認識されていませんか?
-Pierre.Vriens

1
@ Pierre.Vriens簡単にするために、Qでタイトルを使用しました。タイトルを変更する方法を知っていれば、どのフィールドでも同じで、マシン名を変更するだけだと思いました。この回答では、特定の方法を使用してタイトルを変更していますが、これは他のフィールドでは機能しないため、実際には身体の方法を示すことが重要です。
いいえSssweat

このフックを発射することはできません。コンテンツタイプを編集して[送信]をクリックしますが、何もしません。
パブロ氏

7

これは、最初に使用しようとしたフックを使用する別のバリ​​エーションです。

コードの問題は、ノードの新しいインスタンスをロードしようとすることですが、paramaterとして提供されるノードを使用する必要があると思います$entity

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

編集:

コードにuseステートメントを追加しました。


1
ちょうどあなたのコードを試してみましたが、それは古典を取得し、サイトを壊すだThe website encountered an unexpected error. Please try again later.
ノーSssweat

1
このコードは、フックの使用方法を示すためのものです。適切な使用ステートメントが必要です。ウォッチドッグ(/ admin / reports / dblog)を調べると、これを見つけることができます。
4k4

1
use Drupal\node\NodeInterface;コードを追加してもサイトが自動的に破損することはなくなりましたが、ノードを保存した後、質問に出ていたように500エラーが表示され、ログには何も記録されていません。
いいえSssweat

1
問題を指摘したかっただけです。ノードの新しいインスタンスをロードせず、関数パラメーターとして提供されているものを使用します。500の背後にあるエラーは何ですか?ログファイルを確認するか、エラーログを有効にしてください。
4k4

1
私は他のすべての以前のエラーと混同されませんが、エラーを保存し、取得した後、複数回のように、私は、ログをクリアファイルが空のログ
ノーSssweat

3

Drupal 8のタイトルは、標準フィールドのように設定されていません。それらには独自の機能があります。$node->setTitle('New Title');ノードまたは$entity->setLabel('New Title');汎用エンティティに使用します。詳細については、Node :: setTitleを参照してください。

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