hook_form_FORM_ID_alter에서 노드 객체 가져 오기


13

까지 따라 이 질문 그러나 나는 코멘트에 해명을 요구하기에 충분한 명성을 필요가 없습니다.

기여한 모듈을 Drupal 8로 포팅하고 있습니다. 위에서 언급 한 CR 및 게시물에서 제안 된 코드가 작동하지 않습니다.

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

$ node 변수에는 아무것도로드되지 않습니다.

내 PHPStorm IDE에서 getEntity ()에 대한 경고를 표시합니다. Drupal \ Core \ Form \ FormInterface 클래스에 'getEntity'메소드가 없습니다. 참조 된 메소드가 주제 클래스에 없습니다.

또한 코드 완성을 위해이 방법을 제시하지 않습니다.

사용 원인에서 나는 참조하고 있습니다 :

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경우 올바른지 확인하거나 양식 객체가 실제로 a NodeForm또는 a 인지 확인할 수 EntityForm있습니다. 이것은 폼이 엔티티 / 노드 폼이 아닌 경우 PHP 오류를 방지합니다.
  • IDE와 코드 완성에 관해서는, $form_object다루고있는 IDE 가 a NodeForm또는 a 임을 IDE에 알릴 수 있습니다 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가 변수 유형과 사용 가능한 변수를 알기 위해서는 변수에 힌트를 입력해야합니다.

유형 힌트는 매개 변수 변수 이름 앞에 추가 된 변수 유형입니다 (아래 예 arrayFormStateInterFace).

예:

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

제출 후크의 경우 Drupal\Core\Form\FormStateInterface유형 을 사용해야합니다 . 따라서 파일 맨 위에 해당 클래스를 사용해야합니다 use Drupal\Core\Form\FormStateInterface;.

Drupal 코딩 표준에 따르면 docblock에서 유형을 설명하고 유형을 설명해야합니다. 추가 노력은 미래에 도움이됩니다. ;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.