Changeset 92751 in spip-zone


Ignore:
Timestamp:
Nov 8, 2015, 7:26:33 PM (4 years ago)
Author:
marcimat@…
Message:

Dans le cadre du ticket #3576 , l'analyse du code du marquage de document a révélé quelques défaillances.

L'une d'elle est corrigée ici : les champs manquant n'étaient pas pris en compte dans le texte analysé pour calculer si un document est utilisé
dans le texte d'un objet (pour marquer son lien 'vu' à 'oui'), et ce depuis r38899

Le ticket soulève cependant d'autres problèmes, qui ne sont pas corrigés encore.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/medias/inc/marquer_doublons_doc.php

    r92750 r92751  
    3535 *
    3636 * S'il y avait des anciens liens avec vu=oui qui n'ont plus lieu d'être, ils passent à non.
     37 *
     38 * @note
     39 *     La fonction pourrait avoir bien moins d'arguments : seuls $champs, $id, $type ou $objet, $desc, $serveur
     40 *     sont nécessaires. On calcule $desc s'il est absent, et il contient toutes les infos…
    3741 *
    3842 * @param array $champs
     
    5559**/
    5660function inc_marquer_doublons_doc_dist($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, $desc=array(), $serveur=''){
    57         $champs_selection=array();
    5861
    59         foreach ($GLOBALS['medias_liste_champs'] as $champs_choisis) {
    60                 if ( isset($champs[$champs_choisis]) )
    61                         array_push($champs_selection,$champs_choisis);
     62        // On conserve uniquement les champs qui modifient le calcul des doublons de documents
     63        // S'il n'il en a aucun, les doublons ne sont pas impactés, donc rien à faire d'autre..
     64        if (!$champs = array_intersect_key($champs, array_flip($GLOBALS['medias_liste_champs']))) {
     65                return;
    6266        }
    63         if (count($champs_selection) == 0)
    64                 return;
     67
    6568        if (!$desc){
    6669                $trouver_table = charger_fonction('trouver_table', 'base');
    6770                $desc = $trouver_table($table_objet, $serveur);
    6871        }
    69         $load = "";
    70         // charger le champ manquant en cas de modif partielle de l     'objet
    71         // seulement si le champ existe dans la table demande
    7272
    73         $champs_a_traiter = "";
    74         foreach ($champs_selection as $champs_a_parcourir) {
    75                 if (isset($desc['field'][$champs_a_parcourir])) {
    76                         $load = $champs_a_parcourir;
    77                         $champs_a_traiter .= $champs[$champs_a_parcourir];
     73        // Il faut récupérer toutes les données qui impactent les liens de documents vus
     74        // afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec
     75        // les liens actuellement enregistrés.
     76        $absents = array();
     77
     78        // Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque
     79        foreach ($GLOBALS['medias_liste_champs'] as $champ) {
     80                if (isset($desc['field'][$champ]) and !isset($champs[$champ])) {
     81                        $absents[] = $champ;
    7882                }
    7983        }
    8084
    81         if ($load){
    82                 $champs[$load] = "";
    83                 $row = sql_fetsel($load, $spip_table_objet, "$id_table_objet=".sql_quote($id));
    84                 if ($row AND isset($row[$load]))
    85                         $champs[$load] = $row[$load];
     85        // Retrouver les textes des champs manquants
     86        if ($absents) {
     87                $row = sql_fetsel($absents, $spip_table_objet, "$id_table_objet=".sql_quote($id));
     88                if ($row) {
     89                        $champs = array_merge($row, $champs);
     90                }
    8691        }
     92
    8793        include_spip('inc/texte');
    8894        include_spip('base/abstract_sql');
    8995        include_spip('action/editer_liens');
    9096        include_spip('base/objets');
     97
     98        // récupérer la liste des modèles qui considèrent un document comme vu s'ils sont utilisés dans un texte
    9199        $modeles = lister_tables_objets_sql('spip_documents');
    92100        $modeles = $modeles['modeles'];
     101
     102        // liste d'id_documents trouvés dans les textes
    93103        $GLOBALS['doublons_documents_inclus'] = array();
    94         $env = array(
    95                 'objet' => $type,
    96                 'id_objet' => $id,
     104
     105        // detecter les doublons dans ces textes
     106        traiter_modeles(implode(" ", $champs), array('documents' => $modeles), '', '', null, array(
     107                'objet'         => $type,
     108                'id_objet'      => $id,
    97109                $id_table_objet => $id
    98         );
    99         traiter_modeles($champs_a_traiter,array('documents'=>$modeles),'','',null,$env); // detecter les doublons
    100         objet_qualifier_liens(array('document'=>'*'),array($type=>$id),array('vu'=>'non'));
     110        ));
     111
     112        // tous les documents liés à l'article sont considérés non vus
     113        objet_qualifier_liens(array('document'=>'*'), array($type=>$id), array('vu'=>'non'));
     114
     115        // ceux présents sont considérés comme vus
    101116        if (count($GLOBALS['doublons_documents_inclus'])){
    102117                // on repasse par une requete sur spip_documents pour verifier que les documents existent bien !
    103                 $in_liste = sql_in('id_document',$GLOBALS['doublons_documents_inclus']);
     118                $in_liste = sql_in('id_document', $GLOBALS['doublons_documents_inclus']);
    104119                $res = sql_allfetsel("id_document", "spip_documents", $in_liste);
    105                 $res = array_map('reset',$res);
     120                $res = array_map('reset', $res);
    106121                // Creer le lien s'il n'existe pas deja
    107122                objet_associer(array('document'=>$res),array($type=>$id),array('vu'=>'oui'));
     
    110125}
    111126
    112 ?>
Note: See TracChangeset for help on using the changeset viewer.