Changeset 61367 in spip-zone


Ignore:
Timestamp:
May 17, 2012, 2:49:46 PM (7 years ago)
Author:
joseph@…
Message:
  • Sync avec les collections
  • recherche et zcollection dans les modèles

NB : on ne passe pas par le moteur de recherche de SPIP car id_zitem n'est pas un entier (du coup ça ne marche). De toute façon, l'ensemble de schamps sont dispo dans la forme Json ==> LIKE suffit

Location:
_plugins_/zotspip/trunk
Files:
1 added
10 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/zotspip/trunk/base/zotspip.php

    r59623 r61367  
    1515        $interface['tables_jointures']['spip_zitems'][]= 'zcreators';
    1616        $interface['tables_jointures']['spip_zitems'][]= 'zitems_zcollections';
    17         $interface['tables_jointures']['spip_zcollections'][]= 'zitems_zcollections';
     17        $interface['tables_jointures']['spip_zitems'][]= 'zcollections';
    1818        $interface['tables_jointures']['spip_ztags'][]= 'zitems';
    1919        $interface['tables_jointures']['spip_zcreators'][]= 'zitems';
     
    5151                "json" => "mediumtext DEFAULT '' NOT NULL",
    5252                "csljson" => "mediumtext DEFAULT '' NOT NULL",
    53                 "updated" => "varchar(50) DEFAULT '' NOT NULL",
    54                 "maj" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"
     53                "updated" => "varchar(50) DEFAULT '' NOT NULL"
    5554        );
    5655       
     
    7069                "id_parent" => "varchar(16) DEFAULT '' NOT NULL",
    7170                "zcollection" => "text DEFAULT '' NOT NULL",
    72                 "updated" => "varchar(50) DEFAULT '' NOT NULL",
    73                 "maj" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"
     71                "updated" => "varchar(50) DEFAULT '' NOT NULL"
    7472        );
    7573       
  • _plugins_/zotspip/trunk/formulaires/maj_zotspip.php

    r59617 r61367  
    1414function formulaires_maj_zotspip_traiter_dist(){
    1515        include_spip('inc/zotspip');
    16         if (_request('nettoyer')) zotspip_nettoyer(); // Eviter de nettoyer à chaque tour, la première fois suffit
    1716        $forcer = (_request('sync_complete')) ? true : false;
     17        if (_request('nettoyer')) {
     18                zotspip_nettoyer(); // Eviter de nettoyer à chaque tour, la première fois suffit
     19                zotspip_maj_collections($forcer); // De meme, pour les collections, un seul appel suffit
     20        }
     21       
    1822        $cont = zotspip_maj_items($forcer);
    1923       
  • _plugins_/zotspip/trunk/inc/zotspip.php

    r60188 r61367  
    3030function zotspip_extraire_itemkey($url){
    3131        if (preg_match('#items/(.*)\?#',$url,$matches))
     32                return $matches[1];
     33        else
     34                return '';
     35}
     36
     37// Extraire l'identifiant d'une collection à partir de l'URL
     38function zotspip_extraire_collectionkey($url){
     39        if (preg_match('#collections/(.*)$#',$url,$matches))
    3240                return $matches[1];
    3341        else
     
    248256}
    249257
     258// Mise à jour des collections
     259// $forcer : forcer la mise à jour complète de la base
     260function zotspip_maj_collections($forcer=false) {
     261        $feed = zotero_get('collections/?format=atom&order=dateModified&sort=desc');
     262        // On vérifie qu'on a bien eu un retour
     263        if (!$feed)
     264                return 0;
     265       
     266        // On parse le flux ATOM reçu
     267        include_spip('inc/xml');
     268        $xml = spip_xml_parse($feed, false);
     269       
     270        if (spip_xml_match_nodes(',^entry,', $xml, $entrees)){
     271                include_spip('base/abstract_sql');
     272                foreach ($entrees['entry'] as $entree) {
     273                        $id_zcollection = spip_xml_aplatit($entree['zapi:key']);
     274                        $updated = spip_xml_aplatit($entree['updated']);
     275                       
     276                        // Faire une vérification sur la date de maj (seulement si on ne force pas)
     277                        if (!$zotspip_maj_items['forcer']) {
     278                                if ($updated==sql_getfetsel('updated','spip_zcollections','id_zitem='.sql_quote($id_zitem))) {
     279                                        return 1;
     280                                }
     281                        }
     282                       
     283                        // On initialise la ligne SQL à insérer
     284                        $insertion = array(
     285                                'id_zcollection' => $id_zcollection,
     286                                'id_parent' => '0', // 0 si pas de parent
     287                                'zcollection' => spip_xml_aplatit($entree['title']),
     288                                'updated' => $updated
     289                        );
     290                       
     291                        // On récupère la collection parente
     292                        $links = array(); // NB : il faut réinitialiser $links sinon les résultats s'accumulent
     293                        if (spip_xml_match_nodes(',^link,', $entree, $links)) {
     294                                foreach (array_keys($links) as $link){
     295                                        list($balise, $attributs) = spip_xml_decompose_tag($link);
     296                                        if ($attributs['rel'] == 'up')
     297                                                $insertion['id_parent'] = zotspip_extraire_collectionkey($attributs['href']);
     298                                }
     299                        }
     300                       
     301                        // Items de la collection
     302                        $items = zotero_get("collections/$id_zcollection/items/?format=keys");
     303                        $items = explode("\n",trim($items));
     304                        $zitems_zcollections = array();
     305                        foreach ($items as $item)
     306                                $zitems_zcollections[] = array('id_zitem' => $item, 'id_zcollection' => $id_zcollection);
     307                       
     308                        // Insertion en base de données
     309                        sql_replace('spip_zcollections',$insertion);
     310                        sql_delete('spip_zitems_zcollections','id_zcollection='.sql_quote($id_zcollection));
     311                        if (count($zitems_zcollections)) sql_insertq_multi('spip_zitems_zcollections',$zitems_zcollections);
     312                }
     313        }
     314       
     315        return 1; //0 si rien à faire, 1 si effectuée, -5 si tâche pas finie
     316}
     317
    250318// Nettoyer la base de données
    251319function zotspip_nettoyer() {
     320        include_spip('base/abstract_sql');
    252321        // Suppression des items qui ne sont plus dans la base
    253322        $feed = zotero_get('items/?format=keys');
    254323        if ($feed) {
    255324                $items_zotero = explode("\n",trim($feed));
    256                 include_spip('base/abstract_sql');
    257325                $requete = sql_allfetsel('id_zitem','spip_zitems');
    258326                $items_spip = array();
     
    263331                        zotspip_supprimer_item($id_zitem);
    264332        }
     333        // Suppression des collections qui ne sont plus dans la base
     334        $feed2 = zotero_get('collections/?format=keys');
     335        if ($feed2) {
     336                $collections_zotero = explode("\n",trim($feed2));
     337                $requete = sql_allfetsel('id_zcollection','spip_zcollections');
     338                $collections_spip = array();
     339                foreach ($requete as $collection)
     340                        $collections_spip[] = $collection['id_zcollection'];
     341                $diff = array_diff($collections_spip,$collections_zotero);
     342                foreach ($diff as $id_zcollection)
     343                        zotspip_supprimer_collection($id_zcollection);
     344        }
    265345        return 1;
    266346}
     
    274354        sql_delete('spip_zitems','id_zitem='.sql_quote($id_zitem));
    275355}
     356
     357
     358// Supprimer une collection
     359function zotspip_supprimer_collection($id_zcollection) {
     360        include_spip('base/abstract_sql');
     361        sql_delete('spip_zcollections','id_zcollection='.sql_quote($id_zcollection));
     362        sql_delete('spip_zitems_zcollections','id_zcollection='.sql_quote($id_zcollection));
     363}
     364
    276365
    277366// Télécharge le schéma de données Zotero
  • _plugins_/zotspip/trunk/modeles/biblio.html

    r60188 r61367  
    1111}})]
    1212<B_biblio>
     13
     14recherche #ENV{recherche}
     15
    1316<ul class="spip">
    14 <BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{id_zcollection?}{recherche?}{zotsip_depuis}{0,#ENV{max,100000}}{tri #ENV{par,auteurs},#GET{defaut_tri}}>
     17<BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{zcollection?}{json ?LIKE %#ENV{recherche}%}{zotsip_depuis}{0,#ENV{max,100000}}{tri #ENV{par,auteurs},#GET{defaut_tri}}>
    1518#INCLURE{fond=inclure/zitem,id_zitem,csl,liste=oui,icones=oui,details=#GET{details},export=#GET{export},liens=#GET{liens},souligne=#GET{souligne}}
    1619</BOUCLE_biblio>
  • _plugins_/zotspip/trunk/modeles/biblio_annee.html

    r60188 r61367  
    44#SET{souligne,#ENV{auteur}|et{#ENV{souligne}|!={non}}|?{#ENV{auteur},''}}
    55<B_biblio>
    6 <BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{id_zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{!par annee}{par auteurs}{recherche?}>
     6<BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{!par annee}{par auteurs}{json ?LIKE %#ENV{recherche}%}>
    77[[(#COMPTEUR_BOUCLE|>{1}|oui)</ul>]<h4 class="h4">(#ANNEE|=={0}|?{<:zotspip:annee_non_precisee:>,#ANNEE}|unique)</h4><ul class="spip">]
    88#INCLURE{fond=inclure/zitem,id_zitem,csl,liste=oui,icones=oui,details=#GET{details},export=#GET{export},liens=#GET{liens},souligne=#GET{souligne}}
  • _plugins_/zotspip/trunk/modeles/biblio_annee_type.html

    r60188 r61367  
    44#SET{souligne,#ENV{auteur}|et{#ENV{souligne}|!={non}}|?{#ENV{auteur},''}}
    55<B_biblio>
    6 <BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{id_zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{!par annee}{par type}{par auteurs}{recherche?}>
     6<BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{!par annee}{par type}{par auteurs}{json ?LIKE %#ENV{recherche}%}>
    77#SET{ouvert,' '}
    88[[(#COMPTEUR_BOUCLE|>{1}|oui)</ul>]<h4 class="h4">(#ANNEE|=={0}|?{<:zotspip:annee_non_precisee:>,#ANNEE}|unique)</h4>#SET{ouvert,''}]
  • _plugins_/zotspip/trunk/modeles/biblio_simple.html

    r60188 r61367  
    77        numero,-1
    88}})]
    9 <BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{id_zcollection?}{recherche?}{zotsip_depuis}{0,#ENV{max,100000}}{tri #ENV{par,auteurs},#GET{defaut_tri}}>
     9<BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{zcollection?}{json ?LIKE %#ENV{recherche}%}{zotsip_depuis}{0,#ENV{max,100000}}{tri #ENV{par,auteurs},#GET{defaut_tri}}>
    1010#INCLURE{fond=inclure/zitem,id_zitem,csl,souligne=#GET{souligne}}
    1111</BOUCLE_biblio>
  • _plugins_/zotspip/trunk/modeles/biblio_type.html

    r60188 r61367  
    44#SET{souligne,#ENV{auteur}|et{#ENV{souligne}|!={non}}|?{#ENV{auteur},''}}
    55<B_biblio>
    6 <BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{id_zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{par type}{par auteurs}{recherche?}>
     6<BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{par type}{par auteurs}{json ?LIKE %#ENV{recherche}%}>
    77[[(#COMPTEUR_BOUCLE|>{1}|oui)</ul>]<h4 class="h4">(#TYPE|zotspip_traduire_type|unique)</h4><ul class="spip">]
    88#INCLURE{fond=inclure/zitem,id_zitem,csl,liste=oui,icones=oui,details=#GET{details},export=#GET{export},liens=#GET{liens},souligne=#GET{souligne}}
  • _plugins_/zotspip/trunk/modeles/biblio_type_annee.html

    r60188 r61367  
    44#SET{souligne,#ENV{auteur}|et{#ENV{souligne}|!={non}}|?{#ENV{auteur},''}}
    55<B_biblio>
    6 <BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{id_zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{par type}{!par annee}{par auteurs}{recherche?}>
     6<BOUCLE_biblio(ZITEMS){id_parent==0}{auteur?}{type?}{annee?}{publication?}{editeur?}{collection?}{type_doc?}{tag?}{zcollection?}{zotsip_depuis}{0,#ENV{max,100000}}{par type}{!par annee}{par auteurs}{json ?LIKE %#ENV{recherche}%}>
    77#SET{ouvert,' '}
    88[[(#COMPTEUR_BOUCLE|>{1}|oui)</ul>]<h4 class="h4">(#TYPE|zotspip_traduire_type|unique)</h4>#SET{ouvert,''}]
  • _plugins_/zotspip/trunk/zotspip_cron.php

    r59617 r61367  
    44        $taches['maj_items_zotspip'] = 3600*6; // toutes les 6 heures
    55        $taches['nettoyer_zotspip'] = 3600*6; // toutes les 6 heures
     6        $taches['maj_collections_zotspip'] = 3600*6; // toutes les 6 heures
    67        $taches['maj_schema_zotero'] = 3600*24*30; // une fois par mois
    78        return $taches;
Note: See TracChangeset for help on using the changeset viewer.