web-dev-qa-db-fra.com

Obtention de l'objet nœud dans hook_form_FORM_ID_alter

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 post mentionné ci-dessus ne fonctionne pas:

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

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

Mon PHPStorm IDE 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;
13
Bundio

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.

13
Berdir

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 faites hook_form_node_form_alter(), vous savez que le formulaire est toujours un formulaire de noeud, vous pouvez donc appeler en toute sécurité getEntity() sur l'objet formulaire.
  • Cependant, si vous effectuez un hook général de hook_form_alter(), vous voudrez peut-être vérifier le bon $form_id ou vérifiez si l'objet de formulaire est bien un NodeForm ou un EntityForm. Cela évitera les erreurs PHP si le formulaire n'est pas un formulaire d'entité/de nœud.
  • Quant à votre IDE et complétion de code, vous pouvez dire à votre IDE que le $form_object vous avez affaire à un NodeForm ou 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.
}
7
Jigarius

Pour que votre IDE pour savoir quel est le type de variable et ce qui lui 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-dessous array 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\FormStateInterface type ... 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. ;)

2
Seb