Secara terprogram memperbarui nilai bidang


14

Saya ingin memperbarui nilai bidang simpul ketika sebuah simpul diperbarui.

Mencoba menggunakan kode yang disebutkan di sini Secara terprogram memperbarui simpul 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();
      }
    }

tapi itu tidak berhasil. Saya mendapatkan 500 kesalahan setelah menyimpan node. Saya juga mencoba mengeluarkan pernyataan if dan menentukan id node$node = Node::load(1);

Saya juga mencoba menggunakan Perbarui node / Entitas secara pemrograman di 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();

}

tapi tidak berhasil juga.

Selain itu, saya mencoba menggunakan kait yang berbeda dengan entitas_presave, entitas_update, node_update, tetapi tidak membuat perbedaan.

Jawaban:


25

Anda dapat mencoba kode ini:

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

Terima kasih ini berhasil, jika orang lain ingin menambahkan variasi lain yang mungkin, silakan tambahkan jawaban lain.
No Sssweat

1
@NoSssweat: apakah saya benar dengan asumsi bahwa baris dengan "tubuh" dalam kode yang ditunjukkan dalam jawaban ini tidak benar-benar diperlukan untuk menjawab pertanyaan Anda? Dan bahwa baris ini lebih menggambarkan bagaimana Anda dapat melakukan hal serupa dengan (misalnya) tubuh? Selain itu, karena pertanyaan Anda adalah tentang "bidang", dapatkah Anda menggunakan baris yang mirip dengan baris dengan "badan" untuk bidang khusus, dengan nama mesin (misalnya) field_my_extra_field? Maaf untuk apa yang tampaknya membajak jawaban untuk mengajukan pertanyaan baru, tetapi hanya "menunjukkan kode" dalam jawaban (tanpa penjelasan sama sekali) juga tidak dianggap sebagai praktik yang baik di sekitar sini, bukan?
Pierre.Vriens

1
@ Pierre.Vriens Saya menggunakan judul pada Q saya untuk kesederhanaan. Saya pikir jika saya tahu cara mengubah judul, itu akan sama untuk bidang apa pun, cukup ganti nama mesin. Ternyata jawaban ini menggunakan metode khusus untuk mengubah judul, yang tidak akan bekerja untuk bidang lain, jadi sebenarnya penting bahwa ia menunjukkan metode untuk tubuh.
No Sssweat

Saya tidak bisa mendapatkan kait ini ke api. Saya mengedit tipe konten, klik kirim, tetapi tidak ada.
Tuan Pablo

7

Ini adalah variasi lain dengan menggunakan pengait yang Anda coba gunakan semula.

Saya pikir masalah dengan kode Anda adalah bahwa Anda mencoba memuat instance baru dari node, tetapi Anda harus menggunakan node yang disediakan sebagai 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)
  }
}

Edit:

Menambahkan pernyataan penggunaan ke kode.


1
baru saja mencoba kode Anda, tetapi ini melanggar situs, mendapatkan yang klasikThe website encountered an unexpected error. Please try again later.
No Sssweat

1
Kode ini hanya untuk menunjukkan cara menggunakan kail. Anda membutuhkan pernyataan penggunaan yang benar. Anda dapat mengetahui hal ini, jika Anda melihat di pengawas (/ admin / laporan / dblog).
4k4

1
menambahkan use Drupal\node\NodeInterface;kode tidak lagi merusak situs secara otomatis, tetapi setelah menyimpan node, saya mendapatkan 500 error seperti yang saya dapatkan di pertanyaan saya dan log tidak mencatat apa-apa tentang hal itu.
No Sssweat

1
Saya hanya ingin menunjukkan masalah: Jangan memuat instance baru dari node, tetapi gunakan yang disediakan sebagai parameter fungsi. Apa kesalahan di balik 500? Silakan periksa file log Anda atau aktifkan kesalahan log.
4k4

1
Saya menghapus log, jadi saya tidak bingung dengan semua kesalahan sebelumnya, tetapi setelah menyimpan dan mendapatkan kesalahan beberapa kali file log kosong
No Sssweat

3

Judul dalam Drupal 8 tidak disetel seperti bidang standar; mereka memiliki fungsi mereka sendiri. Gunakan $node->setTitle('New Title');untuk simpul atau $entity->setLabel('New Title');entitas generik. Lihat Node :: setTitle untuk info lebih lanjut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.