web-dev-qa-db-fra.com

Comment remplacer le modèle container.html.twig pour un seul bouton d'envoi?

Comment puis-je remplacer container.html.twig pour un seul bouton d'envoi?

Il ne montre aucune suggestion de modèle . Here is my template sugestions

3
Mariamita

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é.

3
Matt Fletcher
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 ...

1
kiemi

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'];
  }
}
1
mlncn