Changeset 56963 in spip-zone


Ignore:
Timestamp:
Jan 12, 2012, 11:15:22 AM (8 years ago)
Author:
marcimat@…
Message:

Passage des auteurs en boucle (PMB:AUTEURS){id_auteur}
Et on permet également (PMB:NOTICES){id_auteur}

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

Legend:

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

    r56891 r56963  
    1 [(#SET{tab_resultat,[(#ENV{id_auteur}|pmb_auteur_extraire{#ENV{debut,0},#ENV{fin,5}})]})
    2 ]
     1<BOUCLE_auteur(PMB:AUTEURS){id_auteur}>
     2
    33
    44[(#REM) Fil d'Ariane ]
    55<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a>
     6&gt; <a href="#URL_PMB_CATALOGUE"><:pmb:catalogue:></a>
    67&gt; <:pmb:auteurs:>
    7 &gt; <strong class="on">[(#GET{tab_resultat/author_nomcomplet}|couper{80})]</strong></p>
     8&gt; <strong class="on">[(#NOMCOMPLET|couper{80})]</strong></p>
    89
    910
    1011<div class="cartouche">
    11         <h1 class="h1">#GET{tab_resultat/author_nomcomplet}</h1>
     12        <h1 class="h1">#NOMCOMPLET</h1>
    1213</div>
    1314
    14 <INCLURE{fond=inclure/inc-pmb_auteur}{env}{tab_resultat=#GET{tab_resultat}}>
     15<INCLURE{fond=inclure/inc-pmb_auteur}{env}{id_auteur}>
     16
     17</BOUCLE_auteur>
  • _plugins_/spip-pmb/trunk/inclure/inc-pmb_auteur.html

    r56891 r56963  
     1<BOUCLE_auteur(PMB:AUTEURS){id_auteur}>
    12<div class="corps-conteneur surlignable">
    23        [(#REM) seulement si du contenu... ]
    3         [(#ENV{notice/serie}
    4                 |ou{#ENV{tab_resultat/author_date}}
    5                 |ou{#ENV{tab_resultat/author_web}}
    6                 |ou{#ENV{tab_resultat/author_lieu}}
    7                 |ou{#ENV{tab_resultat/author_ville}}
    8                 |ou{#ENV{tab_resultat/author_pays}})
     4        [(#VALEUR{date}|ou{#WEB}|ou{#LIEU}|ou{#VILLE}|ou{#PAYS})
    95        <div class="pmb-ouvrage-infos">
    106                <table class="spip pmb-tableau">
    117                        <tbody>
    12                         [<tr><td><strong><:pmb:serie:></strong></td><td>(#ENV{notice/serie})</td></tr>]
    13                         [<tr><td><strong><:pmb:author_date:></strong></td><td>(#ENV{tab_resultat/author_date})</td></tr>]
     8                        [<tr>
     9                                <td><strong><:pmb:author_date:></strong></td>
     10                                <td>(#VALEUR{date})</td></tr>]
    1411                        [<tr>
    1512                                <td><strong><:pmb:author_web:></strong></td>
    16                                 <td><a class="spip_out" href="[(#ENV{tab_resultat/author_web})]">(#ENV{tab_resultat/author_web})</a></td>
     13                                <td><a class="spip_out" href="#WEB">(#WEB)</a></td>
    1714                        </tr>]
    18                         [<tr><td><strong><:pmb:author_lieu:></strong></td><td>(#ENV{tab_resultat/author_lieu})</td></tr>]
    19                         [<tr><td><strong><:pmb:author_ville:></strong></td><td>(#ENV{tab_resultat/author_ville})</td></tr>]
    20                         [<tr><td><strong><:pmb:author_pays:></strong></td><td>(#ENV{tab_resultat/author_pays})</td></td>]
     15                        [<tr>
     16                                <td><strong><:pmb:author_lieu:></strong></td>
     17                                <td>(#LIEU)</td>
     18                        </tr>]
     19                        [<tr>
     20                                <td><strong><:pmb:author_ville:></strong></td>
     21                                <td>(#VILLE)</td>
     22                        </tr>]
     23                        [<tr>
     24                                <td><strong><:pmb:author_pays:></strong></td>
     25                                <td>(#PAYS)</td></td>
     26                        </tr>]
    2127                        </tbody>
    2228                </table>
    2329        </div>
    2430        ]
    25         [<div class="texte entry-content">(#ENV{tab_resultat/author_comment}|ucfirst|paragrapher)</div>]
     31        [<div class="texte entry-content">(#COMMENTAIRE|ucfirst|paragrapher)</div>]
    2632</div>
    2733
    28 [(#INCLURE{fond=inclure/inc-recherche-ouvrage,env})]
     34[(#INCLURE{fond=inclure/inc-recherche-notices,env,id_auteur})]
     35</BOUCLE_auteur>
    2936
     37
     38
  • _plugins_/spip-pmb/trunk/pmb_fonctions.php

    r56961 r56963  
    247247}
    248248
     249
     250
     251/**
     252 * Recupere les informations d'auteurs
     253 * dont les identifiants sont fournis par
     254 * le tableau $ids_auteurs.
     255 *
     256 * Chaque identifiant calcule est mis en cache
     257 * pour eviter des requetes intempestives
     258 * sur un hit de page et permettre d'utiliser plusieurs
     259 * fois une boucle telle que (PMB:AUTEURS){id}
     260 * sans avoir besoin de tout recalculer.
     261 *
     262 * Notons que l'on ne peut recuperer que les champs "exportables"
     263 * dans PMB.
     264 *
     265 * @param array $ids_auteurs
     266 *              Tableau d'id d'auteurs a recupereer
     267 * @return array
     268 *              Tableau contenant pour chaque auteur la liste des champs
     269 *              que l'on a pu recuperer.
     270**/
    249271function pmb_extraire_auteurs_ids($ids_auteur) {
    250272        if (!is_array($ids_auteur)) {
     
    252274        }
    253275       
    254         return array();
    255 }
    256 
    257 function pmb_auteur_extraire($id_auteur, $debut=0, $nbresult=5, $id_session=0) {
    258         $tableau_resultat = Array();
    259        
    260         try {
    261                 $ws = pmb_webservice();
    262                 $result = $ws->pmbesAuthors_get_author_information_and_notices($id_auteur,$id_session);
    263                 if ($result) {
    264                         $tableau_resultat['author_id']     = $result->information->author_id;
    265                         $tableau_resultat['author_type']   = $result->information->author_type;
    266                         $tableau_resultat['author_name']   = $result->information->author_name;
    267                         $tableau_resultat['author_rejete'] = $result->information->author_rejete;
    268                         if ($result->information->author_rejete) {
    269                                 $tableau_resultat['author_nomcomplet'] =  $tableau_resultat['author_rejete'].' '.$tableau_resultat['author_name'];
    270                         } else {
    271                                 $tableau_resultat['author_nomcomplet'] = $tableau_resultat['author_name'];
    272                         }
    273 
    274                         $tableau_resultat['author_see']      = $result->information->author_see;
    275                         $tableau_resultat['author_date']     = $result->information->author_date;
    276                         $tableau_resultat['author_web']      = $result->information->author_web;
    277                         $tableau_resultat['author_comment']  = $result->information->author_comment;
    278                         $tableau_resultat['author_lieu']     = $result->information->author_lieu;
    279                         $tableau_resultat['author_ville']    = $result->information->author_ville;
    280                         $tableau_resultat['author_pays']     = $result->information->author_pays;
    281                         $tableau_resultat['author_subdivision'] = $result->information->author_subdivision;
    282                         $tableau_resultat['author_numero']      = $result->information->author_numero;
    283                         $tableau_resultat['notice_ids'] = Array();
    284 
    285                         pmb_extraire_resultats($result, $tableau_resultat, $debut, $nbresult);
    286                 }
     276        // retrouver les infos en cache
     277        list($res, $wanted) = pmb_cacher('auteurs', $ids_auteur);
     278
     279        // si on a tout trouve, on s'en va...
     280        if (!count($wanted)) {
     281                return $res;
     282        }
     283
     284        try {
     285                $ws = pmb_webservice();
     286                foreach ($wanted as $id_auteur) {
     287                        // second parametre $id_session n'etait pas utilise... kesako ?
     288                        $r = $ws->pmbesAuthors_get_author_information_and_notices($id_auteur);
     289                        if ($r) {
     290                                //infos de l'auteur
     291                                $a = array();
     292                                $a['id_auteur']                 = $r->information->author_id;
     293                                $a['id_type_auteur']    = $r->information->author_type;
     294                                $a['nom']                               = $r->information->author_name;
     295                                $a['prenom']                    = $r->information->author_rejete;
     296                                if ($r->information->author_rejete) {
     297                                        $a['nomcomplet'] =  $a['prenom'].' '.$a['nom'];
     298                                } else {
     299                                        $a['nomcomplet'] = $a['nom'];
     300                                }
     301                                // what's 'see' ?
     302                                $a['id_voir']                   = $r->information->author_see;
     303                                $a['date']                              = $r->information->author_date;
     304                                $a['web']                               = $r->information->author_web;
     305                                $a['commentaire']               = $r->information->author_comment;
     306                                $a['lieu']                              = $r->information->author_lieu;
     307                                $a['ville']                             = $r->information->author_ville;
     308                                $a['pays']                              = $r->information->author_pays;
     309                                $a['subdivision']               = $r->information->author_subdivision;
     310                                $a['numero']                    = $r->information->author_numero;
     311                                $a['ids_notice']                = $r->notice_ids;
     312
     313                                $key = array_search($id_auteur, $ids_auteur);
     314                                if ($key !== false) {
     315                                        $res[$key] = $a;
     316                                        pmb_cacher('notices', $id_auteur, $a, true);
     317                                }
     318                        }
     319                }
     320
    287321        } catch (Exception $e) {
    288322                 echo 'Exception reçue (7) : ',  $e->getMessage(), "\n";
    289         }
    290         return $tableau_resultat;
    291 
    292 }
     323        }
     324
     325        return $res;
     326}
     327
    293328
    294329/**
     
    680715
    681716/**
     717 * Sauve ou restaure un cache d'information
     718 * sur la base [$type_cache][$id] = valeur
     719 *
     720 * @param string $type
     721 *              Le type de cache (notices, auteurs, ...)
     722 * @param int|array $id
     723 *              L'identifiant desire ou une liste d'identifiants desires
     724 * @param mixed $valeur
     725 *              La valeur a stocker si stockage demande
     726 * @param bool $set
     727 *              Est-ce un stockage demande ?
     728 * @return mixed
     729 *              Si stockage : true
     730 *              Sinon,
     731 *              si $id simple, sa $valeur enregistree
     732 *              si $id tableau, retourne array($res, $wanted),
     733 *              2 tableaux contenants les resultats trouves et ceux non trouves
     734 *              en conservant les cles du tableau $id en entree.
     735**/
     736function pmb_cacher($type, $id, $valeur=null, $set=false) {
     737        static $cache = array();
     738        if (!isset($cache[$type])) {
     739                // Par ailleurs, l'id 0, s'il se produit est incongru est
     740                // provient du hack pour la pagination de ce plugin.
     741                $cache[$type] = array(0 => array());
     742        }
     743       
     744        // mise en cache
     745        if ($set) {
     746                $cache[$type][$id] = $valeur;
     747                return true;
     748        }
     749       
     750        // lecture du cache
     751        // 1 seul element demande
     752        if (!is_array($id)) {
     753                return $cache[$type][$id];
     754        }
     755       
     756        // n elements demandes...
     757        // id est un tableau d'id
     758        // on retourne un tableau $res et $wanted
     759        // contenant ce qu'on a et ce qu'on n'a pas.
     760        $wanted = $id;
     761        // ce qu'on a trouve...
     762        $res = array();
     763       
     764        foreach ($id as $c=>$l) {
     765                if (isset($cache[$type][$l])) {
     766                        $res[$c] = $cache[$type][$l];
     767                        unset($wanted[$c]);
     768                }
     769        }
     770        return array($res, $wanted);
     771}
     772
     773/**
    682774 * Recupere les informations de notices
    683775 * dont les identifiants sont fournis par
     
    697789 * @return array
    698790 *              Tableau contenant pour chaque notice la liste des champs
    699  *              que l'on a pa recuperer.
     791 *              que l'on a pu recuperer.
    700792**/
    701793function pmb_extraire_notices_ids($ids_notices) {
     
    704796        }
    705797
    706         // On met en cache le resultat et on utilise le cache.
    707         // afin d'optimiser si plusieurs boucles sont utilisees.
    708        
    709         // Par ailleurs, l'id 0, s'il se produit est incongru est
    710         // provient du hack pour la pagination de ce plugin.
    711         static $notices = array(0 => array());
    712        
    713         $wanted = $ids_notices;
    714         // ce qu'on a trouve...
    715         $res = array();
    716        
    717         foreach ($ids_notices as $c=>$l) {
    718                 if (isset($notices[$l])) {
    719                         $res[$c] = $notices[$l];
    720                         unset($wanted[$c]);
    721                 }
    722         }
     798        // retrouver les infos en cache
     799        list($res, $wanted) = pmb_cacher('notices', $ids_notices);
    723800
    724801        // si on a tout trouve, on s'en va...
     
    739816                                $key = array_search($notice['id'], $ids_notices);
    740817                                if ($key !== false) {
    741                                         $notices[ $notice['id'] ] = $res[$key] = $notice;
     818                                        $res[$key] = $notice;
     819                                        pmb_cacher('notices', $notice['id'], $notice, true);
    742820                                }
    743821                        }
  • _plugins_/spip-pmb/trunk/public/pmb.php

    r56961 r56963  
    242242 * (PMB:NOTICES) {nouveautes}
    243243 *
     244 * Notices issues des auteurs
     245 * (PMB:NOTICES) {id_auteur}
     246 *
    244247 * Notices issues des recherches
    245248 * (PMB:NOTICES) {rechercher}
     
    279282        }
    280283
     284        // id_auteur : trouver les notices d'un auteur
     285        if ($id = pmb_critere_valeur($criteres, 'id_auteur')) {
     286                foreach ($id as $id_auteur) {
     287                        // tout le temps sauf si IN
     288                        if (!is_array($id_auteur)) {
     289                                $id_auteur = array($id_auteur);
     290                        }
     291                        $auteurs = pmb_extraire_auteurs_ids($id_auteur);
     292                        if ($auteurs) {
     293                                $n = array();
     294                                foreach ($auteurs as $a) {
     295                                        $n = array_unique(array_merge($n, $a['ids_notice']));
     296                                }
     297                                $ids = pmb_intersect_ids($ids, $n);
     298                        }
     299                }
     300                unset($auteurs);
     301        }
    281302
    282303        // recherche de notices
Note: See TracChangeset for help on using the changeset viewer.