web-dev-qa-db-fra.com

Comment modifier les propriétés d'un élément de formulaire avant le rendu?

Voici une tâche simple.

Pour des raisons d'accessibilité, à partir d'un module personnalisé, j'ai besoin d'effectuer des modifications sur des éléments de formulaire basés sur des champs de texte (tels que des e-mails, des champs de texte, etc.) sur des formulaires personnalisés affichés aux utilisateurs.

Ces formulaires étendent la classe Drupal\Core\Form\FormBase.

Les modifications que je dois effectuer seraient par exemple de copier automatiquement et par programme la valeur du texte d'espace réservé du champ et de le placer dans l'attribut title du champ (pas l'étiquette du champ, je parle de l'attribut title HTML).

Le balisage du champ ressemblerait donc à ceci:

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

Je souhaite vérifier tous les formulaires personnalisés pour l'ensemble du site Web.

J'ai essayé différentes méthodes:

  • hook_field_widget_form_alter: ne se déclenche pas pour les champs des formulaires personnalisés car ils ne sont pas des widgets.
  • hook_preprocess_form_element: Il est trop tard pour effectuer ces modifications. Les valeurs ne prendront tout simplement pas effet sur le terrain.
  • hook_form_alter: Eh bien, c'est tout simplement trop général, je trouve ça un peu douteux d'analyser l'ensemble du tableau de rendu, de vérifier les champs, etc ... mais c'est peut-être le seul moyen ..

J'ai regardé l'API Form, l'API Render, l'API Plugins, j'ai regardé les services, rien ne semble offrir de solution, à moins bien sûr que je manque quelque chose, et je le fais probablement.

Quelqu'un at-il une idée de la meilleure façon d'y parvenir Drupal 8 way?

5
Gaetan Pralong

Dans hook_template_preprocess_form_element les balises (input-) sont déjà rendues. Vous pouvez utiliser

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

pour modifier la balise d'entrée. utilisez la même méthode pour toutes les autres balises souhaitées. Voici un joli tutoriel.

Vous pouvez utiliser hook/template_preprocess pour aller de manière plus générique.

3
rémy

voici un bout de 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

Rien de ce qui précède ne fonctionne pour moi. Il n'y a pas de champ 'title' qui peut être modifié, mais à la place il y a un objet TranslatableMarkup à l'intérieur de $variables["attributes"]["value"]

Pour moi, cela fonctionne:

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

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

Fondamentalement, je change le nom du bouton "Supprimer" en "X" et le titre est vraiment remplacé, mais le problème est qu'avec le nouveau nom (attribut de valeur en fait), l'action de suppression ne fonctionne plus. Mais le titre est remplacé avec succès.

0
MilanG