Abrufen des Knotenobjekts in hook_form_FORM_ID_alter

13

Befolgen Sie diese Frage, aber ich habe nicht genug Ruf, um in einem Kommentar Klarheit zu schaffen.

Ich portiere ein beigetragenes Modul auf Drupal 8. Der empfohlene Code für die oben genannte CR und den Post funktioniert nicht:

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

In die $ node-Variable wird nichts geladen.

Meine PHPStorm-IDE gibt eine Warnung für getEntity () aus: Methode 'getEntity' nicht in Klasse gefunden Drupal \ Core \ Form \ FormInterface weniger ... Die referenzierte Methode wurde in der Subjektklasse nicht gefunden.

Diese Methode wird auch nicht für die Code-Vervollständigung vorgestellt.

In der Verwendungsursache beziehe ich mich auf:

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

Antworten:

13

PhpStorm weiß nicht, wie dynamisch der Typ des Formularobjekts ist, aber es ist in Ordnung.

Wenn Sie es glücklich machen möchten, wickeln Sie es in einem Zustand wie:

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

In jedem Fall sollte es auf jeden Fall funktionieren, wenn Sie die richtige Formularänderung implementieren. Wenn Sie dies nicht tun, sollte nicht nur ohne Knotenobjekt ein schwerwiegender Fehler auftreten.

Sie müssen Ihren genauen Code mitteilen, wenn Sie eine spezifischere Antwort wünschen, das ist alles, was ich Ihnen sagen kann.

Berdir
quelle
Danke Berdir. Mir war nicht bewusst, dass $ node nicht das Knotenobjekt wie in D7 ist. Also funktioniert $ node-> nid nicht, aber $ node-> Id ().
Bundio
7

Obwohl die richtige Antwort gewählt wurde, muss meines Erachtens einiges erklärt werden:

  • Die Methode getFormObject()ist nur für Formulartypen verfügbar EntityForm.
  • Wenn Sie dies tun hook_form_node_form_alter(), wissen Sie, dass das Formular immer ein Knotenformular ist, sodass Sie getEntity()das Formularobjekt sicher aufrufen können .
  • Wenn Sie jedoch einen allgemeinen hook_form_alter()Hook ausführen, möchten Sie möglicherweise $form_idüberprüfen, ob das Formularobjekt tatsächlich ein NodeFormoder ein ist EntityForm. Dies verhindert PHP-Fehler, wenn das Formular kein Entity / Node-Formular ist.
  • In Bezug auf Ihre IDE und die Code-Vervollständigung können Sie Ihrer IDE mitteilen, dass $form_objectes sich um ein NodeFormoder ein handelt EntityForm. Dadurch werden geeignetere Hinweise angezeigt.
/** @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
quelle
1
das beste von allen, danke für die aufklärung!
Dazag
2

Damit Ihre IDE weiß, was der Variablentyp ist und was ihm zur Verfügung steht, müssen Sie einen Hinweis auf Ihre Variablen eingeben.

Der Typhinweis ist der Variablentyp, der vor dem Namen der Parametervariable hinzugefügt wird (im folgenden Beispiel arrayund FormStateInterFace).

Beispiel:

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

Für Submit-Hooks sollten Sie den Drupal\Core\Form\FormStateInterfaceTyp ... verwenden. Stellen Sie daher oben in der Datei sicher, dass Sie diese Klasse verwenden use Drupal\Core\Form\FormStateInterface;.

Drupal-Codierungsstandards besagen, dass Sie cast eingeben und den Typ im docblock erläutern sollten. Der Mehraufwand hilft in Zukunft. ;)

Seb
quelle