J'ai une forme fortement thématique à intégrer, dont la structure est illustrée ci-dessous. Je suis à peu près là pour la plupart à l'exception de la soumission.
<form action="#">
<fieldset>
<legend>Authentification</legend>
<label for="email">Courriel*</label>
<input type="text" name="email" id="email">
<label for="password">Mot de passe*</label>
<input type="password" name="password" id="password" class="last">
<a href="#" title="Mot de passe oublié?" class="clearfix">Forgot password?</a>
<button type="submit" class="clearfix"><span>Login</span></button>
</fieldset>
</form>
J'ai essayé de nombreuses combinaisons différentes, il s'avère que button_type n'a aucun effet sur le noyau. J'ai donc utilisé ce hack , en espérant qu'il résoudrait mon problème. Hélas, cela ne change que l'attribut 'type' (évidemment), et non l'élément lui-même. Le type de bouton peut contenir d'autres éléments, dans ce cas, l'étendue est nécessaire pour contenir une image d'arrière-plan, elle doit être dans une étendue pour s'étirer car le texte du bouton est dynamique.
Quelqu'un a-t-il une idée de la façon dont je peux générer la ligne de balisage suivante à l'aide de l'API de formulaire?
<button type="submit" class="clearfix"><span>Login</span></button>
<botton type="submit">
, voir drupal.org/node/1671190Réponses:
En D7, je recommanderais:
De cette façon, vous pouvez remplacer le #markup dans une fonction alter plus tard si nécessaire, sans avoir à reconstruire le bouton HTML.
la source
En outre, juste au cas où quelqu'un rencontrerait le même problème que moi - lors de l'utilisation de
#markup
ou#prefix
/#suffix
trick sur leactions
groupe d' un formulaire , la fonction de rappel de soumission ne sera pas appelée du tout , sauf si unsubmit
élément type est présent. Ma solution de contournement était la suivante:De cette façon, vous pouvez utiliser du code HTML personnalisé pour soumettre des groupes d'actions.
la source
Pour ajouter une balise personnalisée, vous pouvez utiliser les extraits de code suivants:
la source
Juste pour être complet, je posterai une solution alternative qui implique la priorité
theme_button
(tirée de ce billet de blog )Ajoutez d'abord un
buttontype
attribut à l'élément de formulaire:Et puis remplacer le bouton du thème:
Cela crée cependant des problèmes s'il y a plus d'un bouton dans le formulaire car Drupal n'est pas en mesure de détecter le bouton sur lequel vous avez cliqué.
Cela peut être résolu en ajoutant un
#after_build
rappel au formulaire:Et puis dans la fonction after build:
la source
J'ai essayé la réponse d'Óscar Gómez Alcañiz mais mon formulaire n'était toujours pas soumis. Pour contourner ce problème, j'ai modifié sa solution afin que l'entrée se trouve au-dessus du bouton mais soit transparente:
De cette façon, le réel
input[type="submit]
est cliqué et déclenche l'action, mais le boutonProbablement une bonne idée de mettre tout ce CSS dans une feuille de style dans la vie réelle, mais juste de mettre la balise de style en ligne ici à titre d'exemple.
la source
Voici comment j'y parviens dans Drupal 8. Fondamentalement, je crée une nouvelle suggestion de thème afin que je puisse remplacer le bouton par un fichier de brindille personnalisé.
Ajoutez ce code dans votre fichier mythemename.theme:
Dans votre code, où que vous créiez votre formulaire, ajoutez un attribut 'data-twig-suggestion' à votre bouton d'envoi:
Maintenant, si vous avez activé le débogage de brindilles et que vous vérifiez la source html de votre bouton sur le site, vous verrez une nouvelle suggestion de brindilles:
Vous pouvez maintenant créer un fichier input - submit - button.html.twig (je le place dans mythemename / templates / form_elements mais vous pouvez le placer ailleurs si vous le souhaitez):
la source
Une manière plus correcte est:
Il produit du HTML valide comme ceci:
... et cette méthode ne freine pas la saisie semi-automatique et d'autres fonctionnalités.
la source
<button>
balise, du moins en D7. La dernière ligne detheme_button()
in includes / form.inc estreturn '<input' . drupal_attributes($element['#attributes']) . ' />';