[SPIP Zone] [Spip-zone-commit] r10939 - in /_plugins_/_stable_/forms/forms_et_tables_1_9_1: formulaires/forms_recherche.html modeles/table_recherche.html public/forms_boucles.php

Bonjour,

Quelques remarques / points de vue sur la recherche de forms_et_tables, une fonctionnalité particulièrement intéressante !!!

- je préconise que le formulaire de recherche s'appuie la méthode post et non get. Avec get, une recherche unique fonctionne mais génère des problèmes lors de recherches successives à partir du même formulaire. En effet, on récupère à la fois les valeurs contenues dans l'url (recherche précédente) et celle postée par le formulaire (recherche en cours).... ce qui se traduit par des résultats incohérents.

- Il ne me semble pas très pertinent que les critères de sélection utilisent un OU. Normalement lorsqu'on fait une recherche, l'objectif est de restreindre la population totale aux critères sélectionnés qui s'accumulent. Plus on ajoute de critère et plus on doit restreindre la population. Un ET entre les critères me semble plus logique (avec un OU, plus on ajoute de critères, plus on obtient de résultats).

- Un petit détail. Il ne semble guère utile d'afficher toutes les données tant qu'on a pas validé le formulaire. Un #SET{submit,#EVAL{$_POST['submit']}} [(#GET{submit}|!={Rechercher}|?{'',' '}) est utile pour n'afficher les résultats que dès lors que le formulaire a été validé...

Amicalement,
Philippe

Note : la version svn de la recherche pour fonctionner nécessite le commit r8973 effectué sur spip-1.9.2/ecrire/inc/utils.php

cedric@yterium.com a écrit :

Author: cedric@yterium.com
Date: Tue Apr 3 18:11:55 2007
New Revision: 10939

Log:
"un formulaire de recherche et un modele de table (table_recherche) qui l'utilise
Le formulaire de recherche propose tous les champs de type mot/multiple/select et le critere {filtre} sur la boucle forms_donnees applique les selections
Tous les criteres de selections utilisent un OU (a verifier que c le mieux)

s'utilise avec
<tableXX|recherche>
"

Added:
    _plugins_/_stable_/forms/forms_et_tables_1_9_1/modeles/table_recherche.html
Modified:
    _plugins_/_stable_/forms/forms_et_tables_1_9_1/formulaires/forms_recherche.html
    _plugins_/_stable_/forms/forms_et_tables_1_9_1/public/forms_boucles.php

Modified: _plugins_/_stable_/forms/forms_et_tables_1_9_1/formulaires/forms_recherche.html

