Changeset 83415 in spip-zone for _plugins_/zotspip


Ignore:
Timestamp:
Jun 21, 2014, 2:47:00 PM (4 years ago)
Author:
joseph@…
Message:

Synchronisation multi-étapes des collections, personnalisation possible des pas de synchronisation, nouvelles fonctions génériques zotspip_maj

Location:
_plugins_/zotspip/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/zotspip/trunk/formulaires/configurer_zotspip.html

    r82171 r83415  
    3030                                <label><:zotspip:label_id_librairie:></label>
    3131                                <p class="explication"><:zotspip:explication_id_librairie:></p>
    32                                 <input type="text" name="id_librairie" class="text" value="#ENV*{id_librairie}" id="id_librairie" [(#HTML5|oui)required='required']/>
     32                                <input type="text" name="id_librairie" class="text" value="#ENV*{id_librairie}" id="id_librairie" required='required'/>
    3333                        </li>
    3434                        <li class="editer_username[ (#ENV**{erreurs}|table_valeur{username}|oui)erreur]">
    3535                                <label><:zotspip:label_username:></label>
    3636                                <p class="explication"><:zotspip:explication_username:></p>
    37                                 <input type="text" name="username" class="text" value="#ENV*{username}" id="username" [(#HTML5|oui)required='required']/>
     37                                <input type="text" name="username" class="text" value="#ENV*{username}" id="username" required='required'/>
    3838                        </li>
    3939                        <li class="editer_api_key[ (#ENV**{erreurs}|table_valeur{api_key}|oui)erreur]">
    4040                                <label><:zotspip:label_api_key:></label>
    4141                                <p class="explication"><:zotspip:explication_api_key:></p>
    42                                 <input type="text" name="api_key" class="text" value="#ENV*{api_key}" id="api_key" [(#HTML5|oui)required='required']/>
     42                                <input type="text" name="api_key" class="text" value="#ENV*{api_key}" id="api_key" required='required'/>
    4343                        </li>
    4444                </ul></fieldset></li>
     
    6363                        <li class="editer_titre_page_biblio[ (#ENV**{erreurs}|table_valeur{titre_page_biblio}|oui)erreur]">
    6464                                <label for="titre_page_biblio"><:zotspip:label_titre_page_biblio:></label>
    65                                 <input type="text" name="titre_page_biblio" class="text" value="#ENV*{titre_page_biblio}" id="titre_page_biblio" [(#HTML5|oui)required='required']/>
     65                                <input type="text" name="titre_page_biblio" class="text" value="#ENV*{titre_page_biblio}" id="titre_page_biblio" required='required'/>
    6666                        </li>
    6767                        <li class="editer_flux_rss[ (#ENV**{erreurs}|table_valeur{flux_rss}|oui)erreur]">
     
    110110                        </B_ordre_types>
    111111                </ul></fieldset></li>
     112                <li class="fieldset"><fieldset><h3 class="legend"><:zotspip:label_pas_sync:></h3>
     113                <p class="explication"><:zotspip:explication_pas_sync:></p>
     114                <ul>
     115                        <li class="editer_pas_references[ (#ENV**{erreurs}|table_valeur{pas_references}|oui)erreur]">
     116                                <label><:zotspip:label_pas_references:></label>
     117                                <input type="number" name="pas_references" class="text" value="#ENV*{pas_references,50}" id="pas_references" required='required' min="5" max="50" step="5" />
     118                        </li>
     119                        <li class="editer_pas_collections[ (#ENV**{erreurs}|table_valeur{pas_collections}|oui)erreur]">
     120                                <label><:zotspip:label_pas_collections:></label>
     121                                <input type="number" name="pas_collections" class="text" value="#ENV*{pas_collections,5}" id="pas_collections" required='required' min="1" max="50"/>
     122                        </li>
     123                </ul></fieldset></li>
    112124                </ul>
    113125                <p class='boutons'><span class='image_loading'>&nbsp;</span>
  • _plugins_/zotspip/trunk/formulaires/maj_zotspip.html

    r81588 r83415  
    22        <h3 class="titrem"><:zotspip:maj_zotspip:></h3>
    33        [(#ENV{forcer}|oui)<p class="notice" style="margin:10px;"><:zotspip:sync_complete_demandee:></p>]
    4         [(#ENV{sync}|oui)<p class="notice" style="margin:10px;"><:zotspip:sync_en_cours:></p>]
     4        [(#ENV{sync}|oui)<p class="notice" style="margin:10px;"><:zotspip:sync_en_cours:>
     5                [<br /><span style="font-size:90%;">((#ENV{avancement}))</span>]
     6                </p>]
    57        [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
    68        [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>]
  • _plugins_/zotspip/trunk/formulaires/maj_zotspip.php

    r81588 r83415  
    44
    55function formulaires_maj_zotspip_charger_dist(){
    6         $zotspip_maj_items = isset($GLOBALS['meta']['zotspip_maj_items']) ? unserialize($GLOBALS['meta']['zotspip_maj_items']) : array('forcer' => false);
     6        $zotspip_maj = isset($GLOBALS['meta']['zotspip_maj']) ? unserialize($GLOBALS['meta']['zotspip_maj']) : array('forcer' => false);
     7        $avancement = '';
     8        if (isset($zotspip_maj['step']) & $zotspip_maj['step']=='items') {
     9                $zotspip_maj_items = unserialize($GLOBALS['meta']['zotspip_maj_items']);
     10                $avancement = _T('zotspip:plusieurs_references_sync',array('nb'=>isset($zotspip_maj_items['start'])?$zotspip_maj_items['start']:0));
     11        }
     12        if (isset($zotspip_maj['step']) & $zotspip_maj['step']=='collections') {
     13                $zotspip_maj_collections = unserialize($GLOBALS['meta']['zotspip_maj_collections']);
     14                $avancement = _T('zotspip:plusieurs_collections_sync',array('nb'=>isset($zotspip_maj_collections['start'])?$zotspip_maj_collections['start']:0));
     15        }
     16        if (isset($zotspip_maj['step']) & $zotspip_maj['step']=='nettoyage') {
     17                $avancement = _T('zotspip:nettoyage');
     18        }
     19       
    720        $contexte = array(
    8                 'forcer'=> $zotspip_maj_items['forcer'] ? 'on' : '',
    9                 'sync' => isset($zotspip_maj_items['start']) ? 'on' : ''
     21                'forcer'=> $zotspip_maj['forcer'] ? 'on' : '',
     22                'sync' => isset($zotspip_maj['step']) ? 'on' : '',
     23                'avancement' => $avancement
    1024        );
    1125        return $contexte;
     
    1630        $forcer = (_request('sync_complete')) ? true : false;
    1731       
    18         $cont = zotspip_maj_items($forcer);
     32        $cont = zotspip_maj($forcer);
    1933       
    2034        if ($cont==0)
    2135                return array('message_erreur' => _T('zotspip:erreur_connexion'));
    2236        if ($cont>0) {
    23                 zotspip_nettoyer(); // Eviter de nettoyer à chaque tour, il suffit de le faire à la fin
    24                 zotspip_maj_collections($forcer); // Idem pour les collections
    2537                return array('message_ok' => _T('zotspip:synchronisation_effectuee'));
    2638        }
  • _plugins_/zotspip/trunk/inc/zotspip.php

    r75288 r83415  
    4646// $forcer : forcer la mise à jour complète de la base
    4747// $n integer : nombre d'items à mettre à jour simultanément (max 50)
    48 function zotspip_maj_items($forcer=false, $n=50) {
     48function zotspip_maj_items($forcer=false, $n=NULL) {
     49        include_spip('inc/config');
     50        if (!is_int($n)) $n = lire_config('zotero/pas_references',50);
     51       
    4952        if ($n>50) $n=50;
    5053       
     
    269272}
    270273
    271 // Mise à jour des collections
     274// Mise à jour des collections Zotero
    272275// $forcer : forcer la mise à jour complète de la base
    273 function zotspip_maj_collections($forcer=false) {
    274         $feed = zotero_get('collections/?format=atom&order=dateModified&sort=desc');
     276// $n integer : nombre de collections à mettre à jour simultanément (on limite à 5 en raison du nombre de requêtes)
     277function zotspip_maj_collections($forcer=false, $n=NULL) {
     278        include_spip('inc/config');
     279        if (!is_int($n)) $n = lire_config('zotero/pas_collections',5);
     280       
     281        if ($n>50) $n=50;
     282       
     283        if ($forcer)
     284                $zotspip_maj_collections = array('forcer' => true, 'start' => 0);
     285        else
     286                $zotspip_maj_collections = isset($GLOBALS['meta']['zotspip_maj_collections']) ? unserialize($GLOBALS['meta']['zotspip_maj_collections']) : array('forcer' => false, 'start' => 0);
     287       
     288        $feed = zotero_get('collections/?format=atom&order=dateModified&sort=desc&limit='.$n.'&start='.$zotspip_maj_collections['start']);
    275289        // On vérifie qu'on a bien eu un retour
    276290        if (!$feed)
     
    288302                       
    289303                        // Faire une vérification sur la date de maj (seulement si on ne force pas)
    290                         if (!$zotspip_maj_items['forcer']) {
     304                        if (!$zotspip_maj_collections['forcer']) {
    291305                                if ($updated==sql_getfetsel('updated','spip_zcollections','id_zcollection='.sql_quote($id_zcollection))) {
     306                                        effacer_meta('zotspip_maj_collections');
    292307                                        return 1;
    293308                                }
     
    326341        }
    327342       
     343        // Faut-il continuer la synchronisation ?
     344        $links = array();
     345        if (spip_xml_match_nodes(',^link rel="next",', $xml, $links)) {
     346                $link_next = array_keys($links);
     347                list($balise, $attributs) = spip_xml_decompose_tag($link_next[0]);
     348                if (preg_match('#start=([0-9]+)#',$attributs['href'],$matches)) {
     349                        if ($matches[1]>$zotspip_maj_collections['start']) {
     350                                $zotspip_maj_collections['start'] = $matches[1];
     351                                ecrire_meta('zotspip_maj_collections',serialize($zotspip_maj_collections));
     352                                ecrire_metas();
     353                                return -5;
     354                        }
     355                }
     356        }
     357       
     358        // Sinon, c'est qu'on a fini la synchronisation
     359        effacer_meta('zotspip_maj_collections');
    328360        return 1; //0 si rien à faire, 1 si effectuée, -5 si tâche pas finie
    329361}
     
    374406        sql_delete('spip_zcollections','id_zcollection='.sql_quote($id_zcollection));
    375407        sql_delete('spip_zitems_zcollections','id_zcollection='.sql_quote($id_zcollection));
     408}
     409
     410// Mise à jour items, puis collections, puis nettoyage
     411
     412function zotspip_maj($forcer=false){
     413        if ($forcer)
     414                $zotspip_maj = array('forcer' => true, 'step' => 'items');
     415        else
     416                $zotspip_maj = isset($GLOBALS['meta']['zotspip_maj']) ? unserialize($GLOBALS['meta']['zotspip_maj']) : array('forcer' => false, 'step' => 'items');
     417        if ($zotspip_maj['step'] == 'items'){
     418                if (!isset($GLOBALS['meta']['zotspip_maj_items']))
     419                        $cont = zotspip_maj_items($zotspip_maj['forcer']); // On ne passe forcer qu'au premier appel
     420                else
     421                        $cont = zotspip_maj_items();
     422                if ($cont==0) return 0; // Pb de sync
     423                if ($cont>0)  // On a fini la sync des items
     424                        $zotspip_maj['step'] = 'collections';
     425                ecrire_meta('zotspip_maj',serialize($zotspip_maj));
     426                ecrire_metas();
     427                return -5; // Dans tous les cas, on continue la sync
     428        }
     429        if ($zotspip_maj['step'] == 'collections'){
     430                if (!isset($GLOBALS['meta']['zotspip_maj_collections']))
     431                        $cont = zotspip_maj_collections($zotspip_maj['forcer']); // On ne passe forcer qu'au premier appel
     432                else
     433                        $cont = zotspip_maj_collections();
     434                if ($cont==0) return 0; // Pb de sync
     435                if ($cont>0)  // On a fini la sync des collections
     436                        $zotspip_maj['step'] = 'nettoyage';
     437                ecrire_meta('zotspip_maj',serialize($zotspip_maj));
     438                ecrire_metas();
     439                return -5; // Dans tous les cas, on continue la sync
     440        }
     441        if ($zotspip_maj['step'] == 'nettoyage'){
     442                effacer_meta('zotspip_maj');
     443                return zotspip_nettoyer();
     444        }
     445       
     446        return 0;
    376447}
    377448
  • _plugins_/zotspip/trunk/lang/zotspip_fr.php

    r82175 r83415  
    4343        'explication_flux_rss' => 'Accessible à l’adresse <em>spip.php ?page=biblio-rss</em>, ce flux RSS présente les 50 derniers ajouts à la base bibliographique.',
    4444        'explication_id_librairie' => 'Pour une librairie personnelle, le <em>userID</em> est indiqué sur la <a href="https://www.zotero.org/settings/keys">page Zotero de gestion des clés personnelles</a>. Pour un groupe, le <em>groupID</em> se trouve dans l’URL de configuration du groupe qui est de la forme <em>https://www.zotero.org/groups/&lt;groupID&gt;/settings</em>.',
    45         'explication_maj_zotspip' => 'ZotSpip se synchronise à intervalles réguliers (environ toutes les 4 heures) avec le serveur Zotero. Seules les dernières modifications (depuis la dernière synchronisation) sont prises en compte. Au besoin, vous pouvez forcer une mise à jour complète de la base de données, toutes les références étant alors téléchargées à nouveau (si votre librairie est importante, cette synchronisation se fera en plusieurs étapes, seulement 50 références pouvant être mises à jour à la fois).',
     45        'explication_maj_zotspip' => 'ZotSpip se synchronise à intervalles réguliers (environ toutes les 4 heures) avec le serveur Zotero. Seules les dernières modifications (depuis la dernière synchronisation) sont prises en compte. Au besoin, vous pouvez forcer une mise à jour complète de la base de données, toutes les références étant alors téléchargées à nouveau. La synchronisation est réalisée en plusieurs étapes (références, collections Zotero, nettoyage des éléments supprimés).',
    4646        'explication_ordre_types' => 'Vous pouvez personnaliser l’ordre utilisé pour les tris par type de référence (changez l’ordre par glisser/déposer).',
     47        'explication_pas_sync' => '50 maximum, par défaut 50 pour les références et 5 pour les collections. Diminuez les pas de synchronisation si vous rencontrez des erreurs du type <em>Maximum execution time</em>.',
    4748        'explication_username' => 'Pour une librairie personnelle, le nom d’utilisateur est indiqué sur la <a href="https://www.zotero.org/settings/account">page de configuration du compte</a>. Pour un groupe partagé, le nom du groupe se situe à la fin de l’URL de la page d’accueil du groupe qui est de la forme <em>https://www.zotero.org/groups/&lt;nom_du_groupe&gt;</em> (dans certain cas, le nom du groupe correspondant à son identifiant numérique).',
    4849        'exporter' => 'Exporter',
     
    105106        'label_ordre_types' => 'Tri par type de référence',
    106107        'label_page_biblio' => 'Activer la page ‘biblio’ pour Zpip ?',
     108        'label_pas_collections' => 'Synchronisation des collections',
     109        'label_pas_references' => 'Synchonisation des références',
     110        'label_pas_sync' => 'Pas de synchronisation',
    107111        'label_publication' => 'Publication',
    108112        'label_recherche_libre' => 'Recherche libre',
     
    130134
    131135        // N
     136        'nettoyage' => 'nettoyage',
    132137        'nom_page-biblio' => 'Biblio',
    133138        'nom_prenom' => 'Nom, Prénom',
     
    139144
    140145        // P
     146        'plusieurs_collections' => '@nb@ collections',
     147        'plusieurs_collections_sync' => '@nb@ collections synchronisées',
    141148        'plusieurs_references' => '@nb@ références',
     149        'plusieurs_references_sync' => '@nb@ références synchronisées',
    142150        'probleme_survenu_lors_du_remplacement' => 'Un problème est survenu lors du remplacement (code HTTP @code@).',
    143151
  • _plugins_/zotspip/trunk/paquet.xml

    r82171 r83415  
    22        prefix="zotspip"
    33        categorie="edition"
    4         version="3.2.0"
     4        version="3.3.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.0.*]"
Note: See TracChangeset for help on using the changeset viewer.