Lấy đối tượng nút trong hook_form_FORM_ID_alter


13

Theo dõi câu hỏi này nhưng tôi không đủ uy tín để yêu cầu làm rõ trong một bình luận.

Tôi đang chuyển một mô-đun đã đóng góp cho Drupal 8. Mã có đường trên CR và bài viết đã đề cập ở trên không hoạt động:

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

Không có gì được tải vào biến nút $.

IDE PHPStorm của tôi đưa ra cảnh báo cho getEntity (): Không tìm thấy phương thức 'getEntity' trong lớp Drupal \ Core \ Form \ FormInterface ít hơn ... Không tìm thấy phương thức tham chiếu trong lớp chủ đề.

Nó cũng không trình bày phương pháp này để hoàn thành mã.

Trong nguyên nhân sử dụng tôi đang tham khảo:

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

Câu trả lời:


13

PhpStorm không biết là loại đối tượng biểu mẫu là động nhưng nó vẫn ổn.

Nếu bạn muốn làm cho nó hạnh phúc, hãy bọc nó trong một điều kiện như:

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

Dù bằng cách nào, nó chắc chắn sẽ hoạt động nếu bạn thực hiện thay đổi hình thức chính xác. Nếu bạn không, bạn sẽ gặp phải một lỗi nghiêm trọng không chỉ là không có đối tượng nút.

Bạn cần chia sẻ mã chính xác của mình nếu bạn muốn có câu trả lời cụ thể hơn, đó là tất cả những gì tôi có thể nói với bạn.


Cảm ơn Berdir. Tôi không biết nút $ không phải là đối tượng nút như trong D7. Vì vậy, $ node-> nid không hoạt động, nhưng $ node-> Id () thì có.
Bundio

7

Mặc dù câu trả lời đúng đã được chọn, tôi cảm thấy cần phải giải thích một số điều:

  • Phương pháp getFormObject()này chỉ có sẵn trên các hình thức loại EntityForm.
  • Nếu bạn đang làm hook_form_node_form_alter(), bạn biết rằng biểu mẫu luôn là một hình thức nút, vì vậy bạn an toàn khi gọi getEntity()đối tượng biểu mẫu.
  • Tuy nhiên, nếu bạn đang thực hiện một hook_form_alter()hook chung , bạn có thể muốn kiểm tra chính xác $form_idhoặc kiểm tra xem đối tượng biểu mẫu thực sự là một NodeFormhoặc một EntityForm. Điều này sẽ ngăn lỗi PHP nếu biểu mẫu không phải là biểu mẫu thực thể / nút.
  • Đối với IDE và hoàn thành mã của bạn, bạn có thể nói với IDE của bạn rằng $form_objectbạn đang xử lý là một NodeFormhoặc một EntityForm. Điều này sẽ làm cho nó hiển thị gợi ý phù hợp hơn.
/** @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
tốt nhất của tất cả, cảm ơn đã làm rõ!
Dazag

2

Để IDE của bạn biết loại biến là gì và loại nào có sẵn, bạn cần nhập gợi ý các biến của mình.

Gợi ý loại là loại biến được thêm vào trước tên biến tham số (trong ví dụ dưới đây arrayFormStateInterFace).

Thí dụ:

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

Để gửi hook, bạn nên sử dụng Drupal\Core\Form\FormStateInterfaceloại ... do đó ở đầu tệp đảm bảo bạn sử dụng lớp đó use Drupal\Core\Form\FormStateInterface;.

Các tiêu chuẩn mã hóa Drupal nói rằng bạn nên gõ cast cũng như giải thích loại trong docblock. Những nỗ lực thêm giúp trong tương lai. ;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.