[Résolu] Fermer par défaut un champ collapsible

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Dans un formulaire de champs exposés, par l'intermédiaire du module 'Better Exposed Filters', j'ai rendu certains champs collapsibles. Cependant, je ne peux y indiquer que ces champs doivent être fermés par défaut. Or, l'affichage par défaut de ces champs est ouvert.

Via un dsm($form);, je ne trouve aucune propriété me permettant de faire ce que je désire.

Quelqu'un aurait une idée?

Merci d'avance pour votre aide.

Forum : 
Version de Drupal : 

Bonjour et merci pour votre intérêt.

Après avoir posté ce message, j'ai continué longuement à travailler sur ce problème et étais de fait tombé sur cette documentation. Cependant, je n'arrive pas à l'implémenter.

J'avais d'ailleurs, pour essai, implémenter ceci dans ma fonction :

$form['responsable'] = array(
    '#type' => 'fieldset',
    '#title' => t('Person in charge of this content type'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE
    );

Ceci me fait bien apparaître un fielset "fermé" dans le formulaire sur lequel je travaille. Cependant, je ne vois pas comment travailler sur un fieldset existant. Dans le code source du formulaire généré, je l'ai bien repéré :

<fieldset class="bef-select-as-checkboxes-fieldset collapsible form-wrapper collapse-processed">

Il ne contient pas d'id et n'apparait pas lorsque je fais un dsm($form). Je sèche...

Bonjour,

Quand tu fais un var_dump de ton $form normalement tu peux voir tes conteneurs.
Il suffit ensuite dans ton form_alter de faire un

$form['nom_du_conteneur']['#collapsed']= TRUE/FALSE

En tout cas en Drupal6 c'est comme cela que je fais.

Cordialement,
AyA

Bonjour et merci pour ton intervention.

Cela doit certainement fonctionner quand le 'nom_du_conteneur' est indiqué dans le fieldset. Or, ici, le module Better Exposed Filters ne donne aparemment pas de nom ni d'id aux fieldsets générés.

J'ai fait un var_dump() de mon formulaire et concernant le fieldset sur lequel je veux travailler (et il y en a pleins d'autres!), voici ce que j'ai trouvé :

["filter-field_prix_chambre_simple_value"]=> array(2)
                                            { ["operator"]=> string(34) "field_prix_chambre_simple_value_op"
                                              ["value"]=> string(31) "field_prix_chambre_simple_value" }
["field_prix_chambre_simple_value"]=> array(8) { ["#type"]=> string(6) "radios"
                                                 ["#options"]=> array(6) { ["All"]=> string(8) "- Tout -"
                                                                           ["na"]=> string(14) "Non applicable"
                                                                           ["moins35"]=> string(11) "- de 35 €"
                                                                           ["35_75"]=> string(11) "35 - 75 €"
                                                                           ["75_150"]=> string(12) "75 - 150 €"
                                                                           ["plus150"]=> string(12) "+ de 150 €" }
                                                 ["#default_value"]=> string(3) "All"
                                                 ["#size"]=> NULL
                                                 ["#process"]=> array(1) { [0]=> string(19) "form_process_radios" }
                                                 ["#bef_title"]=> string(19) "Prix chambre simple"
                                                 ["#attached"]=> array(2) { ["js"]=> array(2) { [0]=> string(13) "/misc/form.js"
                                                                                                [1]=> string(17) "/misc/collapse.js" }
                                                                            ["css"]=> array(1) { [0]=> string(67) "sites/all/modules/better_exposed_filters/better_exposed_filters.css" } }
                                                 ["#theme"]=> string(25) "select_as_radios_fieldset" }

OK donc ce n'est pas un vrai fieldset à proprement parlé.
C'est un type radios:

["#type"]=> string(6) "radios"

sur lequel on applique un theme:

["#theme"]=> string(25) "select_as_radios_fieldset"

et ensuite si on regarde le theme en question on rajoute a ce moment la un fieldset au type radios...
En soit assez compliquer a comprendre.
Si tu veux voir le theme utiliser il est dans la fichier better_exposed_filters.theme à la ligne 187. (function theme_select_as_radios_fieldset).

