รับวัตถุโหนดใน hook_form_FORM_ID_alter


13

ติดตามคำถามนี้ แต่ฉันไม่มีชื่อเสียงพอที่จะขอคำชี้แจงในความคิดเห็น

ฉันกำลังย้ายโมดูลที่สนับสนุนไปยัง Drupal 8 รหัสที่ถูก sugested ใน CR ที่กล่าวถึงข้างต้นและโพสต์ไม่ทำงาน:

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

ไม่มีการโหลดอะไรลงในตัวแปร $ node

PHPStorm IDE ของฉันให้คำเตือนสำหรับ getEntity (): วิธีการ 'getEntity' ไม่พบในคลาส Drupal \ Core \ Form \ FormInterface น้อยลง ... ไม่พบวิธีการอ้างอิงในคลาสหัวเรื่อง

นอกจากนี้ยังไม่ได้นำเสนอวิธีนี้สำหรับการทำให้โค้ดสมบูรณ์

ในการใช้งานทำให้ฉันอ้างอิง:

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

คำตอบ:


13

PhpStorm ไม่ทราบว่าชนิดของวัตถุรูปแบบเป็นแบบไดนามิก แต่ก็ใช้ได้

หากคุณต้องการทำให้มันมีความสุขห่อในสภาพเช่น:

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

ไม่ว่าจะด้วยวิธีใดมันควรจะทำงานอย่างแน่นอนหากคุณใช้การแก้ไขแบบฟอร์มที่ถูกต้อง ถ้าคุณทำไม่ได้คุณควรจบลงด้วยข้อผิดพลาดร้ายแรงไม่เพียง แต่ไม่มีวัตถุโหนด

คุณต้องแชร์รหัสที่ถูกต้องหากคุณต้องการคำตอบที่เฉพาะเจาะจงยิ่งขึ้นนั่นคือทั้งหมดที่ฉันสามารถบอกคุณได้


ขอบคุณ Berdir ฉันไม่ทราบว่า $ node ไม่ใช่วัตถุของโหนดเหมือนใน D7 ดังนั้น $ node-> nid ไม่ทำงาน แต่ $ node-> Id () ทำ
Bundio

7

แม้ว่าจะได้รับคำตอบที่ถูกต้องแล้ว แต่ฉันรู้สึกว่าจำเป็นต้องอธิบายบางสิ่ง:

  • วิธีgetFormObject()นี้ใช้ได้เฉพาะกับรูปแบบประเภทEntityFormเท่านั้น
  • ถ้าคุณทำhook_form_node_form_alter()คุณรู้ว่าฟอร์มนั้นเป็นฟอร์มโหนดเสมอดังนั้นคุณจึงสามารถโทรหาgetEntity()วัตถุฟอร์มได้อย่างปลอดภัย
  • แต่ถ้าคุณกำลังทำทั่วไปhook_form_alter()เบ็ดคุณอาจต้องการตรวจสอบที่ถูกต้อง$form_idหรือตรวจสอบว่าวัตถุรูปแบบเป็นจริงหรือNodeForm EntityFormสิ่งนี้จะป้องกันข้อผิดพลาด PHP ถ้าแบบฟอร์มไม่ใช่แบบฟอร์มเอนทิตี้ / โหนด
  • ในฐานะที่เป็น IDE และจบรหัสของคุณคุณสามารถบอกคุณ IDE ว่า$form_objectคุณจัดการกับเป็นหรือNodeForm EntityFormสิ่งนี้จะทำให้มันแสดงคำแนะนำที่เหมาะสมยิ่งขึ้น
/** @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.
}

1
ดีที่สุดของพวกเขาทั้งหมดขอบคุณสำหรับการชี้แจง!
Dazag

2

เพื่อให้ IDE ของคุณทราบว่าชนิดของตัวแปรคืออะไรและมีให้ใช้งานอะไรคุณต้องพิมพ์คำใบ้ตัวแปรของคุณ

คำใบ้ประเภทคือประเภทตัวแปรที่เพิ่มก่อนชื่อตัวแปรพารามิเตอร์ (ในตัวอย่างด้านล่างarrayและFormStateInterFace)

ตัวอย่าง:

/**
 * 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...
}

สำหรับการส่ง hooks คุณควรใช้Drupal\Core\Form\FormStateInterfaceประเภท ... ดังนั้นที่ด้านบนของไฟล์ให้แน่ใจว่าคุณใช้คลาสuse Drupal\Core\Form\FormStateInterface;นั้น

มาตรฐานการเข้ารหัสของ Drupal ระบุว่าคุณควรพิมพ์ cast และอธิบายชนิดใน docblock ความพยายามพิเศษช่วยในอนาคต ;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.