Je me demande comment ajouter une classe à la forme exposée de la balise de formulaire (de la vue _search_content_) en utilisant template_preprocess_views_exposed_form()
(ou encore mieux template_preprocess_views_exposed_form__search_content()
). Le formulaire est exposé en bloc .
Il fonctionne jusqu'à présent en utilisant le code suivant dans MY_THEME.theme:
function MY_THEME_preprocess_form(&$variables) {
if ($variables['element']['#form_id'] == 'views_exposed_form' && $variables['element']['#view_id'] == 'search_content') {
$variables['attributes']['class'][] = 'row';
}
}
Mais je ne peux pas le faire fonctionner pour:
function MY_THEME_preprocess_views_exposed_form__search_content(&$variables) {
// I tried:
// $variables['attributes']['class'][] = 'does-not-work';
// and also:
// $variables['attributes'] = new Attribute($variables['attributes']);
// $variables['attributes']->addClass('does-not-work');
// and also manipulating $variables['form'], but this didn't work either.
}
La fonction est appelée, mais elle n'ajoute pas la classe à la balise de formulaire. Est-il possible de le faire fonctionner avec template_preprocess_views_exposed_form()
?
Capture d'écran de la sortie de kint($variables)
, pour chaque fonction:
Est-il possible de le faire fonctionner avec template_preprocess_views_exposed_form ()?
Version courte: Vous ne pouvez pas utiliser hook_preprocess_views_exposed_form()
pour modifier la balise <form>
. La balise <form>
Est rendue indépendamment par un crochet de thème form
défini via la propriété de rendu #theme_wrappers
. Ce qui signifie qu'il est complètement dissocié du crochet de thème views_exposed_form
Réel qui rend le contenu (interne) des vues exposées.
Version longue:
views_theme()
définit le hook de thème views_exposed_form
comme renvoyant un élément de rendu de formulaire. Cela signifie qu'il finira par utiliser (sauf en cas de substitution) la définition fournie par élément de rendu de formulaire . Si vous regardez cela, vous verrez que cette définition définit la propriété '#theme_wrappers'
Sur ['form']
. Pas de surprise jusqu'à présent. :-)À un moment donné pendant le thème d'une page de vues (ou d'un bloc), le crochet de thème views_view
Entre en jeu; ce hook de thème contient la variable de rendu exposed
qui est essentiellement la forme exposée qui vous intéresse. Le tableau de rendu de exposed
contient les deux propriétés pertinentes suivantes:
#theme => views_exposed_form
(Et d'autres plus spécifiques comme views_exposed_form__search_content
): Il s'agit du crochet de thème qui fournira le contenu du formulaire, c'est-à-dire tout ce qui se trouve dans la balise <form>
. C'est à cela que vous avez accès et que vous avez la possibilité de modifier lorsque vous appelez template_preprocess_views_exposed_form()
. Ce crochet de thème n'est pas responsable du rendu de la balise <form>
Et ne vous permet pas de le modifier.#theme_wrappers => ['form']
: Ceci est la liste #theme_wrappers
Des crochets de thème; form
fournira la balise <form>
réelle. Il englobera essentiellement le balisage généré par le crochet de thème #theme
Dans une balise <form>
. C'est à cela que vous avez accès lorsque vous appelez template_preprocess_form()
. Ce thème est responsable du rendu de la balise <form>
Et vous permet de le modifier.Suggestion d'implémentation
Si vous préférez laisser les implémentations hook_form_alter()
gérer la logique liée au formulaire, vous pouvez toujours utiliser un autre hook de prétraitement pour implémenter la fonctionnalité souhaitée, à savoir le hook preprocess_views_view()
.
function MY_THEME_preprocess_views_view(&$variables) {
if ($variables['id'] === 'search_content') {
$variables['exposed']['#attributes']['class'][] = 'row';
}
}
Bonne chance, c'est une très bonne question!
C'est parce que le crochet tiré pour le formulaire exposé est en fait `` forme '' comme vous pouvez le voir dans la capture d'écran ci-dessous:
Et c'est pourquoi c'est toujours une bonne idée de activer twig debug
J'espère que cela pourra aider!
ÉDITER
Pour en savoir plus:
La fonction de prétraitement du formulaire exposé des vues ne modifie pas le formulaire lui-même car il s'agit d'un crochet différent. La bonne façon d'ajouter une classe au formulaire est de modifier le formulaire lui-même ou d'utiliser https://api.drupal.org/api/drupal/core%21includes%21form.inc/function/template_preprocess_form/8.6 .x car cette fonction est responsable de l'ajout d'attributs au formulaire lui-même. Vérifiez également la source twig de https://api.drupal.org/api/drupal/core%21themes%21stable%21templates%21form%21form.html.twig/8.6 .x Vous verrez que les attributs y sont imprimés.
Si vous voulez simplement ajouter une classe à la balise form
au filtre exposé, vous pouvez le faire avec hook_form_FORM_ID_alter pas besoin de template_preprocess_views_exposed_form()
ou template_preprocess_views_exposed_form__search_content()
Like le suivant:
use Drupal\Component\Utility\Html;
/**
* Implements hook_form_FORM_ID_alter().
*/
function myModuleName_form_views_exposed_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
$form['#attributes']['class'][] = Html::cleanCssIdentifier('your-new-class');
}