Obtention de l'objet nœud dans hook_form_FORM_ID_alter

13

Suivi de cette question mais je n'ai pas assez de réputation pour demander des éclaircissements dans un commentaire.

Je porte un module contribué à Drupal 8. Le code suggéré sur le CR et le message mentionnés ci-dessus ne fonctionne pas:

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

Rien n'est chargé dans la variable $ node.

Mon IDE PHPStorm donne un avertissement pour getEntity (): Méthode 'getEntity' introuvable dans la classe Drupal \ Core \ Form \ FormInterface less ... La méthode référencée n'est pas trouvée dans la classe sujet.

Il ne présente pas non plus cette méthode pour l'achèvement du code.

Dans la cause d'utilisation dont je parle:

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

Réponses:

13

PhpStorm ne sait pas car le type d'objet de formulaire est dynamique mais ça va.

Si vous voulez le rendre heureux, enveloppez-le dans un état comme:

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

Quoi qu'il en soit, cela devrait certainement fonctionner si vous implémentez le bon formulaire. Si vous ne le faites pas, vous devriez vous retrouver avec une erreur fatale non seulement sans objet nœud.

Vous devez partager votre code exact si vous voulez une réponse plus précise, c'est tout ce que je peux vous dire.

Berdir
la source
Merci Berdir. Je n'étais pas au courant que $ node n'est pas l'objet node comme dans D7. Donc $ node-> nid ne fonctionne pas, mais $ node-> Id () le fait.
Bundio
7

Bien que la bonne réponse ait été choisie, je pense qu'il est nécessaire d'expliquer certaines choses:

  • La méthode getFormObject()n'est disponible que sur les formulaires de type EntityForm.
  • Si vous le faites hook_form_node_form_alter(), vous savez que le formulaire est toujours un formulaire de nœud, vous pouvez donc appeler en toute sécurité getEntity()l'objet de formulaire.
  • Cependant, si vous effectuez un hook_form_alter()hook général , vous souhaiterez peut-être vérifier le bon $form_idou vérifier si l'objet de formulaire est réellement un NodeFormou un EntityForm. Cela évitera les erreurs PHP si le formulaire n'est pas un formulaire d'entité / de nœud.
  • En ce qui concerne votre IDE et l'achèvement du code, vous pouvez dire à votre IDE que $form_objectvous avez affaire à un NodeFormou à un EntityForm. Cela lui fera afficher des astuces plus appropriées.
/** @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
la source
1
le meilleur de tous, merci pour la clarification!
Dazag
2

Pour que votre IDE sache quel est le type de variable et ce qui est disponible, vous devez taper hint vos variables.

L'indicateur de type est le type de variable ajouté avant le nom de la variable de paramètre (dans l'exemple ci array- dessous et FormStateInterFace).

Exemple:

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

Pour soumettre des hooks, vous devez utiliser le Drupal\Core\Form\FormStateInterfacetype ... donc en haut du fichier assurez-vous d'utiliser cette classe use Drupal\Core\Form\FormStateInterface;.

Les normes de codage Drupal stipulent que vous devez taper cast et expliquer le type dans le docblock. L'effort supplémentaire aide à l'avenir. ;)

Seb
la source