Drupal 8 - Views - Récupérer un formulaire exposé

Pour un besoin spécifique, il fallait que je récupère un formulaire exposé de views pour l'afficher ailleurs.

Il fallait en fait qu'à un endroit j'affiche les filtres exposés et à un autre le tri exposé.

J'ai donc créé un bloc, qui récupère ce formulaire, masque un champ.

Voici donc comment récupérer un formulaire exposé :

$view_name = 'ma_vue';
$view_display = 'page';

$view = \Drupal\views\Views::getView($view_name);
$view->initHandlers();
$view->setDisplay($view_display);
$form_state = new \Drupal\Core\Form\FormState();
$form_state->setFormState([
  'view' => $view,
  'display' => $view->display_handler->display,
  'exposed_form_plugin' => $view->display_handler->getPlugin('exposed_form'),
  'method' => 'get',
  'rerender' => TRUE,
  'no_redirect' => FALSE,
  'always_process' => TRUE,
]);

// Ici j'ajoute une info pour connaitre le contexte si le formulaire est altéré
// afin de distiguer cette instance de formulaire de la « normale ».
$form_state->addBuildInfo('exposed_block', TRUE);

$form = \Drupal::formBuilder()->buildForm('Drupal\views\Form\ViewsExposedForm', $form_state);

// Je masque le champs qui ne m'intéresse pas
$form['sort_by']['#access'] = FALSE;

Dans le cadre d'un HOOK_form_alter je peux récupérer l'information "exposed_block" de la façon suivante :

$form_state->getBuildInfo()['exposed_block']

 

 

Commentaires

Note que pour une vue avec un display 'page', et un formulaire exposé pas en mode bloc, j'ai du commenté la ligne $view->setDisplay($view_display); sinon je n'avais que les boutons submit.

De la à comprendre pourquoi... ;)

Merci pour le snippet

aha oui, bon à savoir, mais pour la raison ¯\_(ツ)_/¯

Bonjour est il possible de supprimer le bouton submit pour que la recherche soit automatique

pour moi c'est indépendant du sujet de l'article ; Regarde du coté des paramètres AJAX et des paramètres du formulaire exposé, de souvenir c'est dans ce coin la (je ne fait jamais de recherche automatique, je trouve ca pas terrible niveau UX/a11y)

Merci pour la reponse j'ai verifie du cote des parametres Ajax et du formulaire mais j'ai tjrs pas trouve de solution

Bonjour, pour que le display_handler fonctionne sur le setDisplay séléctionné, il faut placer le initHandlers en dessous de $view->setDisplay($view_display); sinon la vue séléctionné ne sera pas prise en compte.
pour résoudre le premier commentaire.

Un code un peu plus court sans avoir besoin de charger la view.


$view_name = "view_name";
$display_name = "display_name";
$block_manager = \Drupal::service('plugin.manager.block');
$plugin_block = $block_manager->createInstance('views_exposed_filter_block:' . $view_name . '-' . $display_name , []);
$form = $plugin_block->build();

Bonjour
Merci pour cet article très intéressant.
Il fonctionne très bien.
Par contre sur la même page, j'ai un form #ajax dans un block.
Quand j'active ce code, le form ajax est cassé: la page s'actualise.
Avez-vous une idée ?
Merci beaucoup

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...