--- _plugins_/_stable_/forms/forms_et_tables_1_9_1/formulaires/forms_recherche.html (original)
+++ _plugins_/_stable_/forms/forms_et_tables_1_9_1/formulaires/forms_recherche.html Tue Apr 3 18:11:55 2007
@@ -1,10 +1,12 @@
-#SET{valeurs,#EVAL{$_GET}|serialize}
+#SET{valeurs,#EVAL{$_GET}|serialize}#SET{url,#SELF}
<B_filtre>
<form action='#SELF' method='get'>
<div class='recherche spip_forms'>
-[(#SELF|form_hidden)]
+[(#GET{url}|parametre_url{submit,''}|form_hidden)]
<BOUCLE_filtre(FORMS_CHAMPS){id_form}{par rang}{specifiant=oui}{type IN (select,multiple,mot)}>
[(#INCLURE{fond=formulaires/forms_structure}{id_form}{champ}{valeurs=#GET{valeurs}})]
+#SET{url,#GET{url}|parametre_url{#CHAMP,''}}
+#SET{url,#GET{url}|parametre_url{(#CHAMP|concat{ #EVAL{chr(91)},#EVAL{chr(93)}}),''}}
</BOUCLE_filtre>
<div style='text-align:#LANG_RIGHT' class='spip_bouton'><input type="submit" name='submit' value="<:info_rechercher:>" /></div>
</div>

Added: _plugins_/_stable_/forms/forms_et_tables_1_9_1/modeles/table_recherche.html

--- _plugins_/_stable_/forms/forms_et_tables_1_9_1/modeles/table_recherche.html (added)
+++ _plugins_/_stable_/forms/forms_et_tables_1_9_1/modeles/table_recherche.html Tue Apr 3 18:11:55 2007
@@ -0,0 +1,51 @@
+<INCLURE{fond=formulaires/forms_recherche}{id_form=#ENV{id_table}}>
+#SET{colonnes_sans_tri,'0'}
+<script type="text/javascript" src="#EVAL{_DIR_PLUGIN_FORMS}javascript/jquery.tablesorter.dev.js"></script>
+<div><div id="sorting"><div>Tri en cours, un instant...</div></div>
+<div id="filter"></div></div>
+<div style="clear:both">&nbsp;</div>
+<B_head>
+<table class="spip donnees" id='donnees-#ENV{id_table}'>
+<BOUCLE_caption(FORMS){id_form=#ENV{id_table}}><caption>#TITRE</caption></BOUCLE_caption>
+<thead><tr class='row_first'>
+ <th class='neutre'>id</th>
+ <BOUCLE_head(FORMS_CHAMPS){id_form=#ENV{id_table}}{type !IN (separateur,textestatique)}{par rang}{specifiant=oui}>
+ <th [(#SPECIFIANT|=={oui}|?{'','class="neutre"'})#SET{colonnes_sans_tri,#GET{colonnes_sans_tri}|concat{','}|concat{#COMPTEUR_BOUCLE|plus{1}}]>#TITRE</th>
+ </BOUCLE_head>
+</tr></thead>
+<tbody>
+<BOUCLE_donnees(FORMS_DONNEES){id_form=#ENV{id_table}}{id_mot?}{filtre}{par rang}>
+#SET{lien_supp,#URL_ACTION_AUTEUR{forms_donnee_supprime,#ID_FORM:#ID_DONNEE,#EVAL{_DIR_RESTREINT_ABS}|concat{#SELF}|urlencode}}
+ <tr class='[(#COMPTEUR_BOUCLE|alterner{row_even,row_odd})]'>
+ <td><a href='[(#SELF|parametre_url{id_donnee,#ID_DONNEE}|ancre_url{donnee-#ID_DONNEE})]'>#ID_DONNEE</a></td>
+ <BOUCLE_body(FORMS_CHAMPS){id_form}{type !IN (separateur,textestatique)}{par rang}{specifiant=oui}>
+ <td ><span class='#_donnees:EDIT{#CHAMP}'>#LESVALEURS{'<br />'}</span></td>
+ </BOUCLE_body>
+</BOUCLE_donnees>
+</tbody>
+</table>
+</B_head>
+#MODELE{donnee,id_donnee=#EVAL{$_GET['id_donnee']} }
+<script type="text/javascript"><!--
+var search_string='<:bouton_chercher:>';
+var clear_string='<:info_tout_afficher:>';
+var apply_string='<:bouton_valider:>';
+$(document).ready(function() {
+ $("table#donnees-#ENV{id_table}").tableSorter({
+ sortClassAsc: 'headerSortUp', // class name for ascending sorting action to header
+ sortClassDesc: 'headerSortDown', // class name for descending sorting action to header
+ headerClass: 'header', // class name for headers (th's)
+ disableHeader: [#GET{colonnes_sans_tri}], // disable column can be a string / number or array containing string or number. + dateFormat: 'dd/mm/yyyy', // set date format for non iso dates default us, in this case override and set uk-format
+ stripingRowClass: ['row_even','row_odd'], // Class names for striping supplyed as a array.
+ stripRowsOnStartUp: false // Strip rows on tableSorter init.
+ });
+ $("div#sorting").hide();
+});
+$(document).sortStart(function(){
+ $("div#sorting").show();
+}).sortStop(function(a){
+ $("div#sorting").hide();
+});
+// -->
+</script>
\ No newline at end of file

Modified: _plugins_/_stable_/forms/forms_et_tables_1_9_1/public/forms_boucles.php

--- _plugins_/_stable_/forms/forms_et_tables_1_9_1/public/forms_boucles.php (original)
+++ _plugins_/_stable_/forms/forms_et_tables_1_9_1/public/forms_boucles.php Tue Apr 3 18:11:55 2007
@@ -59,21 +59,16 @@
     $t = "'donnees_champs.valeur'";
     return $t;
   }
- //
- // <BOUCLE(FORMS)>
- //
- /*function boucle_FORMS_dist($id_boucle, &$boucles) {
- $boucle = &$boucles[$id_boucle];
- $id_table = $boucle->id_table;
- $boucle->from[$id_table] = "spip_forms";
   
- if (!isset($boucle->modificateur['tout'])){
- $boucle->where= array("'='", "'$id_table.public'", "'oui'");
- $boucle->group = $boucle->id_table . '.champ'; // ? + // {filtre}
+ function critere_filtre_dist($idb, &$boucles, $crit) {
+ $not = $crit->not;
+ $boucle = &$boucles[$idb];
+ if ($not)
+ erreur_squelette(_T('zbug_info_erreur_squelette'), $crit->op);
+ $boucle->modificateur['crit_filtre'] = 1;
+ //$boucle->where= array("'='", "'$boucle->id_table." . "id_parent'", 0);
     }
- return calculer_boucle($id_boucle, $boucles); - }*/
-
   //
   // <BOUCLE(FORMS_DONNEES)>
   //
@@ -87,8 +82,45 @@
     if (!$boucle->statut && !isset($boucle->modificateur['tout']) && !$boucle->tout)
       $boucle->where= array("'='", "'$id_table.statut'", "'\"publie\"'");
       
+ if (isset($boucle->modificateur['crit_filtre'])){
+ // construire la requete pour construire une condtion sur les champs passes en $_GET
+ $filtre = new Boucle;
+ $filtre->id_table = 'forms_champs';
+ $filtre->sql_serveur = $boucle->sql_serveur;
+ $filtre->from['forms_champs']='spip_forms_champs';
+ $filtre->select='champ';
+ foreach($boucle->where as $cond){
+ if ($cond[1] == "'$id_table.id_form'"){
+ $cond[1] = "'forms_champs.id_form'";
+ $filtre->where = $cond;
+ }
+ }
+ //$filtre->where = array("'='","'forms_champs.type'","'\"mot\"'");
+ $reqfiltre = calculer_requete_sql($filtre);
+
+ $boucle->hash .= <<<code
+ $reqfiltre
+ \$filtre = "";
+ while (\$row = @spip_abstract_fetch(\$result,"")){
+ if ((\$r = _request(\$row['champ']))!==NULL){
+ if (is_array(\$r)) + \$filtre .= " OR (dc.champ="._q(\$row['champ'])." AND dc.valeur IN (".implode(',',array_map('_q',\$r))."))";
+ else
+ \$filtre .= " OR (dc.champ="._q(\$row['champ'])." AND dc.valeur="._q(\$r)."))";
+ }
+ }
+ if (strlen(\$filtre)) \$filtre = substr(\$filtre,4);
+ else \$filtre="1=1";
+code;
+ $boucle->where = '$filtre';
+ $boucle->from["dc"] = "spip_forms_donnees_champs";
+ $boucle->where = array("'='", "'dc.id_donnee'", "'$id_table.id_donnee'");
+ }
+
     if (isset($boucle->modificateur['crit_id_mot'])){
       $init = ($init = $boucles[$id_boucle]->doublons) ? ("\n\t$init = array();") : '';
+ $hash = $boucle->hash;
+ $boucle->hash = "";
       $boucles[$id_boucle]->doublons = false;
       // calculer la requete sans prise en compte du critere id_mot
       // car il n'est pas certain que la table possede un champ mot cle
@@ -111,7 +143,7 @@
       }
       $verif->where = array("'='","'forms_champs.type'","'\"mot\"'");
       $reqverif = calculer_requete_sql($verif);
- $boucle->hash="$reqverif $init
+ $boucle->hash = "$hash $reqverif \n$init
    if (spip_abstract_count(\$result,'".$verif->sql_serveur."')==0){
   $req

_______________________________________________
Spip-zone-commit@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone-commit