Отримання об'єкта вузла в moll_form_FORM_ID_alter


13

Слідкуйте за цим питанням, але мені не вистачає репутації, щоб просити роз'яснення в коментарі.

Я пересилаю внесений модуль в Drupal 8. Код, що перебуває на екрані, у вищезгаданому CR та post не працює:

$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) {
  ...
}

Так чи інакше, це обов'язково має спрацювати, якщо ви реалізуєте правильну зміну форми. Якщо цього не зробити, вам доведеться виявити фатальну помилку не просто без об'єкта вузла.

Якщо вам потрібна більш конкретна відповідь, вам потрібно поділитися своїм точним кодом, це все, що я можу вам сказати.


Дякую Бердіру. Мені не було відомо, що $ node не є об'єктом вузла, як у D7. Отже, $ node-> nid не працює, але $ node-> Id () робить.
Бундіо

7

Хоча правильну відповідь було обрано, я вважаю, що потрібно пояснити деякі речі:

  • Метод getFormObject()доступний лише у формах типу EntityForm.
  • Якщо ви робите hook_form_node_form_alter(), ви знаєте, що форма - це завжди форма вузла, тому ви безпечно дзвоните getEntity()на об’єкт форми.
  • Однак, якщо ви робите загальний hook_form_alter()гачок, ви можете перевірити правильність $form_idабо перевірити, чи об'єктом форми є насправді а NodeFormчи an 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
найкраще з усіх, дякую за роз’яснення!
Дазаг

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 зазначено, що слід вводити cast, а також пояснювати тип у docblock. Додаткові зусилля допомагають у майбутньому. ;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.