Mendapatkan objek simpul di hook_form_FORM_ID_alter

13

Tindak lanjuti pertanyaan ini tetapi saya tidak memiliki reputasi yang cukup untuk meminta klarifikasi dalam komentar.

Saya porting modul kontribusi ke Drupal 8. Kode yang disarankan pada CR dan posting yang disebutkan di atas tidak berfungsi:

$node = $form_state->getFormObject()->getEntity();

Tidak ada yang dimuat ke variabel $ node.

IDE PHPStorm saya memberikan peringatan untuk getEntity (): Metode 'getEntity' tidak ditemukan di kelas Drupal \ Core \ Form \ FormInterface less ... Metode yang dirujuk tidak ditemukan di kelas subjek.

Juga tidak menghadirkan metode ini untuk penyelesaian kode.

Dalam penggunaannya saya referensi:

use Drupal\Core\Entity;
use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Entity\Node;
use Drupal\Core\Render\Element;
Bundio
sumber

Jawaban:

13

PhpStorm tidak tahu karena tipe objek form dinamis tetapi tidak apa-apa.

Jika Anda ingin membuatnya bahagia, bungkus dalam kondisi seperti:

if ($form_state->getFormObject() instanceof EntityForm) {
  ...
}

Either way, itu pasti akan berfungsi jika Anda menerapkan perubahan bentuk yang benar. Jika tidak, Anda harus berakhir dengan kesalahan fatal bukan hanya tanpa objek simpul.

Anda perlu membagikan kode persis Anda jika Anda menginginkan jawaban yang lebih spesifik, hanya itu yang bisa saya sampaikan.

Berdir
sumber
Terima kasih Berdir. Saya tidak sadar $ node bukan objek simpul seperti di D7. Jadi $ node-> nid tidak berfungsi, tetapi $ node-> Id () tidak.
Bundio
7

Meskipun jawaban yang benar telah dipilih, saya merasa perlu menjelaskan beberapa hal:

  • Metode getFormObject()ini hanya tersedia pada bentuk tipe EntityForm.
  • Jika Anda melakukannya hook_form_node_form_alter(), Anda tahu bahwa formulir selalu merupakan bentuk simpul, jadi Anda aman memanggil getEntity()objek formulir.
  • Namun, jika Anda melakukan hook_form_alter()pengait umum , Anda mungkin ingin memeriksa yang benar $form_idatau memeriksa apakah objek bentuk sebenarnya a NodeFormatau a EntityForm. Ini akan mencegah kesalahan PHP jika formulir itu bukan bentuk entitas / simpul.
  • Sedangkan untuk penyelesaian kode dan IDE Anda, Anda dapat memberi tahu IDE Anda bahwa $form_objectAnda sedang berurusan dengan a NodeFormatau a EntityForm. Ini akan membuatnya menunjukkan petunjuk yang lebih tepat.
/** @var \Drupal\Core\Entity\EntityForm $form_object */
$form_object = $form_state->getFormObject();
if ($form_object instanceof EntityForm) {
  $entity = $form_object->getEntity();
  // Do something with the entity.
}
Jigarius
sumber
1
terbaik dari semuanya, terima kasih atas klarifikasi!
Dazag
2

Agar IDE Anda tahu apa jenis variabelnya dan apa yang tersedia untuknya, Anda perlu mengetikkan petunjuk variabel Anda.

Petunjuk tipe adalah tipe variabel yang ditambahkan sebelum nama variabel parameter (dalam contoh di bawah arraydan FormStateInterFace).

Contoh:

/**
 * On form submit, do something.
 *
 * @param array
 *   The form array.
 *
 * @param \Drupal\Core\Form\FormStateInterface
 *   The form state array.
 */
function _submit_hook_name(array $form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject();
  // Do something...
}

Untuk mengirim kait, Anda harus menggunakan Drupal\Core\Form\FormStateInterfacetipe ... karena itu di bagian atas file pastikan Anda menggunakan kelas itu use Drupal\Core\Form\FormStateInterface;.

Standar pengkodean Drupal menyatakan bahwa Anda harus mengetikkan pemeran serta menjelaskan jenis dalam docblock. Upaya ekstra membantu di masa depan. ;)

Seb
sumber