on remarque cela dans le theme :

// Using the FAPI #collapsible and #collapsed attribute doesn't work here
// TODO: not sure why...

en faite l'effet collapsible est générer grâce à des classes CSS qui sont utiliser dans le javascript.

Bref pour faire cours sinon je m'attarde mais je préfère une explication longue =P.
Il faudrait créer un nouveau thème en reprenant celui dont j'ai parlé précédemment.
Modifier ce que l'on veut dans notre nouveau thème => enlever les classes collapsed etc...
Et modifier le thème du champ de ton formulaire avec le form_alter.

$form["field_prix_chambre_simple_value"]['#theme']= 'nouveau_theme';

Je dis pas que ça va marcher du premier coup mais voila la chose à faire pour être propre.

Cordialement,
AyA

Pour commencer, j'ai copié le fichier 'better_exposed_filters.theme' dans le répertoire de mon module, je l'ai renommé en 'modiffiltresexposes.theme' sans y apporter de modification ('modiffiltresexposes' étant le nom de mon module) et, pour tester si tout allait bien, dans ma fonction 'function modiffiltresexposes_form_alter(&$form, &$form_state, $form_id)', j'ai mis l'instruction $form["field_prix_chambre_simple_value"]['#theme'] = 'modiffiltresexposes.theme';.

A ce moment, mon fielset disparaît ne laissant affichées que les différentes options, sans le titre 'Prix chambre simple'.

J'ai fait la même manoeuvre en plaçant le fichier dans le même répertoire que celui contenant 'better_exposed_filters.theme', mais c'est la même chose.

Si je comprends bien, dans $form["field_prix_chambre_simple_value"]['#theme'] je retrouve le nom de la fonction qui doit être appelée dans mon fichier .theme. Donc, mon but doit être soit de surcharger cette fonction pour certains champs de mon formulaire, soit de lier un nouveau fichier de theme pour certains champs de mon formulaire.

J'ai donc essayé de surcharger la fonction 'select_as_radios_fieldset'. Pour test, j'ai ajouter cette fonction dans mon fichier .module :

function modiffiltresexposes_select_as_radios_fieldset($vars)
{
var_dump($var);
}

Ca ne m'affiche rien.

Bonjour,

Alors attention lors de la création d'un thème.
Il faut également créer le hook_theme dans ton module afin que Drupal prenne en compte le nouveau thème.

A partir de la vérifie que ton type radio est bien modifier avec le nouveau theme et tu pourras commencer à développer l'affichage.

Cordialement,
AyA

Encore un grand merci pour ton aide... Je sue des gouttes sur ce problème!

Dans un premier temps, j'ai fais ceci dans mon fichier 'modiffiltresexposes.module' :

function modiffiltresexposes_theme()

  $theme = array('modiffiltresexposes' => array('arguments' => array('element' => NULL), ), );
  
  return $theme; 
}

Dans ce cas, lors du réaffichage de ma page d'acceuil, pas de problème.

Ensuite, après m'être assuré que mon fichier 'modiffiltresexposes.theme' (copie du fichier 'better_exposed_filters.theme') se trouvait bien dans le répertoire de mon module, j'ai fait ceci :

function modiffiltresexposes_theme()

  return array('select_as_radios_fieldset' => array(
      'function' => 'theme_select_as_radios_fieldset',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ));
   
  return $theme;
}

Et là, plantage lors du réaffichage de ma page d'acceuil.

Bon, je viens de régler le problème de plantage en mettant le fichier 'modiffiltresexposes.theme' dans le répertoire de 'better_exposed_filters'.

Cependant, même en faisant ceci dans mon module :

function modiffiltresexposes_theme()

  return array(
    'select_as_checkboxes' => array(
      'function' => 'theme_select_as_checkboxes',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_checkboxes_fieldset' => array(
      'function' => 'theme_select_as_checkboxes_fieldset',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_radios' => array(
      'function' => 'theme_select_as_radios',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_radios_fieldset' => array(
      'function' => 'theme_select_as_radios_fieldset',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_hidden' => array(
      'function' => 'theme_select_as_hidden',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_tree' => array(
      'function' => 'theme_select_as_tree',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_links' => array(
      'function' => 'theme_select_as_links',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
  );
}

