web-dev-qa-db-fra.com

Ajouter une classe au formulaire dans les vues du formulaire exposé via template_preprocess_views_exposed_form ()

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:

enter image description here

Est-il possible de le faire fonctionner avec template_preprocess_views_exposed_form ()?

2
LarS

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:

  1. 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. :-)
  2. À 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!

6
Stefanos Petrakis

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:
enter image description here

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.

0
Ismail Cherri

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');
}
0
berramou