J'ai un modèle pour l'un de mes formulaires et je veux ajouter la classe css à l'élément avant de le rendre, mais comme j'imprime l'élément dans son ensemble, je ne sais pas comment modifier les attributs.
On m'a dit sur IRC de jeter un œil à la méthode de fusion mais jusqu'à présent pas de chance.
{% set submit_attributes = form.submit.attributes %}
{% submit_attributes.addClass('test') %}
{% form.submit.attributes|merge(submit_attributes) %}
{{ form.submit }}
ou
{% form.submit.attributes.addClass('test') %}
{{ form.submit }}
Il semble qu'en ce moment ce n'est tout simplement pas possible. J'ai créé un problème sur drupal.org pour cela. Peut-être qu'un jour il sera implémenté et que nous pourrons nous débarrasser définitivement du moteur phptemplate.
Voici ma solution pour ajouter un espace réservé à un champ de texte personnalisé utilisé pour entrer des termes de recherche dans un formulaire. Je n'ai pas pu utiliser element.attributes.setAttributes()
car dans mon cas, la clé des attributs est #attributes
.
{% set attr = form.search_api_fulltext['#attributes']|merge({'placeholder': 'Enter search term'|t}) %}
{% set search = form.search_api_fulltext|merge({'#attributes': attr}) %}
{{ search }}
Voici le même développé un peu pour plus de clarté:
{% set search = form.search_api_fulltext %}
{% set attr = form.search_api_fulltext['#attributes'] %}
{% set attr = attr|merge({'placeholder': 'Enter search term'|t}) %}
{% set search = search|merge({'#attributes': attr}) %}
{{ search }}
Ou ajoutez une troisième fusion et fusionnez le champ dans le formulaire. Puis sortez le formulaire comme d'habitude:
{% set search = form.search_api_fulltext %}
{% set attr = form.search_api_fulltext['#attributes'] %}
{% set attr = attr|merge({'placeholder': 'Enter search term'|t}) %}
{% set search = search|merge({'#attributes': attr}) %}
{% set form = form|merge({'search_api_fulltext': search}) %}
{{ form }}
Il est possible d'utiliser le filtre de fusion, je le fais avec beaucoup de succès sur les éléments de menu:
{% set item = item|merge({'attributes': item.attributes.addClass('new-class')}) %}
Je pense que vous devriez pouvoir faire quelque chose comme ça avec une imbrication plus profonde:
{% set form_submit = form.submit %}
{% set form_submit = form_submit|merge({'attributes': form_submit.attributes.addClass('test')}) %}
{% set form = form|merge({'submit': form_submit}) %}
{{ form.submit }}
Bien que vous puissiez tout aussi bien rendre form_submit
et l'exclure du rendu avec form
ailleurs.
Eh bien, je ne sais vraiment pas si vous avez une raison particulière (comme tout garder sur le fichier HTML) pour le faire dans Twig, pas en pré-traitement, mais je peux vous donner un code qui a fonctionné pour moi en pré-traitement:
function hook_form_FORM_ID_alter(&$form, &$form_state) {
$form['actions']['submit']['#attributes']['class'] = array('btn-primary form-control');
}
Ce code doit être dans le fichier your_theme.theme (comme l'ancien template.php pour Drupal 7).
pour twig form add attribute:
{# add a "foo" class to it #}
{{ form_widget(form.name, { 'attr': {'class': 'foo'} }) }}
for buttons
{{ form_widget(delete_form.submit, { 'attr': {'class': 'btn btn-danger btn-lg', 'type': 'button'} }) }}
=============================================
si votre question pour drupal alors le code est donné ci-dessous et ça marche pour moi.
function MY_MODULE_Name_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'user_register_form') {
$form['actions']['submit']['#attributes'] = array('onclick' => 'if(!confirm_reg(this.id)){return false;}');
}
}
et ce code ne doit pas être dans le fichier de thème, il est dans votre fichier modulename.module j'espère que cela vous aide ...
Ajouter à votre dossier de modèles
entrée - submit.html.twig
{%
set classes = [
'test',
'test2',
]
%}
<input{{ attributes.addClass(classes) }} />
Tout le monde a tout à fait raison, la façon "drupale" de faire les choses est d'avoir hook_form_alter - de préférence hook_form_FORM_ID_alter et d'ajouter la classe avant qu'elle ne soit rendue.
Si vous cherchez un autre moyen - vous pouvez obtenir l'élément HTML du formulaire à partir de drupal en utilisant render ($ form ['submit']) (je suppose que c'est pour le bouton de soumission) donc
$submitHTML = render($form['submit']);
Vous pouvez ensuite transmettre ce code HTML à votre modèle TWIG en tant que variable.
$markup = array('markup' => $submitHTML);
$template = $twig->loadTemplate('myTwigFile.twig');
$output = $template->render($markup);
Dans votre modèle TWIG vous pouvez envelopper le HTML dans tout ce que vous voulez et simplement rendre le HTML brut que vous avez obtenu de drupal.
<div class="clearfix">
{{markup[0]|raw}}
</div>
Notez que je fais référence au balisage du bouton de soumission comme premier élément du tableau de balisage - vous pouvez donc ajouter d'autres éléments de formulaire au même tableau.
J'ai omis du code de plomberie (configuration) - mais j'espère que vous avez l'idée.