Changeset 45623 in spip-zone


Ignore:
Timestamp:
Mar 21, 2011, 1:41:12 PM (9 years ago)
Author:
cedric@…
Message:

support des revisions sur les jointure : il suffit de definir 'jointure_{table}' comme champ a versionner (avec table = version abregee 'mots', 'auteurs'...)
Il faut que les liens soient gérés par l'api editer_lien pour que les pipelines pre_edition_lien et post_edition_lien soient appelés er declenchent la gestion de revision.
Pour l'affichage des diff, une fonction afficher_diff_jointure generique est utilisee pour les jointures, mais il est possible de definir sa propre fonction d'affichage afficher_diff_jointure_xxx comme pour les champs standards.

Location:
_core_/plugins/revisions
Files:
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • _core_/plugins/revisions/afficher_diff/jointure.php

    r45576 r45623  
    2424 * @return string
    2525 */
    26 function afficher_diff_champ_dist($champ,$old,$new,$format='diff'){
    27         // ne pas se compliquer la vie !
    28         if ($old==$new)
    29                 $out = ($format!='complet'?'':$new);
    30         else {
     26function afficher_diff_jointure_dist($champ,$old,$new,$format='diff'){
     27        $join = substr($champ,9);
     28        $objet = objet_type($join);
    3129
    32                 $diff = new Diff(new DiffTexte);
    33                 $n = preparer_diff($new);
    34                 $o = preparer_diff($old);
     30        $old = explode(',',$old);
     31        $new = explode(',',$new);
    3532
    36                 $out = afficher_diff($diff->comparer($n,$o));
    37                 if ($format == 'diff' OR $format == 'apercu')
    38                         $out = afficher_para_modifies($out, ($format == 'apercu'));
    39         }
    40         return $out;
     33        $liste = array();
     34
     35        // les communs
     36        $intersection = array_intersect($new,$old);
     37        foreach($intersection as $id)
     38                if ($id=intval($id))
     39                        $liste[$id] = generer_info_entite(intval(trim($id)),$objet,'titre');
     40
     41        // les supprimes
     42        $old = array_diff($old,$intersection);
     43        foreach($old as $id)
     44                if ($id=intval($id))
     45                        $liste[$id] = "<span class='diff-supprime'>".generer_info_entite(intval(trim($id)),$objet,'titre')."</span>";
     46
     47        // les ajoutes
     48        $new = array_diff($new,$intersection);
     49        foreach($new as $id)
     50                if ($id=intval($id))
     51                        $liste[$id] = "<span class='diff-ajoute'>".generer_info_entite(intval(trim($id)),$objet,'titre')."</span>";
     52
     53        ksort($liste);
     54        $liste = implode(', ',$liste);
     55        return $liste;
    4156}
    42 
    43 
    44 /**
    45  * http://doc.spip.org/@afficher_para_modifies
    46  *
    47  * @param string $texte
    48  * @param bool $court
    49  * @return string
    50  */
    51 function afficher_para_modifies ($texte, $court = false) {
    52         // Limiter la taille de l'affichage
    53         if ($court) $max = 200;
    54         else $max = 2000;
    55 
    56         $paras = explode ("\n",$texte);
    57         for ($i = 0; $i < count($paras) AND strlen($texte_ret) < $max; $i++) {
    58                 if (strpos($paras[$i], '"diff-')) $texte_ret .= $paras[$i]."\n\n";
    59 #               if (strlen($texte_ret) > $max) $texte_ret .= '(...)';
    60         }
    61         $texte = $texte_ret;
    62         return $texte;
    63 }
  • _core_/plugins/revisions/inc/revisions.php

    r45576 r45623  
    1414
    1515$GLOBALS['agregation_versions'] = 10;
    16 define('_INTERVALLE_REVISIONS', 3600); // intervalle de temps separant deux revisions par un meme auteur
     16define('_INTERVALLE_REVISIONS', 10); // intervalle de temps separant deux revisions par un meme auteur
    1717
    1818// http://doc.spip.org/@separer_paras
     
    619619}
    620620
    621 // anciennement enregistrer_premiere_revision
    622 // code a revoir car il ne marche pas bien (ne prend pas en compte les j_mots,
    623 // cherche un titre qui n'existe pas chez les auteurs, etc
     621/**
     622 * Lorsqu'un champ versionne est une jointure, recuperer tous les liens
     623 * et les mettre sous forme de liste enumeree
     624 *
     625 * @param string $objet
     626 * @param string $id_objet
     627 * @param string $jointure
     628 * @return string
     629 */
     630function recuperer_valeur_champ_jointure($objet,$id_objet,$jointure){
     631        $objet_joint = objet_type($jointure);
     632        include_spip('action/editer_liens');
     633        $v = array();
     634        if (objet_associable($objet_joint)) {
     635                $liens = objet_trouver_liens(array($objet_joint=>'*'),array($objet=>$id_objet));
     636                foreach($liens as $l)
     637                        $v[] = $l[$objet_joint];
     638        }
     639        elseif(objet_associable($objet)) {
     640                $liens = objet_trouver_liens(array($objet=>$id_objet),array($objet_joint=>'*'));
     641                foreach($liens as $l)
     642                        $v[] = $l[$objet];
     643        }
     644        sort($v);
     645        return implode(",",$v);
     646}
     647
     648/**
     649 * Creer la premiere revision d'un objet si necessaire
     650 * notamment si on vient d'activer l'extension et qu'on fait une modif
     651 * sur un objet qui etait deja en base, mais non versionne
     652 *
     653 * la fonction renvoie le numero de la derniere version de l'objet,
     654 * et 0 si pas de version pour cet objet
     655 *
     656 * @param string $table
     657 * @param string $objet
     658 * @param int $id_objet
     659 * @param array $champs
     660 * @return int
     661 */
     662function verifier_premiere_revision($table,$objet,$id_objet,$champs=null){
     663
     664        $id_table_objet = id_table_objet($objet);
     665        if (!$champs)
     666                $champs = liste_champs_versionnes($table);
     667        if (!$champs)
     668                return false;
     669
     670        if (!$id_version = sql_getfetsel('id_version','spip_versions',"id_objet=".intval($id_objet)." AND objet=".sql_quote($objet),'','id_version DESC','0,1')) {
     671                // recuperer toutes les valeurs actuelles des champs
     672                // pour l'objet
     673                $originaux = sql_fetsel("*", $table, "$id_table_objet=".intval($id_objet));
     674                $premiere = false;
     675                foreach($champs as $v){
     676                        if (isset($originaux[$v])){
     677                                $champs_originaux[$v] = $originaux[$v];
     678                        }
     679                        else if(strncmp($v,'jointure_',9)==0) {
     680                                $champs_originaux[$v] = recuperer_valeur_champ_jointure($objet,$id_objet,substr($v,9));
     681                        }
     682                        if (isset($champs_originaux[$v]) AND strlen($originaux[$v]))
     683                                $premiere = true;
     684                }
     685
     686                // Si un champ est non vide,
     687                // il faut creer une premiere revision
     688                if ($premiere) {
     689                        $trouver_table = charger_fonction('trouver_table','base');
     690                        $desc = $trouver_table($table);
     691
     692                        // "trouver" une date raisonnable pour la version initiale
     693
     694                        $date_modif = "";
     695                        foreach(array('date_modif','maj') as $d){
     696                                if (!$date_modif AND isset($originaux[$d]) AND $t=strtotime($d))
     697                                        $date_modif = date("Y-m-d H:i:s", $t);
     698                        }
     699                        if (!$date_modif AND isset($desc['date'])) {
     700                                $date_modif = (isset($originaux[$desc['date']])?$originaux[$desc['date']]:sql_getfetsel($desc['date'],$table,"$id_table_objet=".intval($id_objet)));
     701                        }
     702                        if (!$date_modif)
     703                                $date_modif = date("Y-m-d H:i:s", time()-7200);
     704                       
     705                        if ($id_version = ajouter_version($id_objet, $objet, $champs_originaux, _T('version_initiale'), 0))
     706                                sql_updateq('spip_versions', array('date' => $date_modif), "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version=$id_version");
     707                }
     708        }
     709        return $id_version;
     710}
     711
     712/**
     713 * Avant toute modification en base
     714 * verifier qu'une version initiale existe bien pour cet objet
     715 * et la creer sinon avec l'etat actuel de l'objet
     716 *
     717 * @param array $x
     718 * @return array
     719 */
    624720function revisions_pre_edition($x) {
    625         if  ($champs = liste_champs_versionnes($x['args']['table'])) {
    626 
    627                 $id_objet = $x['args']['id_objet'];
    628                 $objet= $x['args']['type'];
    629                 $table_spip = $x['args']['table'];
    630                 $id_table_objet = id_table_objet($objet);
    631 
    632                 if (!sql_countsel('spip_versions',"id_objet=".intval($id_objet)." AND objet=".sql_quote($objet))) {
    633                         $originaux = sql_fetsel("*", $table_spip, "$id_table_objet=$id_objet");
    634                         foreach($champs as $v)
    635                                 if (isset($originaux[$v]))
    636                                         $champs_originaux[$v] = $originaux[$v];
    637 
    638                         // Si le titre est vide, c'est qu'on vient de creer l'objet
    639                         // (sauf dans le cas des auteurs)
    640                         if ($champs_originaux['titre'] !== '') {
    641                                 $date_modif = $champs_originaux['date_modif'];
    642                                 $date = $champs_originaux['date'];
    643                                 unset ($champs_originaux['date_modif']);
    644                                 unset ($champs_originaux['date']);
    645                                 $id_version = ajouter_version($id_objet, $objet, $champs_originaux, _T('version_initiale'), 0);
    646                                 // Inventer une date raisonnable pour la version initiale
    647                                 if ($date_modif>'1970-')
    648                                         $date_modif = strtotime($date_modif);
    649                                 else if ($date>'1970-')
    650                                         $date_modif = strtotime($date);
    651                                 else
    652                                         $date_modif = time()-7200;
    653                                 sql_updateq('spip_versions', array('date' => date("Y-m-d H:i:s", $date_modif)), "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_version=$id_version");
    654                         }
    655                 }
     721        $table = $x['args']['table'];
     722        if  ($champs = liste_champs_versionnes($table)) {
     723
     724                verifier_premiere_revision($table,$x['args']['type'],$x['args']['id_objet'],$champs);
    656725        }
    657726        return $x;
    658727}
    659728
    660 
    661 // anciennement enregistrer_nouvelle_revision
     729/**
     730 * Avant modification en base d'un lien,
     731 * enregistrer une premiere revision de l'objet si necessaire
     732 *
     733 * @param  $x
     734 * @return
     735 */
     736function revisions_pre_edition_lien($x) {
     737        // ex : si le champ jointure_mots est versionnable sur les articles
     738        if ($versionnes = liste_champs_versionnes($table=table_objet_sql($x['args']['objet']))
     739                AND in_array($j='jointure_'.table_objet($x['args']['objet_source']),$versionnes)){
     740                verifier_premiere_revision($table,$x['args']['objet'],$x['data'],$versionnes);
     741        }
     742
     743        // ex : si le champ jointure_articles est versionnable sur les mots
     744        if ($versionnes = liste_champs_versionnes($table=table_objet_sql($x['args']['objet_source']))
     745                AND in_array($j='jointure_'.table_objet($x['args']['objet']),$versionnes)){
     746                verifier_premiere_revision($table,$x['args']['objet_source'],$x['args']['id_objet_source'],$versionnes);
     747        }
     748
     749        return $x;
     750}
     751
     752/**
     753 * Apres modification en base, versionner l'objet
     754 *
     755 * @param  $x
     756 * @return
     757 */
    662758function revisions_post_edition($x) {
    663         // Regarder si au moins une des modifs est versionnable
    664         $champs = array();
    665         foreach (liste_champs_versionnes($x['args']['table']) as $key)
    666                 if (isset($x['data'][$key]))
    667                         $champs[$key] = $x['data'][$key];
    668 
    669         // A moins qu'il ne s'agisse d'operation (ajout/suppr) sur les mots-cles?
    670         if ($x['args']['operation'] == 'editer_mots'
    671         AND $x['args']['table'] == 'spip_articles') {
    672                 include_spip('inc/texte');
    673                 $mots = array();
    674                 foreach(
    675                         sql_allfetsel('id_mot', 'spip_mots_liens',array(
    676                                 'id_objet='.sql_quote($x['args']['id_objet'],
    677                                 'objet='.sql_quote('article'))))
    678                 as $mot)
    679                         $mots[] = "[->mot".$mot['id_mot']."]";
    680                 $champs['j_mots'] = join(' ', $mots);
    681         }
    682 
    683         if (count($champs))
    684                 ajouter_version($x['args']['id_objet'],$x['args']['type'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
     759        if ($versionnes = liste_champs_versionnes($x['args']['table'])){
     760                // Regarder si au moins une des modifs est versionnable
     761                $champs = array();
     762                foreach ($versionnes as $key)
     763                        if (isset($x['data'][$key]))
     764                                $champs[$key] = $x['data'][$key];
     765
     766                if (count($champs))
     767                        ajouter_version($x['args']['id_objet'],$x['args']['type'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
     768        }
    685769
    686770        return $x;
    687771}
    688772
     773
     774/**
     775 * Apres modification en base d'un lien, versionner l'objet si necessaire
     776 *
     777 * @param  $x
     778 * @return
     779 */
     780function revisions_post_edition_lien($x) {
     781        /*pipeline('post_edition_lien',
     782                array(
     783                        'args' => array(
     784                                'table_lien' => $table_lien,
     785                                'objet_source' => $objet_source,
     786                                'id_objet_source' => $l[$primary],
     787                                'objet' => $l['objet'],
     788                                'id_objet' => $id_o,
     789                                'action'=>'delete',
     790                        ),
     791                        'data' => $id_o
     792                )
     793        */
     794
     795        // ex : si le champ jointure_mots est versionnable sur les articles
     796        if ($versionnes = liste_champs_versionnes(table_objet_sql($x['args']['objet']))
     797          AND in_array($j='jointure_'.table_objet($x['args']['objet_source']),$versionnes)){
     798                $champs = array($j=>recuperer_valeur_champ_jointure($x['args']['objet'],$x['data'],$x['args']['objet_source']));
     799                ajouter_version($x['data'],$x['args']['objet'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
     800        }
     801
     802        // ex : si le champ jointure_articles est versionnable sur les mots
     803        if ($versionnes = liste_champs_versionnes(table_objet_sql($x['args']['objet_source']))
     804                AND in_array($j='jointure_'.table_objet($x['args']['objet']),$versionnes)){
     805                $champs = array($j=>recuperer_valeur_champ_jointure($x['args']['objet_source'],$x['args']['id_objet_source'],$x['args']['objet']));
     806                ajouter_version($x['args']['id_objet_source'],$x['args']['objet_source'], $champs, '', $GLOBALS['visiteur_session']['id_auteur']);
     807        }
     808
     809        return $x;
     810}
     811
    689812?>
  • _core_/plugins/revisions/inc/suivi_versions.php

    r45580 r45623  
    7070        else {
    7171                // le champ n'a jamais ete versionne :
    72                 // il correspond a la version courante en base
    73                 $champs[$champ] = generer_info_entite($id_objet,$objet,$champ,"**");
     72                // il etait initialement vide
     73                if (strncmp($champ,'jointure_',9)==0)
     74                        $champs[$champ] = '';
     75                else
     76                        $champs[$champ] = '';
    7477        }
    7578}
     
    144147                                if (!$afficher_diff = charger_fonction($objet."_".$champ,'afficher_diff',true)
    145148                                  AND !$afficher_diff = charger_fonction($champ,'afficher_diff',true))
    146                                         $afficher_diff = charger_fonction('champ','afficher_diff');
     149                                        $afficher_diff = charger_fonction(strncmp($champ,'jointure_',9)==0?'jointure':'champ','afficher_diff');
    147150
    148151                                $textes[$champ] = $afficher_diff($champ,$old[$champ],$new[$champ],$format);
  • _core_/plugins/revisions/plugin.xml

    r45608 r45623  
    33        <auteur>Collectif SPIP</auteur>
    44        <icon>prive/themes/spip/images/revision-32.png</icon>
    5         <version>1.3.2</version>
     5        <version>1.4.0</version>
    66        <version_base>1.1.2</version_base>
    77        <install>base/revisions_upgrade.php</install>
     
    1515        </pipeline>
    1616        <pipeline>
     17                <nom>pre_edition_lien</nom>
     18                <inclure>inc/revisions.php</inclure>
     19        </pipeline>
     20        <pipeline>
    1721                <nom>post_edition</nom>
     22                <inclure>inc/revisions.php</inclure>
     23        </pipeline>
     24        <pipeline>
     25                <nom>post_edition_lien</nom>
    1826                <inclure>inc/revisions.php</inclure>
    1927        </pipeline>
  • _core_/plugins/revisions/prive/objets/contenu/revision.html

    r45580 r45623  
    11<BOUCLE_champs(POUR){tableau #ENV*{textes}}>
    2         <div class="champ contenu_#CLE[ (#VALEUR*|strlen|?{'',vide})]">
     2        <div class="champ[(#CLE|match{^jointure_}|oui)jointure] contenu_#CLE[ (#VALEUR*|strlen|?{'',vide})]">
    33                <div class='label'>[(#CLE|label_champ)]</div>
    44                <div dir='#LANG_DIR' class='#CLE'>[(#VALEUR*|propre_diff)]</div>
  • _core_/plugins/revisions/prive/objets/contenu/revision_fonctions.php

    r45580 r45623  
    44function label_champ($champ){
    55        $label = "";
     6        // si jointure: renvoyer le nom des objets joints
     7        if (strncmp($champ,'jointure_',9)==0)
     8                return _T(objet_info(objet_type(substr($champ,9)),'texte_objets'));
     9       
    610        switch ($champ){
    711                case 'surtitre':
  • _core_/plugins/revisions/prive/style_prive_plugin_revisions.html

    r45608 r45623  
    4040
    4141.revision #wysiwyg .contenu_id_rubrique {display:none;}
     42.revision #wysiwyg .jointure {display:block;margin:1em 0;}
     43.revision #wysiwyg .jointure .label {display:block;font-weight:bold;}
    4244
    4345
Note: See TracChangeset for help on using the changeset viewer.