it-swarm.com.de

Fügen Sie Variablen in der benutzerdefinierten Eingabevorlage hinzu

In D8 habe ich eine benutzerdefinierte Eingabe erstellt twig file (basierend auf input.html.twig):

{{ icon }}

<input{{ attributes }} />{{ children }}

Dann habe ich einen neuen Eintrag in hook_theme () erstellt:

function my_module_theme() {
 return [
   'input_custom' => [
     'render element' => 'form',
     'variables' => [
       'icon' => NULL,
     ],
     'template' => 'input-custom',
   ],
 ];
}

Dann lade ich die Vorlage in mein Formularelement:

$form['my_field'] = [
        '#type' => 'textfield',
        '#theme' => 'input_custom',
        '#icon' => 'my_icon',
        '#title' => $this->t('My title'),
      ];

Meine benutzerdefinierte Variable wird an die Vorlage gesendet, aber ich habe alle HTML-Attribute bei der Eingabe verloren. Wenn ich variables aus my_module_theme() entferne, sind alle HTML-Attribute zurück, aber ich verliere meine benutzerdefinierte Variable.

Wie kann ich benutzerdefinierte Variablen in einer benutzerdefinierten Eingabevorlage senden?

5
Promo

Deklarieren Sie ein #theme beginnend mit dem Basishaken des Eingabeelements und einem doppelten Unterstrich:

  $form['my_field'] = [
    '#type' => 'textfield',
    '#theme' => 'input__custom',
    '#icon' => 'my_icon',
    '#title' => $this->t('My title'),
  ];

Bereiten Sie zusätzliche Variablen in einem Vorverarbeitungs-Hook vor:

function mytheme/mymodule_preprocess_input(&$variables) {
  if ($variables['theme_hook_original'] == 'input__custom') {
    $variables['icon'] = $variables['element']['#icon'];
  }
}

Dann können Sie die hinzugefügten Variablen in der Eingabevorlage verwenden:

{{ icon }}
5
4k4

pdate: Diese Lösung funktioniert nicht, da das Formularelement zu einem Themenelement wird.

Mir ist nur klar, dass ich das Problem falsch verstehe ... Ich sollte eine benutzerdefinierte Vorlage verwenden, in die ich meine Eingabe lade und nicht das Gegenteil.

So muss ich ein Kernelement nicht überschreiben.

Zweigfeile:

{{ icon }}

{{ input }}

Hook_theme:

function my_module_theme() {
  return [
    'input_custom' => [
      'variables' => [
        'icon' => null,
        'input' => null,
      ],
      'template' => 'input-custom',
    ],
  ];
}

Mein Formularelement:

 $form['my_field'] = [
    '#theme' => 'input_custom',
    '#icon' => $labels['icon'],
    '#input' => [
      '#type' => 'textfield',
      '#title' => $this->t('My title'), 
    ],
  ];

Hinweis : Für diese Lösung habe ich meine Sichtweise zu diesem Problem geändert, um die Lösung zu vereinfachen. Technisch gesehen beantwortet dies, selbst wenn dies funktioniert, wie @ 4k4 sagte, die Anfangsfrage nicht vollständig.

0
Promo