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;
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.
Bien que la bonne réponse ait été choisie, je pense qu'il est nécessaire d'expliquer certaines choses:
getFormObject()
n'est disponible que sur les formulaires de type EntityForm
.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.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.$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.
}
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. ;)