Nous venons de commencer avec Drupal 8 et très rapidement nous avons rencontré notre premier problème.
Comment modifier un formulaire existant dans Drupal 8?
Nous devons modifier la méthode d'enregistrement du formulaire de nœud pour effectuer une redirection vers une autre page. Nous voulons modifier la forme du nœud pour devenir quelque chose comme une forme à plusieurs étapes. Une fois que l'utilisateur a créé un nouveau contenu, il est redirigé vers un nouveau formulaire (que nous avons créé) pour obtenir plus d'informations.
Nous avons résolu notre problème de mise en œuvre hook_entity_type_alter()
.
function mymodule_entity_type_alter(&$entity_info) {
$handlers = $entity_info['node']->get('handlers');
$handlers['form']['default'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$handlers['form']['edit'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$entity_info['node']->set('handlers', $handlers);
}
Nous avons ensuite créé une nouvelle classe de formulaire qui étend la forme du nœud et modifie la méthode de sauvegarde.
class MyExtendedNodeForm extends NodeForm {
public function save(array $form, FormStateInterface $form_state) {
parent::save($form, $form_state);
$node = $this->entity;
$form_state->setRedirect('entity.regions.add_form', ['nid' => $node->id()]);
}
}
Cela fonctionne parfaitement, mais est-ce bien? Si un autre module fait de même, notre code n'est plus exécuté.
hook_form_alter()
. Si vous avez juste besoin de rediriger le formulaire, il suffit d'ajouter un gestionnaire de soumission de formulaire qui effectue la redirection.save()
méthode » en fait des moyens. Cela signifie-t-il changer la façon dont les données sont enregistrées, ou simplement faire une redirection? Dans le premier cas, la réponse est plus complexe.Réponses:
J'ai dû faire exactement la même chose hier, et je suis toujours à la recherche d'un moyen plus Drupal 8 pour le faire, mais je ne l'ai pas trouvé. J'ai fini par le faire de cette façon:
Je suis toujours très intéressé à le faire d'une manière différente, mon module avait l'air si propre sans le fichier .module :).
la source
J'utilise Drupal 8.1.1 et essayais de rediriger les utilisateurs après avoir modifié leur compte, c'est-à-dire en cliquant sur le bouton Enregistrer sur la page / user / edit. J'ai d'abord essayé ceci:
Bien que cela fonctionne pour le
user_login_form
, cela ne fonctionnerait pas pouruser_form
. Caruser_form
je devais utiliserJ'espère que cela aide ceux qui tombent sur le même problème!
la source
Eh bien, je voulais modifier le
site_information_settings
formulaire pour ajouter des champs.Comme vous, j'avais le choix entre
hook_form_alter
(ouhook_form_FORM_ID_alter
)Je voulais faire de la POO, alors j'ai commencé à écrire un service d'abonné de route en modifiant l' attribut de la
system.site_information_settings
route_form
.Ensuite, dans ma nouvelle classe étendant le
SiteInformationForm
, après que les champs et leurs validateurs ont été ajoutés et la fonction de soumission étendue, je me suis senti exactement de la même manière que vous ... Maintenant, que se passe-t-il si un autre module réécrit également l'itinéraire du formulaire pour utiliser sa propre classe?Retour au début, j'avais le choix entre deux options ... semble avoir choisi la mauvaise.
hook_form_alter
/hook_form_FORM_ID_alter
semble être le meilleur moyen de modifier un formulaire existant.la source
Cela ressemble à ce que vous voulez faire, ce n'est pas vraiment pour modifier la méthode de sauvegarde, mais pour changer la redirection lorsqu'un nœud est enregistré.
Dans cette situation, faire un peu comme Drupal 7,
hook_form_alter
avec un gestionnaire de soumission personnalisé (sur le formulaire ou le bouton, selon le formulaire et les exigences) serait une bonne solution.Ce que vous décrivez dans la question fonctionne également, mais j'éviterais d'écraser la classe de base, sauf si je veux réellement changer quelque chose dans la classe.
De toute façon, la méthode de sauvegarde n'est utilisée que comme gestionnaire de soumission, il n'est donc pas très logique d'écraser simplement pour ajouter une redirection.
la source
Je pense que la meilleure méthode consiste à utiliser toujours l'un des crochets de la famille form_alter, à joindre un gestionnaire de soumission et à l'intérieur de celui-ci, définissez votre redirection.
Contribuer à étendre les classes de base pour ce faire est velu à mon avis. D'autant plus qu'aucune fonction ne change, juste rediriger.
la source
Vous pouvez créer un nouvel EventSubscriber qui écoute l'événement KernelEvents :: REQUEST, puis réagir lorsque vous soumettez un formulaire de nœud, quelque chose comme ceci
Quoi qu'il en soit, la méthode hook_form_alter fonctionne bien.
la source
Ce que j'ai trouvé jusqu'à présent: implémenter un formulaire alter hook et essayer de modifier les gestionnaires de validation / soumission dans le formulaire alter hook lui-même ne fonctionne que si vous modifiez les gestionnaires $ form ['# validate] / $ form [#submit']. (appeler les fonctions form_state pour cela ne fonctionnera pas sous la forme alter hook elle-même)
Mais lorsque vous essayez ceci dans un gestionnaire de validation, cela a tendance à fonctionner:
Cela est dû au fait que le formulaire a maintenant été entièrement construit, pas le cas dans le formulaire alter hook lui-même.
L'idée est la suivante: vous pouvez ajouter un gestionnaire de validation comme dernier, évaluer d'autres gestionnaires qui existent pour la soumission et les modifier directement.
Si vous souhaitez également modifier les gestionnaires de validation, assurez-vous que le vôtre s'exécute avant tout autre et modifiez ce que vous voulez dans le gestionnaire de validation.
Toujours à la recherche d'un meilleur moyen moi-même, je dois toujours remplacer les gestionnaires de validation / soumission pour le formulaire d'inscription d'utilisateur. Mais d'autres modules pourraient exister qui cassent la mise en œuvre de mes modules. Donc, mon module devrait pouvoir vérifier ces derniers, et c'est possible de cette façon. Je me demande si une forme d'entité après la fonction de construction existe pour y parvenir. (quelque chose qui s'exécute lorsque le formulaire est rempli et est sur le point d'être livré) (ce n'est pas trop compliqué pour ce cas simple)
Il n'est pas possible de contourner la redirection de la méthode save (), mais la désactivation de save () se fait de cette façon (+ implémentez la vôtre). Certes, une classe est plus agréable et offre un accès plus facile aux objets / etc, mais remplacer une classe principale entraîne en effet des problèmes lorsque d'autres modules souhaitent les utiliser. Ce n'est pas le cas si vous utilisez ce code.
la source
Après avoir vérifié ce problème, voici ce que j'ai trouvé qui devrait convenir à votre cas:
la source