Comment puis-je remplacer container.html.twig pour un seul bouton d'envoi?
Sur la base de la réponse de kiemi, vous pouvez opter pour quelque chose à ce degré:
<?php
/**
* Implements hook_theme_suggestions_container_alter().
*/
function yourtheme_theme_suggestions_container_alter(array &$suggestions, array $variables) {
$pieces = [
$variables['element']['#type'],
$variables['element']['#name'],
$variables['element']['#display_id'],
];
$suggestions[] = 'container__' . implode('_', $pieces);
}
Cela produira une suggestion, par exemple, de container--view-articles-featured.html.twig
Bien sûr, si vous voulez qu'il respecte les normes de suggestion de modèle Drupal modèle, vous voudrez ajouter plusieurs suggestions avec différents niveaux de spécificité.
function MYTHEME_theme_suggestions_container_alter(array &$suggestions, array $variables) {
$suggestions[] = 'container__';
}
Vous pouvez mettre quelque chose comme ça dans votre thème. J'essaie de faire la même chose, mais je ne sais pas comment obtenir les variables ...
Le module Template Suggest inclut désormais des suggestions de modèles de conteneurs. Un exemple de ce qu'il fournira pour une vue:
FILE NAME SUGGESTIONS:
* container--view--case-study--page-listing.html.twig
* container--view--case-study.html.twig
x container--view.html.twig
* container--no-parent.html.twig
* container.html.twig
Pour le cas d'utilisation d'origine d'un bouton d'envoi, voici ce qu'un conteneur typique autour d'un bouton d'envoi fournira:
FILE NAME SUGGESTIONS:
* container--actions.html.twig
* container--has-parent.html.twig
x container.html.twig
Ainsi, il est facile de cibler tous les conteneurs contenant des actions, qui incluent des boutons d'envoi, avec un container--actions.html.twig
modèle. (Ou tous les conteneurs de formulaires avec container--has-parent.html.twig
.)
Si l'objectif est vraiment de cibler un conteneur pour un bouton de soumission particulier et non d'autres boutons de soumission, cela devient beaucoup plus difficile. Le problème est même que l'ID du formulaire n'est pas plus précis que les suggestions de modèle que le module nous donne (par exemple, ce formulaire principal a edit-actions
comme ID, et un formulaire Web qui obtient la suggestion container--webform-actions.html.twig
obtient simplement l'ID edit-actions
!)
Une approche consisterait à remplacer container--actions.html.twig
pour supprimer le div, etc. et essayez de les reproduire selon les besoins dans le input--submit.html.twig
modèle (une suggestion fournie par le noyau). Mais c'est risqué car un conteneur peut avoir plus d'un bouton d'entrée.
Parce que les informations contenues dans ces boutons eux-mêmes ne sont pas naturellement uniques (par exemple, l'ID de edit-submit
sur les formulaires d'administration principaux et edit-actions-submit
sur les formulaires Web), je m'arrêterai sur la recherche de suggestions de modèles ou d'approches possibles jusqu'à ce que l'affiche originale (ou d'autres parties intéressées!) puisse clarifier précisément leur intention.
Voici le code utilisé par le module, basé à l'origine sur la réponse de Kevin sur le post associé :
function twigsuggest_theme_suggestions_container_alter(array &$suggestions, array $variables)
{
$element = $variables['element'];
// We cannot count on template_preprocess_container having run, so we copy
// its logic here to provide templates for forms (has parents) or not forms.
// Special handling for form elements.
if (isset($element['#array_parents'])) {
$suggestions[] = 'container__has_parent';
}
else {
$suggestions[] = 'container__no_parent';
}
if (isset($element['#type']) && $element['#type'] != 'container') {
$suggestions[] = 'container__' . $element['#type'];
}
if (isset($element['#type']) && $element['#type'] == 'container' && isset($element['children']['#type'])) {
$suggestions[] = 'container__' . $element['children']['#type'];
}
}