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:
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?
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.
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;
}
}
}
}
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.