Changeset 56928 in spip-zone


Ignore:
Timestamp:
Jan 11, 2012, 9:48:28 PM (8 years ago)
Author:
marcimat@…
Message:

Ça m'aura pris bien plus de temps que souhaité, mais ça marche !

Le critere de recherche {rechercher} (notez l'infinitif, sinon ça conflicte avec celui de SPIP) entre dans la cour.
associé à {pagination 5} ça ne va chercher que ce qui est réellement affiché à PMB. Y a un petit hack car SPIP ne prévoie pas ça pour sa pagination (qui pagine après avoir tous les éléments), mais ça marche pas mal du tout.

<BOUCLE_recherche(PMB:NOTICES){rechercher}

{id_section ?}{id_location_memo ?}{look ?}{pagination 5}>

Location:
_plugins_/spip-pmb/trunk
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/spip-pmb/trunk/content/recherche.html

    r56901 r56928  
    88</div>]
    99
    10 
    11 <INCLURE{fond=inclure/inc-recherche-avancee}{recherche}{env}>
    12 [(#ENV{look_SITE}|=={1}|oui)
    13         <INCLURE{fond=inclure/inc-recherche-site}{recherche}{env}>
    14 ]
    15 [(#ENV{look_PMB}|=={1}|oui)
     10[(#VAL{PMB}|in_any{#ENV{look}}|oui)
    1611        [(#INCLURE{fond=inclure/inc-recherche-pmb_catalogue}{env}
    17                 {ajax}{ajaxload}
    18                 {recherche}
    19                 {look_ALL}
    20                 {look_AUTHOR}{look_PUBLISHER}
    21                 {look_COLLECTION}{look_SUBCOLLECTION}
    22                 {look_CATEGORY}{look_INDEXINT}
    23                 {look_KEYWORDS}{look_TITLE}{look_ABSTRACT}
     12                {ajax}
     13                {rechercher=#ENV{recherche}}{look}
    2414                {id_section}{id_location_memo}
    2515                {typdoc}
    2616                {debut}{fin} )]
    2717]
     18
     19<INCLURE{fond=inclure/inc-recherche-avancee}{recherche}{env}>
     20[(#ENV{look/SITE}|=={1}|oui)
     21        <INCLURE{fond=inclure/inc-recherche-site}{recherche}{env}>
     22]
     23
  • _plugins_/spip-pmb/trunk/formulaires/recherche_spip_et_catalogue.html

    r55779 r56928  
    33          [(#ENV{action}|form_hidden)]
    44          [<input type="hidden" name="lang" value="(#ENV{lang})" />]
    5           <input type="hidden" id="look_ALL" name="look_ALL" value="1" />
     5          <input type="hidden" id="look_ALL" name="look[]" value="ALL" />
    66       
    77       
     
    1010                        <li class='editer editer_look'>
    1111                                <div class='choix'>
    12                                         <input type='checkbox' name='look_PMB' id='look_PMB' value='1' checked='checked' />
     12                                        <input type='checkbox' name='look[]' id='look_PMB' value='PMB' checked='checked' />
    1313                                        <label for='look_PMB' style="display: inline;"><:pmb:recherche_catalogue:></label>
    1414                                </div>
    1515                                <div class='choix'>
    16                                         <input type='checkbox' name='look_SITE' id='look_SITE' value='1'  />
     16                                        <input type='checkbox' name='look[]' id='look_SITE' value='SITE'  />
    1717                                        <label for='look_SITE' style="display: inline;"><:pmb:recherche_portail_web:></label>
    1818                                </div>
     
    2424                        </li>
    2525                        <li class="recherche-avancee">
    26                                 <a href="[(#URL_PAGE{recherche}|parametre_url{look_ALL,1})]"><:pmb:recherche_avancee:> +</a>
     26                                <a href="[(#URL_PAGE{recherche}|parametre_url{look[],ALL})]"><:pmb:recherche_avancee:> +</a>
    2727                        </li>
    2828             </ul>
  • _plugins_/spip-pmb/trunk/inclure/inc-pmb_catalogue.html

    r56901 r56928  
    6464        </B_tab_resultat2>
    6565
    66 
    6766        [(#INCLURE{fond=inclure/inc-recherche-pmb_catalogue}{env}
    68                 {ajax}{ajaxload}
    69                 {recherche}
     67                {ajax}
     68                {rechercher=#ENV{recherche}}
    7069                {look_ALL}
    7170                {look_AUTHOR}{look_PUBLISHER}
  • _plugins_/spip-pmb/trunk/inclure/inc-recherche-avancee.html

    r56901 r56928  
    55<div id="search">
    66        <div class='formulaire_spip formulaire_recherche_avancee'>
    7                 <form action='[(#URL_PAGE{recherche}|ancre_url{ajax-recherche-catalogue})]' method='post'>
     7                <form action='#URL_PAGE{recherche}' method='post'>
    88                        [<input type='hidden' name='id_section' value='(#ENV{id_section})'/>]
    99                        [<input type='hidden' name='id_location_memo' value='(#ENV{id_location_memo})'/>]
     
    1111                        <input type='hidden' name='page' value='[(#ENV{page,recherche})]'/>
    1212                        <input type='hidden' name='recherche_avancee' value='1'/>
    13                         <input type='hidden' name='look_PMB' value='1'/>
    14                         <input type='hidden' name='look_FIRSTACCESS' value='1' />
     13                        <input type='hidden' name='look[]' value='PMB'/>
     14                        <input type='hidden' name='look[]' value='FIRSTACCESS' />
    1515                        <fieldset>
    1616                                <legend><:pmb:recherche_avancee:></legend>
     
    4343
    4444                                                <select name='typdoc'> 
    45                                                         <option  value=''>tout type de document</option>
     45                                                        <option  value=''>Tout type de document</option>
    4646                                                        <option  value='a'[(#ENV{typdoc}|=={a}|oui)selected="selected")]>texte imprim&eacute;</option>
    4747                                                        <option  value='b'[(#ENV{typdoc}|=={b}|oui)selected="selected")]>texte manuscrit</option>
     
    6363                                                <tbody>
    6464                                                        <tr class="row_even">
    65                                                                 <td><input type='checkbox' name='look_TITLE' id='recherche_avancee_look_TITLE' value='1'[(#ENV{look_TITLE}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_TITLE'> Titres </label></td>
    66                                                                 <td><input type='checkbox' name='look_AUTHOR' id='recherche_avancee_look_AUTHOR' value='1'[(#ENV{look_AUTHOR}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_AUTHOR'> Auteurs </label></td>
    67                                                                 <td><input type='checkbox' name='look_PUBLISHER' id='recherche_avancee_look_PUBLISHER' value='1'[(#ENV{look_PUBLISHER}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_PUBLISHER'> Editeurs </label></td>
     65                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_TITLE' value='TITLE'[(#VAL{TITLE}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_TITLE'> Titres </label></td>
     66                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_AUTHOR' value='AUTHOR'[(#VAL{AUTHOR}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_AUTHOR'> Auteurs </label></td>
     67                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_PUBLISHER' value='PUBLISHER'[(#VAL{PUBLISHER}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_PUBLISHER'> Editeurs </label></td>
    6868                                                        </tr>
    6969                                                        <tr class="row_odd">
    70                                                                 <td><input type='checkbox' name='look_COLLECTION' id='recherche_avancee_look_COLLECTION' value='1'[(#ENV{look_COLLECTION}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_COLLECTION'> Collections </label></td>
    71                                                                 <td><input type='checkbox' name='look_SUBCOLLECTION' id='recherche_avancee_look_SUBCOLLECTION' value='1'[(#ENV{look_SUBCOLLECTION}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_SUBCOLLECTION'> Sous-collections </label></td>
    72                                                                 <td><input type='checkbox' name='look_CATEGORY' id='recherche_avancee_look_CATEGORY' value='1'[(#ENV{look_CATEGORY}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_CATEGORY'> Cat&eacute;gories </label></td>
     70                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_COLLECTION' value='COLLECTION'[(#VAL{COLLECTION}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_COLLECTION'> Collections </label></td>
     71                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_SUBCOLLECTION' value='SUBCOLLECTION'[(#VAL{SUBCOLLECTION}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_SUBCOLLECTION'> Sous-collections </label></td>
     72                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_CATEGORY' value='CATEGORY'[(#VAL{CATEGORY}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_CATEGORY'> Cat&eacute;gories </label></td>
    7373                                                        </tr>
    7474                                                        <tr class="row_even">
    75                                                                 <td><input type='checkbox' name='look_KEYWORDS' id='recherche_avancee_look_KEYWORDS' value='1'[(#ENV{look_KEYWORDS}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_KEYWORDS'> Tags</label></td>
    76                                                                 <td><input type='checkbox' name='look_ABSTRACT' id='recherche_avancee_look_ABSTRACT' value='1'[(#ENV{look_ABSTRACT}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_ABSTRACT'> R&eacute;sum&eacute; et notes </label></td>
    77                                                                 <td><input type='checkbox' name='look_ALL' id='recherche_avancee_look_ALL' value='1'[(#ENV{look_ALL}|=={1}|oui)checked="checked"] /><label for='look_ALL'> Tous les champs </label></td>
     75                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_KEYWORDS' value='KEYWORDS'[(#VAL{KEYWORDS}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_KEYWORDS'> Tags</label></td>
     76                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_ABSTRACT' value='ABSTRACT'[(#VAL{ABSTRACT}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_ABSTRACT'> R&eacute;sum&eacute; et notes </label></td>
     77                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_ALL' value='ALL'[(#VAL{ALL}|in_any{#ENV{look}}|oui)checked="checked"] /><label for='recherche_avancee_look_ALL'> Tous les champs </label></td>
    7878                                                        </tr>
    7979                                                        <tr class="row_odd">
    80                                                                 <td><input type='checkbox' name='look_INDEXINT' id='recherche_avancee_look_INDEXINT' value='1'[(#ENV{look_INDEXINT}|=={1}|oui)checked="checked"]  /><label for='recherche_avancee_look_INDEXINT'> Indexations d&eacute;cimales </label></td>
     80                                                                <td><input type='checkbox' name='look[]' id='recherche_avancee_look_INDEXINT' value='INDEXINT'[(#VAL{INDEXINT}|in_any{#ENV{look}}|oui)checked="checked"]  /><label for='recherche_avancee_look_INDEXINT'> Indexations d&eacute;cimales </label></td>
    8181                                                                <td></td>
    8282                                                                <td></td>
  • _plugins_/spip-pmb/trunk/inclure/inc-recherche-pmb_catalogue.html

    r56901 r56928  
    1 [(#SET{tab_resultat, [(#ENV**{recherche}|urldecode|pmb_prepare_recherche|sinon{*}
    2         |pmb_recherche_extraire{#ENV{look_ALL,0}, #ENV{look_AUTHOR,0}, #ENV{look_PUBLISHER,0}, #ENV{look_COLLECTION,0}, #ENV{look_SUBCOLLECTION,0}, #ENV{look_CATEGORY, 0}, #ENV{look_INDEXINT}, #ENV{look_KEYWORDS,0}, #ENV{look_TITLE,0}, #ENV{look_ABSTRACT,0}, #ENV{id_section,0}, #ENV{debut,0}, #ENV{fin,5}, #ENV{typdoc,''}, #ENV{id_location_memo,''}})]})]
    3 
    4 [(#REM) le nombre de resultats est stocke dans la cle 0 ... ]
    5 #SET{nb_resultats,#GET{tab_resultat/0/nb_resultats}}
    6 #SET{tab_resultat,#GET{tab_resultat}|depile}
    7 
    8 
    9 [(#SET{url,[(#ENV{id_section}
    10         |?{#URL_PAGE{catalogue},#URL_PAGE{recherche}}
    11         |parametre_url{recherche,[(#ENV{recherche}|urldecode)]}
    12         |parametre_url{look_PMB,1}
    13         |parametre_url{look_ALL,#ENV{look_ALL}}
    14         |parametre_url{look_AUTHOR,#ENV{look_AUTHOR}}
    15         |parametre_url{look_PUBLISHER,#ENV{look_PUBLISHER}}
    16         |parametre_url{look_COLLECTION,#ENV{look_COLLECTION}}
    17         |parametre_url{look_SUBCOLLECTION,#ENV{look_SUBCOLLECTION}}
    18         |parametre_url{look_CATEGORY,#ENV{look_CATEGORY}}
    19         |parametre_url{look_INDEXINT,#ENV{look_INDEXINT}}
    20         |parametre_url{look_KEYWORDS,#ENV{look_KEYWORDS}}
    21         |parametre_url{look_TITLE,#ENV{look_TITLE}}
    22         |parametre_url{look_ABSTRACT,#ENV{look_ABSTRACT}}
    23         |parametre_url{typdoc,#ENV{typdoc}}
    24         |parametre_url{id_location_memo,#ENV{id_location_memo}}
    25         |parametre_url{id_section,#ENV{id_section}})]})]
    26 
    27 
    281<a id="resultats_recherche"></a>
    292<div class="liste articles avec_resume pmb">
    30         <B_tab_resultat>
     3        <B_recherche>
    314        <h2 class="h2"><:pmb:resultats_dans_catalogue:></h2>
    325
    33         [(#INCLURE{fond=inclure/nb_resultats,resultats=#GET{nb_resultats},debut,fin,url=#GET{url}})]
    34 
     6        #PMB_AFFICHE_INFOS_NOMBRE
     7       
     8        [<p class="pagination">(#PAGINATION)</p>]
     9       
    3510        <ul class="liste-items items">
    36         <BOUCLE_tab_resultat(DATA){source tableau,#GET{tab_resultat}}>
     11        <BOUCLE_recherche(PMB:NOTICES){rechercher}
     12                        {id_section ?}{id_location_memo ?}{look ?}{pagination 5}>
    3713                [(#SET{url_ret,[(#GET{url}|parametre_url{debut,#ENV{debut}}|trim|urlencode)]})]
    38                 <INCLURE{fond=inclure/inc-notice-resume}{id}{url_ret=#GET{url_ret}}{surlignable=0}{compteur=#COMPTEUR_BOUCLE}>
    39         </BOUCLE_tab_resultat>
     14                [(#INCLURE{fond=inclure/inc-notice-resume}{id}
     15                        {url_ret=#SELF}{surlignable=0}{compteur=#COMPTEUR_BOUCLE})]
     16        </BOUCLE_recherche>
    4017        </ul>
    4118
    42         [(#INCLURE{fond=inclure/nb_resultats,resultats=#GET{nb_resultats},debut,fin,bilan=non,url=#GET{url}})]
    43 
    44         </B_tab_resultat>
     19        [<p class="pagination">(#PAGINATION)</p>]
     20       
     21        </B_recherche>
    4522                <:pmb:pas_d_ouvrages_trouves:>
    46         <//B_tab_resultat>
     23        <//B_recherche>
    4724</div>
  • _plugins_/spip-pmb/trunk/paquet.xml

    r56883 r56928  
    22        prefix="pmb"
    33        categorie="divers"
    4         version="1.109.0"
     4        version="1.110.0"
    55        etat="dev"
    66        compatibilite="[3.0.0-beta2;3.0.*]"
  • _plugins_/spip-pmb/trunk/pmb_fonctions.php

    r56880 r56928  
    134134}
    135135
     136
    136137/* aucune occurrence ? */
    137138function pmb_notices_section_extraire($id_section, $debut=0, $fin=5) {
     
    283284}
    284285
     286/**
     287 * Retourne la liste des identifiants de notices trouvees
     288 *
     289 * @param Array $demande
     290 *              Description des différentes criteres de recherche (cle/valeur)
     291 *              - recherche
     292 *
     293 * @param int $nbTotal
     294 *              Sera renseigne par le nombre total de resultats trouves
     295 *
     296 * @param int $debut
     297 *              Position du premier resultat renvoye
     298 *
     299 * @param int $nombre
     300 *              Nombre de resultats renvoyes
     301 *
     302 * @return array
     303 *              Ids des notices trouvees
     304**/
     305function pmb_ids_notices_recherches($demande, &$nbTotal, $debut=0, $nombre=5, $pagination=false) {
     306       
     307        $recherche   = $demande['recherche'];
     308        $id_section  = $demande['id_section'];
     309        $id_location = $demande['id_location'];
     310        $typdoc      = $demande['type_document'];
     311        $look        = $demande['look'];
     312        if (!$look) $look = array();
     313        $look = array_flip($look);
     314        $tous = true;
     315
     316       
     317       
     318        // si tout coche
     319        if (isset($look['ALL'])) {
     320                $tous = true;
     321        // ou tout pas coche mais autre chose de coche...
     322        } elseif (count($look)) {
     323                $tous = false;
     324        }
     325       
     326        if ($recherche=='*') {
     327                $recherche='';
     328        }
     329       
     330        $searchType = 0;
     331        $sort = '';
     332        $ids = array();
     333        $debut;   // indice du premier resultat
     334        $nombre;  // nombre de resultats
     335
     336        // types de recherches
     337        $types = array(
     338                'TITLE' => 1,
     339                'AUTHOR' => 2,
     340                'PUBLISHER' => 3,
     341                'COLLECTION' => 4,
     342                'CATEGORY' => 6,
     343        );
     344        // je reproduis a peu pres tel que le code d'avant
     345        // mais c'est assez etrange que si plusieurs choses
     346        // sont cochees, c'est le dernier type qui est pris
     347        // (le plus eleve)
     348        foreach ($types as $nom=>$index) {
     349                if (isset($look[$nom]) and $look[$nom]) {
     350                        $searchType = $index;
     351                }
     352        }
     353
     354        // ajout des criteres de recherche.
     355        if ($recherche) {
     356                $search[] = array("inter"=>"or", "field"=>42, "operator"=>"BOOLEAN", "value"=>$recherche);
     357
     358                $look_correspondances = array(
     359                        'TITLE' => 1,
     360                        'AUTHOR' => 2,
     361                        'PUBLISHER' => 3,
     362                        'COLLECTION' => 4,
     363                        'ABSTRACT' => 10,
     364                        'CATEGORY' => 11,
     365                        'INDEXINT' => 12,
     366                        'KEYWORDS' => 13,
     367                );
     368                foreach ($look_correspondances as $nom=>$id) {
     369                        if (isset($look[$nom]) and $look[$nom]) {
     370                                $search[] = array("inter"=>"or", "field"=>$id, "operator"=>"BOOLEAN", "value"=>$recherche);
     371                        }
     372                }
     373        }
     374
     375        if ($typdoc)            $search[] = array("inter"=>"and", "field"=>15, "operator"=>"EQ", "value"=>$typdoc);
     376        if ($id_section)        $search[] = array("inter"=>"and", "field"=>17, "operator"=>"EQ", "value"=>$id_section);
     377        if ($id_location)       $search[] = array("inter"=>"and", "field"=>16, "operator"=>"EQ", "value"=>$id_location);
     378
     379        try {
     380                $ws = pmb_webservice();
     381
     382                // demande de recherche...
     383                if ($tous and !$id_section and !$id_location) {
     384                        $r = $ws->pmbesOPACAnonymous_simpleSearch($searchType,$recherche);
     385                } else {
     386                        $r=$ws->pmbesOPACAnonymous_advancedSearch($search);
     387                }
     388
     389                // on obtient une cle specifique a PMB avec le nombre de resultats... c'est tout.
     390                $searchId=$r->searchId;
     391                $nbTotal = $r->nbResults;
     392
     393                // pas de nombre... pas la peine de continuer !
     394                if ($nbTotal) {
     395                        // le critere de tri semble dependre de ce qui a ete defini dans PMB dans une table 'tris'
     396                        // l'inconvenient ici, c'est que PMB retourne tous les champs
     397                        // et pas uniquement l'identifiant, ce qui est inutile et charge la connexion
     398                        // et le travail de PMB, mais il n'y a pas de moyen a cette heure ci pour ne demmander que les ids.
     399                        $r=$ws->pmbesOPACAnonymous_fetchSearchRecordsArraySorted($searchId,$debut,$nombre,"utf-8",false,false,$sort);
     400                        if (is_array($r)) {
     401                                foreach ($r as $n) {
     402                                        $ids[] = $n->id;
     403                                }
     404                        }
     405                        // la, on fait un truc rigolo pour SPIP...
     406                        // on remplit de 0 avant le debut, et apres la fin de la pagination
     407                        // jusqu'au nombre de resultats, pour faire croire que tous les elements
     408                        // sont la.
     409                        // 15 resultats, debut = 5, nb = 5
     410                        // 0 0 0 0 0 2 4 5 12 18 0 0 0 0
     411                        if ($pagination) {
     412                                $vide = array_fill(0, $nbTotal, 0); // que des 0
     413                                array_splice($vide, $debut, $nombre, $ids);
     414                                $ids = $vide;
     415                        }
     416                }
     417        } catch (Exception $e) {
     418                echo 'Exception reçue (8) : ',  $e->getMessage(), "\n";
     419        }
     420
     421        return $ids;
     422}
     423
     424
    285425function pmb_recherche_extraire($recherche='', $look_ALL='', $look_AUTHOR='', $look_PUBLISHER='', $look_COLLECTION='', $look_SUBCOLLECTION='', $look_CATEGORY='', $look_INDEXINT='', $look_KEYWORDS='', $look_TITLE='', $look_ABSTRACT='', $id_section='', $debut=0, $fin=5, $typdoc='',$id_location='') {
    286426        $tableau_resultat = Array();
     
    293433                $recherche='';
    294434        }
     435
    295436
    296437        if ($look_ALL) {
     
    620761
    621762        if (!is_array($listenotices)) {
    622                 return false;
     763                return array();
    623764        }
    624765       
    625766        // on met en cache le resultat et on utilise le cache.
    626767        // afin d'optimiser si plusieurs boucles sont utilisees.
    627         static $notices = array();
     768        // par ailleurs, l'id 0, s'il se produit est incongru est
     769        // provient du hack pour la pagination de ce plugin.
     770        static $notices = array(0 => array());
     771       
    628772        $wanted = $listenotices;
    629773        // ce qu'on a trouve...
     
    648792                if (is_array($r)) {
    649793                        $r = array_map('pmb_ws_parser_notice', $r);
     794
    650795                        // on complete notre tableau de resultat
    651796                        // avec nos trouvailles
     
    660805                echo 'Exception reçue (14) : ',  $e->getMessage(), "\n";
    661806        }
    662        
     807        ksort($res);
    663808        return $res;
    664809}
     
    731876}
    732877
    733 // retourne un tableau associatif contenant tous les champs d'une notice
    734 function pmb_notice_extraire ($id_notice) {
    735         $tableau_resultat = pmb_ws_recuperer_tab_notices(array((string)$id_notice));
    736         $notice = array_shift($tableau_resultat);
    737         return $notice;
    738 }
    739878
    740879
    741880// retourne un tableau associatif contenant tous les champs d'un tableau d'id de notices
    742 function pmb_tabnotices_extraire ($tabnotices) {
    743         $listenotices = Array();
    744         if (is_array($tabnotices)) {
    745                 $listenotices = array_values($tabnotices);
    746         }
    747 
    748         return pmb_ws_recuperer_tab_notices($listenotices);
    749 }
     881function pmb_extraire_notices_ids($ids_notices) {
     882        if (!is_array($ids_notices)) {
     883                $ids_notices = array();
     884        }
     885
     886        return pmb_ws_recuperer_tab_notices($ids_notices);
     887}
     888
    750889
    751890// retourne un tableau associatif contenant les prêts en cours
  • _plugins_/spip-pmb/trunk/public/pmb.php

    r56901 r56928  
    7070        protected $type = '';
    7171
     72
     73        /**
     74         * Declarer les criteres exceptions
     75         * et pouvoir en ajouter au besoin
     76         * @return array
     77         */
     78        public function exception_des_criteres($add = '') {
     79                static $exceptions = array('tableau');
     80
     81                if (!$add) {
     82                        return $exceptions;
     83                }
     84                $exceptions[] = $add;
     85        }
     86       
    7287       
    7388        /**
     
    8297         */
    8398        protected function select($command) {
     99               
    84100                $tableau = array();
    85101                $this->type = strtolower($this->command['from'][0]);
    86 
    87102
    88103                // on ne garde pas les where vides
     
    97112                $cle = $this->creer_cle_cache();
    98113                if ($cache = $this->use_cache($cle)) {
     114                        // attention, il faut recalculer les filtres
     115                        // qui sont a supprimer de la boucle
     116                        // sinon l'usage du critere {rechercher} meurt en changeant de pagination :)
     117                        if ($exceptions = $this->use_cache($cle . '-filtres')) {
     118                                foreach ($exceptions as $ex) {
     119                                        $this->exception_des_criteres($ex);
     120                                }
     121                        }
    99122                        $this->tableau = $cache;
    100123                } else {
    101124                        $select = charger_fonction($this->type . '_select', 'inc', true);
    102                         $this->tableau = $select($this->command);
     125                        $this->tableau = $select($this->command, $this);
    103126
    104127                        // cache d'une heure par defaut.
     
    107130                        if (is_array($this->tableau) AND $ttl>0) {
    108131                                $this->cache_set($cle, $ttl);
     132                                $this->cache_set($cle.'-filtres', $ttl, $this->exception_des_criteres());
    109133                        }
    110134                }
     
    217241 * Notices issues des syndications d'articles
    218242 * (PMB:NOTICES) {nouveautes}
     243 *
     244 * Notices issues des recherches
     245 * (PMB:NOTICES) {rechercher}
     246 * (PMB:NOTICES) {rechercher}{look ?}
    219247 *
    220248 */
    221 function inc_pmb_notices_select_dist(&$command) {
    222         $criteres = &$command['where'];
     249function inc_pmb_notices_select_dist(&$command, $iterateur) {
     250        $criteres = $command['where'];
    223251       
    224252        // on peut fournir une liste l'id
     
    234262        // depuis un critere id=x ou {id?}
    235263        if ($id = pmb_critere_valeur($criteres, 'id')) {
    236                 if ($ids) {
    237                         $ids = array_intersect($ids, $id);
    238                 } else {
    239                         $ids = $id;
    240                 }
     264                $ids = pmb_intersect_ids($ids, $id);
    241265        }
    242266
     
    251275                // sauf si {nouveautes 3}
    252276                $nombre = pmb_interprete_argument_critere($criteres, 'nouveautes', 1);
    253                 $ids = pmb_ids_notices_nouveautes('', $nombre);
    254         }
    255        
     277                $idsn = pmb_ids_notices_nouveautes('', $nombre);
     278                $ids = pmb_intersect_ids($ids, $idsn);
     279        }
     280
     281
     282        // recherche de notices
     283        if (pmb_recherche_critere($criteres, 'rechercher')) {
     284                // valeur cherchee (parametre)
     285                $recherche = pmb_interprete_argument_critere($criteres, 'rechercher', 1);
     286                // valeur cherchee (env)
     287                if (!$recherche) {
     288                        $recherche = pmb_critere_valeur($criteres, 'rechercher');
     289                        // le premier trouve...
     290                        if ($recherche) {
     291                                $recherche = array_shift($recherche);
     292                        }
     293                }
     294                if (!$recherche) {
     295                        $recherche = '';
     296                }
     297                $iterateur->exception_des_criteres('rechercher');
     298
     299                $total_resultats = 0; // sera renseigne par la fonction de recherche
     300                $demande = array('recherche' => $recherche);
     301               
     302                // on prend au debut, et on limite la recherche a 100 elements
     303                $debut = '0'; $nombre = '5';
     304
     305                // si la boucle contient une limite {0,50}
     306                if ($command['limit']) {
     307                        list($debut, $nombre) = explode(',', $command['limit']);
     308                }
     309               
     310                // si la boucle contient une pagination {pagination 5}
     311                // on retrouve les valeurs de position et de pas, et on pose un
     312                // flag 'pagination' pour un hack sur la recherche
     313                // permettant de ne pas demander tous les resultats
     314                // mais seulement ceux a afficher dans le cadre en cours
     315                $pagination = false;
     316                if ($command['pagination']) {
     317                        list($debut, $nombre) = $command['pagination'];
     318                        if (!$debut) $debut = 0;
     319                        $pagination = true;
     320                }
     321
     322                // on affine notre demande avec d'autres contraintes si elles sont presentes.
     323                foreach (array(
     324                        'id_section' => 'id_section',
     325                        'id_location_memo' => 'id_location',
     326                        'id_location' => 'id_location',
     327                        'look' => 'look') as $nom=>$requete)
     328                {
     329                        if ($valeurs = pmb_critere_valeur($criteres, $nom)) {
     330                                $iterateur->exception_des_criteres($nom);
     331                                // on ajoute le premier venu...
     332                                $demande[$requete] = array_shift($valeurs);
     333                        }
     334                }
     335
     336                $idsr = pmb_ids_notices_recherches($demande, $total_resultats, $debut, $nombre, $pagination);
     337                $ids = pmb_intersect_ids($ids, $idsr);
     338                $iterateur->total = $total_resultats;
     339
     340        }
     341
    256342        // retourner les notices selectionnees
    257         $res = pmb_tabnotices_extraire($ids);
     343        $res = pmb_extraire_notices_ids($ids);
    258344
    259345        return $res;
     
    261347
    262348
     349// retourne l'intersection des ids trouves
     350// equivalent {...} AND {...}
     351function pmb_intersect_ids($anciens, $nouveaux) {
     352        if ($anciens) {
     353                return array_intersect($anciens, $nouveaux);
     354        }
     355        return $nouveaux;
     356}
    263357
    264358/**
     
    294388        foreach ($criteres as $c) {
    295389                if (is_array($c) AND $c[0] == $op AND $c[1] == $cle) {
    296                         $res[] = $c[2];
     390                        // enlever les guillemets si presents
     391                        $v = $c[2];
     392                        if (($v[0] == "'") and ($v[ count($v)-1 ] == "'")) {
     393                                $v = substr($v, 1,-1);
     394                        }
     395                        $res[] = $v;
     396                // ((machin IN ('34','TRUC'))) // magnifique :/
     397                // ((look  IN ('PMB','FIRSTACCESS','ALL')))
     398                } elseif (is_string($c)) {
     399                        // cf iterateurs->calculer_filtres()
     400
     401                        $op = $c;
     402                       
     403                        // traiter {cle IN a,b} ou {valeur !IN a,b}
     404                        // prendre en compte le cas particulier de sous-requetes
     405                        // produites par sql_in quand plus de 255 valeurs passees a IN
     406                        if (preg_match_all(',\s+IN\s+(\(.*\)),', $op, $s_req)) {
     407                                $req = '';
     408                                foreach($s_req[1] as $key => $val) {
     409                                        $req .= trim($val, '(,)') . ',';
     410                                }
     411                                $req = '(' . rtrim($req, ',') . ')';
     412                        }
     413                        if (preg_match(',^\(\(([\w/]+)(\s+NOT)?\s+IN\s+(\(.*\))\)(?:\s+(AND|OR)\s+\(([\w/]+)(\s+NOT)?\s+IN\s+(\(.*\))\))*\)$,', $op, $regs)) {
     414                                // 1 'look'
     415                                // 2 NOT
     416                                // 3 ('TRUC','CHOSE')
     417                                if ($regs[1] == $cle and !$regs[2]) {
     418                                        $v = explode(',', trim($regs[3], ' ()'));
     419                                        // enlever tous les guillemets entourants
     420                                        foreach($v as $a=>$b) { $v[$a] = trim($b, "'"); }
     421                                        $res[] = $v;
     422                                }
     423                        }
     424
    297425                }
    298426        }
     
    304432 * Chercher la presence d'un critere dans le tableau where.
    305433 *
    306  * @return array, un element par valeur trouvee
     434 * @return bool vrai si critere trouve.
    307435**/
    308436function pmb_recherche_critere($criteres, $cle) {
    309         if (!is_array($criteres) OR !$criteres) {
     437        if (!is_array($criteres) OR !$criteres OR !$cle) {
    310438                return false;
    311439        }
     
    434562        return $p;
    435563}
     564
     565
     566/**
     567 * Pour afficher dans une boucle notices avec {pagination}
     568 * "Résultats de x à y sur z ouvrages"
     569**/
     570function balise_PMB_AFFICHE_INFOS_NOMBRE_dist($p) {
     571        $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
     572       
     573        $pas = $p->boucles[$b]->total_parties;
     574        $type = $p->boucles[$b]->modificateur['debut_nom'];
     575        $nb = "(isset(\$Numrows['$b']['grand_total']) ? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'])";
     576
     577        $p->boucles[$b]->numrows = true;
     578        $p->code = "recuperer_fond('inclure/inc-affiche_infos_nombre', array(
     579                'resultats' => $nb,
     580                'debut' => _request('debut' . $type),
     581                'fin' => $pas))";
     582        return $p;
     583}
     584
    436585?>
Note: See TracChangeset for help on using the changeset viewer.