it-swarm.com.de

Wie füge ich dem Element in twig vor dem Rendern) ein Attribut hinzu?

Ich habe eine Vorlage für eines meiner Formulare und möchte dem Element vor dem Rendern eine CSS-Klasse hinzufügen. Da ich das Element jedoch als Ganzes drucke, bin ich mir nicht sicher, wie ich die Attribute ändern soll.

Mir wurde am IRC gesagt, ich solle mir die Zusammenführungsmethode ansehen, aber bisher kein Glück.

{% set submit_attributes = form.submit.attributes %}
{% submit_attributes.addClass('test') %}
{% form.submit.attributes|merge(submit_attributes) %}
{{ form.submit }}

oder

{% form.submit.attributes.addClass('test') %}
{{ form.submit }}
6
user21641

Es sieht so aus, als ob dies in diesem Moment einfach nicht möglich ist. Ich habe dafür ein Problem bei drupal.org erstellt. Vielleicht wird es eines Tages implementiert und wir können die Phptemplate-Engine endgültig loswerden.

https://www.drupal.org/node/2567759

2
user21641

Hier ist meine Lösung zum Hinzufügen eines Platzhalters zu einem benutzerdefinierten Textfeld, das zum Eingeben von Suchbegriffen in ein Formular verwendet wird. Ich konnte element.attributes.setAttributes() nicht verwenden, da in meinem Fall der Schlüssel für Attribute #attributes Ist.

{% set attr = form.search_api_fulltext['#attributes']|merge({'placeholder': 'Enter search term'|t}) %}
{% set search = form.search_api_fulltext|merge({'#attributes': attr}) %}
{{ search }}

Hier ist das gleiche aus Gründen der Klarheit ein wenig erweitert:

{% 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 }}

Oder fügen Sie eine dritte Zusammenführung hinzu und führen Sie das Feld wieder in das Formular ein. Geben Sie dann das Formular wie gewohnt aus:

{% 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 }}
3
James Sorensen

Es ist möglich, einen Zusammenführungsfilter zu verwenden. Ich mache dies mit großem Erfolg bei Menüpunkten:

{% set item = item|merge({'attributes': item.attributes.addClass('new-class')}) %}

Ich denke, Sie sollten in der Lage sein, so etwas mit tieferer Verschachtelung zu tun:

{% 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 }}

Sie können jedoch genauso gut form_submit Rendern und ausschließen, dass es zusammen mit form an anderer Stelle gerendert wird.

2
holist

Nun, ich weiß wirklich nicht, ob Sie einen bestimmten Grund haben (wie alles in der HTML-Datei zu behalten), dies in Twig zu tun, nicht im Vorprozess, aber ich kann Ihnen einen Code geben, der für mich im Vorprozess funktioniert hat:

function hook_form_FORM_ID_alter(&$form, &$form_state) {
  $form['actions']['submit']['#attributes']['class'] = array('btn-primary form-control');
}

Dieser Code sollte sich in der Datei your_theme.theme befinden (wie die alte template.php für Drupal 7).

2
pedrorocha

für twig Formular Attribut hinzufügen:

  {# 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'} }) }}

==============================================

wenn Ihre Frage für drupal form) dann ist Code unten angegeben und es funktioniert für mich.

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;}');   
    }
 }

und dieser Code sollte nicht in der Themendatei sein, sondern in Ihrer modulename.module-Datei. Ich hoffe, dies hilft Ihnen ...

1
Kamal Oberoi

Fügen Sie Ihrem Vorlagenordner hinzu

input - submit.html.twig

{%
set classes = [
   'test',
   'test2',
 ]
%}
<input{{ attributes.addClass(classes) }} />
1
No Sssweat

Jeder hat völlig Recht. Die "drupale" Art, Dinge zu tun, besteht darin, hook_form_alter - vorzugsweise hook_form_FORM_ID_alter - zu haben und die Klasse hinzuzufügen, bevor sie gerendert wird.

Wenn Sie nach einer alternativen Möglichkeit suchen, können Sie das HTML-Formularelement von drupal using render ($ form ['submit']) (ich gehe davon aus, dass dies für die Schaltfläche "submit" gilt) abrufen

$submitHTML = render($form['submit']);

Sie können diesen HTML-Code dann als Variable an Ihre Vorlage TWIG) übergeben.

$markup = array('markup' => $submitHTML);
$template = $twig->loadTemplate('myTwigFile.twig');
$output = $template->render($markup);

In Ihrer Vorlage TWIG) können Sie den HTML-Code in das beliebige Format einbinden und einfach den von drupal erhaltenen Roh-HTML-Code rendern.

<div class="clearfix">
  {{markup[0]|raw}}
</div>

Beachten Sie, dass ich das Markup der Schaltfläche "Senden" als erstes Element des Markup-Arrays bezeichne, sodass Sie demselben Array andere Formularelemente hinzufügen können.

Ich habe einen Installationscode (Setup) weggelassen - aber hoffentlich haben Sie die Idee.

0
JP Dippenaar