c'est le fichier 'better_exposed_filters.theme' qui est pris en compte au lieu de mon fichier 'modiffiltresexposes.theme'.

Je n'y parviens absolument pas.

La seule solution que j'ai trouvée, et je ne l'apprécie pas du tout car, lors de mises à jour, je devrai à chaque fois rectifier le fichier : j'apporte directement les modifications dans le fichier "better_exposed_filters.theme". Ca m'affiche alors les éléments comme je le veux, mais c'est pourri comme solution.

Bon alors reprenons calmement et on va y arriver.

dans ton module (on l’appellera toto) tu fais un hook_theme

function toto_theme(){
return array(
    'select_as_checkboxes' => array(
      'function' => 'theme_select_as_checkboxes',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_checkboxes_fieldset' => array(
      'function' => 'theme_select_as_checkboxes_fieldset',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_radios' => array(
      'function' => 'theme_select_as_radios',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_radios_fieldset' => array(
      'function' => 'theme_select_as_radios_fieldset',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_hidden' => array(
      'function' => 'theme_select_as_hidden',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_tree' => array(
      'function' => 'theme_select_as_tree',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
    'select_as_links' => array(
      'function' => 'theme_select_as_links',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme',
    ),
  );
}

Ensuite dans ton fichier modiffiltresexposes.theme tu fais toutes les fonctions citées plus haut. Tu mets ton fichier dans le dossier de ton module toto.

Ensuite dans ton hook_alter tu change donc le theme de tes boutons de radio et le tour est joué. Sans modifier les fichiers du module de better_exposed_filters. Je concoit que ce n'est pas simple à mettre en oeuvre. Néanmoins je pense que l'on tien là la meilleur solution pour modifier ce problème 'proprement'.

Cordialement,
AyA

Merci beaucoup pour ta patience. Moi je commençais vachement à la perdre!!! ;-)

Dans mon fichier 'modiffiltresexposes.module', j'ai mis cette fonction :

function modiffiltresexposes_theme()
{
  return array(
    'select_as_radios_fieldset_revu' => array(
      'function' => 'theme_select_as_radios_fieldset_revu',
      'render element' => 'element',
      'file' => 'modiffiltresexposes.theme', )
    );
}

Dans le fichier 'modiffiltresexposes.theme' que j'ai placé dans le répertoire du module 'modiffiltresexposes', j'ai copié la fonction 'theme_select_as_radios_fieldset()' et je l'ai collée. Je l'ai renommée en 'theme_select_as_radios_fieldset_revu()' et ai modifié ce qu'il faut pour collopser les éléments en question.

Toujours dans le fichier 'modiffiltresexposes.theme', j'ai cette fonction :

function modiffiltresexposes_form_alter(&$form, &$form_state, $form_id)
{
  //dsm($form);
  //var_dump($form);
 
  switch($form['#id'])
   {
    case 'views-exposed-form-liste-annonces-page-annonces':
     $form['#info']['filter-country']['label'] = 'Pays';
     $form['country']['#default_value'] = 'be';
     $form['submit']['#value'] = 'Chercher un hôtel';
     $form['distance']['postal_code']['#title'] = 'Localité';
     $form['#info']['filter-distance']['label'] = 'Recherche de proximité';
     $form["field_prix_chambre_simple_value"]['#theme'] = 'select_as_radios_fieldset_revu';
    break;
   }
}

Tout est maintenant OK!!!

En fait, j'avais déjà tenté l'opération, mais le cache du navigateur me jouait des tours!

Un tout grand merci pour ton aide qui m'a été extrêmement précieuse!!!

Pour être plus précis, voici le code se trouvant devant les différents éléments du fieldset :

<div id="edit-field-prix-chambre-simple-value" class="form-radios">
<fieldset class="bef-select-as-checkboxes-fieldset collapsible form-wrapper collapse-processed">
  <legend>
   <span class="fieldset-legend">
    <a class="fieldset-title" href="#">
     <span class="fieldset-legend-prefix element-invisible">Masquer</span>
     Prix chambre simple
    </a>
    <span class="summary"></span>
   </span>
  </legend>