Получение объекта узла в hook_form_FORM_ID_alter

13

Ответьте на этот вопрос, но у меня недостаточно репутации, чтобы попросить пояснения в комментарии.

Я портирую предоставленный модуль на Drupal 8. Sugested код на вышеупомянутом CR и пост не работает:

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

Ничего не загружается в переменную $ node.

Моя среда разработки PHPStorm выдает предупреждение для getEntity (): метод 'getEntity' не найден в классе Drupal \ Core \ Form \ FormInterface less ... Ссылочный метод не найден в предметном классе.

Также не представлен этот метод для завершения кода.

В причине использования я ссылаюсь:

use Drupal\Core\Entity;
use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Entity\Node;
use Drupal\Core\Render\Element;
Bundio
источник

Ответы:

13

PhpStorm не знает, так как тип объекта формы является динамическим, но это нормально.

Если вы хотите сделать его счастливым, заверните его в такое состояние:

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

В любом случае, это должно определенно работать, если вы реализуете правильное изменение формы. Если вы этого не сделаете, вы должны получить фатальную ошибку не только без объекта узла.

Вам нужно поделиться своим точным кодом, если вы хотите более конкретный ответ, это все, что я могу вам сказать.

Berdir
источник
Спасибо Бердир. Я не знал, что $ node не является объектом узла, как в D7. Таким образом, $ node-> nid не работает, но $ node-> Id () работает.
Бандио
7

Хотя правильный ответ был выбран, я чувствую, что есть необходимость объяснить некоторые вещи:

  • Метод getFormObject()доступен только на формах типа EntityForm.
  • Если вы это делаете hook_form_node_form_alter(), вы знаете, что форма всегда является формой узла, поэтому вы можете безопасно вызывать getEntity()объект формы.
  • Однако, если вы делаете общий hook_form_alter()хук, вы можете проверить правильность $form_idили проверить, является ли объект формы на самом деле NodeFormили EntityForm. Это предотвратит ошибки PHP, если форма не является формой сущности / узла.
  • Что касается вашей IDE и дополнения кода, вы можете сообщить своей IDE, что $form_objectвы имеете дело с a NodeFormили a 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.
}
Jigarius
источник
1
лучший из всех, спасибо за разъяснения!
Дазаг
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...
}

Для перехвата отправки вы должны использовать Drupal\Core\Form\FormStateInterfaceтип ... поэтому в верхней части файла убедитесь, что вы используете этот класс use Drupal\Core\Form\FormStateInterface;.

Стандарты кодирования Drupal гласят, что вы должны набирать приведение и объяснять тип в блоке документации. Дополнительные усилия помогают в будущем. ;)

Себ
источник