it-swarm.com.de

Wie ändere ich die Eigenschaften eines Formularelements vor dem Rendern?

Hier ist eine einfache Aufgabe.

Aus Gründen der Barrierefreiheit muss ich in einem benutzerdefinierten Modul Änderungen an textfeldbasierten Formularelementen (wie E-Mail, Textfeld usw.) an benutzerdefinierten Formularen vornehmen, die Frontbenutzern angezeigt werden.

Diese Formulare erweitern die Klasse Drupal\Core\Form\FormBase.

Die Änderungen, die ich vornehmen muss, sind beispielsweise das automatische und programmgesteuerte Kopieren des Werts des Platzhaltertextes des Felds und das Einfügen in das Titelattribut des Felds (nicht in die Feldbezeichnung, ich spreche über das HTML-Titelattribut).

Das Markup des Feldes würde also ungefähr so ​​aussehen:

<input type="email" placeholder="Email" title="Email" />

Ich möchte alle benutzerdefinierten Formulare für die gesamte Website überprüfen.

Ich habe verschiedene Methoden ausprobiert:

  • hook_field_widget_form_alter: Wird nicht für Felder in benutzerdefinierten Formularen ausgelöst, da es sich nicht um Widgets handelt.
  • hook_preprocess_form_element: Es ist zu spät, um diese Änderungen vorzunehmen. Die Werte werden auf dem Feld einfach nicht wirksam.
  • hook_form_alter: Nun, es ist einfach zu allgemein. Ich finde es etwas zwielichtig, das gesamte Render-Array zu analysieren, nach Feldern zu suchen usw. Aber vielleicht ist es der einzige Weg.

Ich habe mir die Formular-API, die Render-API, die Plugins-API und die Dienste angesehen. Nichts scheint eine Lösung zu bieten, es sei denn, ich vermisse etwas und wahrscheinlich auch.

Hat jemand eine Idee, wie man dies am besten erreichen kann Drupal 8 way?

5
Gaetan Pralong

Im hook_template_preprocess_form_element Die (Eingabe-) Tags sind bereits gerendert. Sie können verwenden

function hook/template_preprocess_input(&$variables) {
  $variables['attributes']['title'] = 'my-title';
  $variables['attributes']['placeholder'] = 'my-placeholder';
}

um das Eingabe-Tag zu ändern. Verwenden Sie für alle anderen gewünschten Tags dieselbe Methode. Hier ist ein schönes Tutorial.

Sie können hook/template_preprocess verwenden, um einen allgemeineren Weg zu gehen.

3
rémy

hier ist ein Stück Code:

function MODULE_preprocess_input(&$variables) {
    if (!\Drupal::service('router.admin_context')->isAdminRoute()) {
        $field = $variables['element'];
        if ($field['#type'] == 'email') {
            if (isset($field['#attributes']['placeholder'])) {
                $placeholder = $field['#attributes']['placeholder'];
                $variables['element']['#attributes']['title'] = $placeholder;
            }
        }
    }
}
2
Gaetan Pralong

Nichts von alledem funktioniert für mich. Es gibt kein 'title'-Feld, das geändert werden kann, sondern ein TranslatableMarkup-Objekt in $variables["attributes"]["value"]

Für mich funktioniert das:

function MODULE_preprocess_input(&$variables)
{
  if ($variables['attributes']['class'][0] == 'delete-order-item') {

    $variables["attributes"]["value"] = new \Drupal\Core\StringTranslation\TranslatableMarkup("X");
  }
}

Grundsätzlich ändere ich den Namen der Schaltfläche "Entfernen" in "X" und der Titel wird wirklich ersetzt, aber das Problem ist, dass die Löschaktion mit neuem Namen (Wertattribut tatsächlich) nicht mehr funktioniert. Der Titel wird jedoch erfolgreich ersetzt.

0
MilanG