Changeset 109235 in spip-zone


Ignore:
Timestamp:
Mar 2, 2018, 11:14:26 AM (15 months ago)
Author:
tcharlss@…
Message:

Assumons la nouvelle gestion des logos : prendre on priorité les documents par rapport aux anciens logos. Prendre en compte partout les rôles principaux déclarés (c'est à dire les rôles utilisés pour les logos). Quelques petits fix.

Location:
_plugins_/roles_documents/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/roles_documents/trunk/formulaires/editer_logo.html

    r109229 r109235  
    66
    77]
    8 <div class='formulaire_spip formulaire_editer formulaire_editer_logo formulaire_editer_logo_#ENV{objet}'>
     8<div class='formulaire_spip formulaire_editer formulaire_editer_logo formulaire_editer_logo_#ENV{objet}' id="editer_logo">
    99
    1010        [<h3 class="titrem">(#ENV*{_options/titre})</h3>]
  • _plugins_/roles_documents/trunk/formulaires/editer_logo.php

    r109228 r109235  
    4545                or (
    4646                        $objet == 'site'
    47                         and !intval($id_objet)
     47                        and intval($id_objet) <= 0
    4848                )
    4949        ) {
    5050                $objet = 'site_spip';
     51                $id_objet = -1;
    5152        }
    5253        $objet = objet_type($objet);
     
    9091        $logos = array();
    9192        $config = array(
    92                 'logo'        => lire_config('activer_logos'),
    93                 'logo_survol' => lire_config('activer_logos_survol'),
     93                lire_config('activer_logos'),
     94                lire_config('activer_logos_survol'),
    9495        );
     96
     97        // =====================================
     98        // 1) Cherchons en pririté les documents
     99        // =====================================
     100        // Rôles principaux de l'objet (= rôles de logos)
     101        $infos_roles = roles_presents('document', $objet);
     102        $roles_principaux = isset($infos_roles['choix']['principaux']) ? $infos_roles['choix']['principaux'] : array('logo', 'logo_survol');
    95103        $chercher_logo = charger_fonction('chercher_logo', 'inc');
    96 
    97         // 1) Cherchons d'abord les logos historiques
    98         $etats_vers_roles = array(
    99                 'on'  => 'logo',
    100                 'off' => 'logo_survol',
    101         );
    102         $etats_attribues = array();
    103         foreach(array_keys($etats_vers_roles) as $etat) {
    104                 $role = $etats_vers_roles[$etat];
    105                 if ($config[$role] == 'oui'
    106                         and $logo = $chercher_logo($id_objet, $id_table_objet, $etat)
    107                 ) {
    108                         $logos[] = $logo;
    109                         $etats_attribues[] = $role;
    110                 }
    111         }
    112 
    113         // 2) Cherchons ensuite les documents avec des rôles de logos
     104        // Rôles principaux attribués...
    114105        $roles_logos = roles_documents_presents_sur_objet($objet, $id_objet, 0, true);
    115         // On ajuste la liste avec les vieux logos et leurs états
    116         $roles_logos['attribues'] = array_merge($roles_logos['attribues'], $etats_attribues);
    117         $roles_logos['attribuables'] = array_diff($roles_logos['attribuables'], $etats_attribues);
     106        // Cherchons le document pour chaque rôle attribué
    118107        foreach ($roles_logos['attribues'] as $role) {
    119                 // Vérifier la config de certains rôles connus
    120                 $config_actif = (!in_array($role, array_keys($config)) or (in_array($role, array_keys($config)) and $config[$role] == 'oui'));
     108                // Vérifier la config : si le rôle est dans la liste des rôles principaux, on regarde à quelle position il se trouve et on prend la config correspondante, sinon on ignore.
     109                $position = array_search($role, $roles_principaux);
     110                $config_actif = isset($config[$position]) ? $config[$position] == 'oui' : true;
    121111                if ($config_actif
    122112                        and $logo = $chercher_logo($id_objet, $id_table_objet, $role)
     
    125115                }
    126116        }
     117
     118        // ====================================
     119        // 2) Cherchons ensuite les vieux logos
     120        // ====================================
     121        $etats = array('on', 'off');
     122        foreach($etats as $k => $etat) {
     123                if ($config[$k] == 'oui'
     124                        and $logo = $chercher_logo($id_objet, $id_table_objet, $etat, true)
     125                ) {
     126                        $logos[] = $logo;
     127                        // On ajuste les rôles attribués (en faisant correspondre avec les rôles principaux)
     128                        if (isset($roles_principaux[$k])) {
     129                                array_push($roles_logos['attribues'], $roles_principaux[$k]);
     130                                unset($roles_logos['attribuables'], $roles_principaux[$k]);
     131                        }
     132                }
     133        }
     134        $roles_logos['attribues'] = array_unique($roles_logos['attribues']);
    127135
    128136        // S'il y a moins de rôles attribués que de rôles possibles, on peut en ajouter
     
    234242                or (
    235243                        $objet == 'site'
    236                         and !intval($id_objet)
     244                        and intval($id_objet) <= 0
    237245                )
    238246        ) {
    239247                $objet = 'site_spip';
     248                $id_objet = -1;
    240249        }
    241250
     
    253262
    254263                // En présence d'un role sélectionne, on requalifie le lien créé
    255                 if ($role = _request('role')
     264                if ($roles = _request('roles')
    256265                        and !empty($res_joindre_document['ids'])
    257266                ) {
     267                        // le role est unique mais on ne sait jamais
     268                        if (is_array($roles)) {
     269                                $roles = array_shift($roles);
     270                        }
    258271                        // On ne prend qu'un seul document
    259                         if ($id_logo = intval(array_shift($res_joindre_document['ids']))) {
     272                        if ($id_document = intval(array_shift($res_joindre_document['ids']))) {
    260273                                $update = sql_updateq(
    261274                                        'spip_documents_liens',
    262                                         array('role' => $role),
     275                                        array('role' => $roles),
    263276                                        array(
    264                                                 'id_document=' . intval($id_logo),
     277                                                'id_document=' . intval($id_document),
    265278                                                'objet='       . sql_quote($objet),
    266279                                                'id_objet='    . intval($id_objet),
  • _plugins_/roles_documents/trunk/inc/chercher_logo.php

    r109193 r109235  
    33 * Recherche de logo : Rôles de documents
    44 *
    5  * Surcharge : on prend en compte les rôles de documents en plus des logos historiques
     5 * Surcharge : on prend en priorité les documents par rapport aux vieux logos
    66 *
    77 * @plugin     Rôles de documents
     
    2121 *
    2222 * @note
    23  * Pour le logo du site, $id_table_objet vaut soit id_site_spip (#FORMULAIRE_LOGO), soit id_syndic (#LOGO_SITE_SPIP)
    24  *
     23 * Attention, les fonctions peuvent chercher les anciens états 'on' ou 'off' (balises #LOGO_XXX).
     24 * Il faut donc faire une correspondance avec les rôles principaux déclarés pour l'objet (on = 1er, off = 2ème).
     25 *
     26 * @note
     27 * Le logo du site est un document lié à un pseudo objet 'site_spip' avec id_objet=-1 et role=logo (ou l'image siteon0.xxx si vieux logo).
     28 * Dans ce cas, $id_table_objet vaut soit 'id_site_spip' (#FORMULAIRE_LOGO) soit 'id_site' ou 'id_syndic' (#LOGO_SITE_SPIP). Youpi.
     29 *
    2530 * @global formats_logos Extensions possibles des logos
    2631 * @uses type_du_logo()
     
    2833 * @param int $id
    2934 *     Identifiant de l'objet
    30  *     Pour le logo du site : 0
    3135 * @param string $id_table_objet
    3236 *     Nom de la clé primaire de l'objet
    33  *     Pour le logo du site : 'site'
    3437 * @param string $role
    35  *     - Rôle pour les documents : 'logo' | 'logo_survol' | 'logo_xxx'...
    36  *     - Mode de survol pour les logos historiques : 'on' | 'off'
     38 *     Voir @note
     39 *     - Rôle pour les documents : 'logo' | 'logo_survol' | ...
     40 *     - Mode de survol pour les vieux logos : 'on' | 'off'
     41 * @param boolean $historique
     42 *     true pour chercher exclusivement les vieux logos
    3743 * @return array
    3844 *     - Liste (chemin complet du fichier, répertoire de logos, nom du logo, extension du logo, date de modification, id_document, role)
    3945 *     - array vide si aucun logo trouvé.
    4046 */
    41 function inc_chercher_logo($id_objet, $id_table_objet, $role = 'logo') {
     47function inc_chercher_logo($id_objet, $id_table_objet, $role = 'on', $historique = false) {
    4248
    4349        $logo = array();
    4450        $objet = objet_type($id_table_objet);
     51        $etats = array('on', 'off'); // vieux états
     52        $etat = $role; // pour les vieux logos
    4553
    46         // On commence par chercher les logos historiques
    47         // Hack : logo du site
    48         if (in_array($id_table_objet, array('id_site_spip','id_syndic'))
    49                 and !intval($id_objet)
    50         ) {
    51                 $objet = 'site';
    52         }
    53         $type_logo = type_du_logo($id_table_objet);
    54         $nom = $type_logo . $role . intval($id_objet);
    55         foreach ($GLOBALS['formats_logos'] as $format) {
    56                 if (@file_exists($d = (_DIR_LOGOS . $nom . '.' . $format))) {
     54        // ===================================
     55        // Cherchons en priorité les documents
     56        // ===================================
     57        if (!$historique) {
     58
     59                // Retrouver les rôles principaux pour cet objet
     60                $roles = roles_presents('document', $objet);
     61                $roles_principaux = !empty($roles['choix']['principaux']) ? $roles['choix']['principaux'] : array('logo', 'logo_survol');
     62
     63                // Correspondance vieux états / rôles principaux (voir @note)
     64                if ($role == $etats[0]) {
     65                        $role = $roles_principaux[0];
     66                } elseif ($role == $etats[1]) {
     67                        $role = isset($roles_principaux[1]) ? $roles_principaux[1] : $roles_principaux[0];
     68                }
     69
     70                // Hack : ajustement pour le logo du site (voir @note)
     71                if (in_array($id_table_objet, array('id_site_spip', 'id_site', 'id_syndic'))
     72                        and intval($id_objet) <= 0
     73                ) {
     74                        $objet = 'site_spip';
     75                        $id_objet = -1;
     76                }
     77
     78                if ($document = sql_allfetsel(
     79                        'fichier, extension, titre, maj, liens.id_document, liens.role',
     80                        'spip_documents AS docs' .
     81                                ' INNER JOIN spip_documents_liens AS liens' .
     82                                ' ON liens.id_document = docs.id_document',
     83                        array(
     84                                'objet = ' . sql_quote($objet),
     85                                'id_objet = ' . intval($id_objet),
     86                                'role = ' . sql_quote($role),
     87                                sql_in('role', $roles_principaux), // too much ?
     88                        )
     89                )) {
     90                        $document = array_shift($document);
     91                        $chemin = _NOM_PERMANENTS_ACCESSIBLES . $document['fichier'];
     92                        $dossier = _NOM_PERMANENTS_ACCESSIBLES . substr($document['fichier'], 0, strrpos($document['fichier'], '/'));
    5793                        $logo = array(
    58                                 $d,
    59                                 _DIR_LOGOS,
    60                                 $nom,
    61                                 $format,
    62                                 @filemtime($d),
    63                                 '',
    64                                 $role,
     94                                $chemin,
     95                                $dossier,
     96                                $document['titre'],
     97                                $document['extension'],
     98                                strtotime($document['maj']),
     99                                $document['id_document'],
     100                                $document['role'],
    65101                        );
    66                         break; // S'arrêter au 1er fichier trouvé
    67102                }
    68103        }
    69104
    70         // Sinon, cherchons un document avec le rôle demandé
    71         // Hack : logo du site
    72         if (in_array($id_table_objet, array('id_site_spip','id_syndic'))
    73                 and !intval($id_objet)
     105        // ========================================
     106        // Si rien trouvé cherchons les vieux logos
     107        // ========================================
     108        if (!$logo
     109                and in_array($etat, $etats)
    74110        ) {
    75                 $objet = 'site_spip';
    76                 if ($id_table_objet == 'id_syndic') {
    77                         if ($role == 'on') {
    78                                 $role = 'logo';
    79                         } elseif ($role == 'off') {
    80                                 $role = 'logo_survol';
     111
     112                // Hack : ajustement pour le logo du site (voir @note)
     113                if (in_array($id_table_objet, array('id_site_spip', 'id_site', 'id_syndic'))
     114                        and intval($id_objet) <= 0
     115                ) {
     116                        $id_table_objet = 'id_site';
     117                        $id_objet = 0;
     118                }
     119
     120                // Retrouver le nom du fichier
     121                // Il y a des noms raccourcis pour certains objets (raisons historiques)
     122                $type_logo = type_du_logo($id_table_objet);
     123                $nom = $type_logo . $etat . intval($id_objet);
     124
     125                // Chercher les fichiers correspondants
     126                foreach ($GLOBALS['formats_logos'] as $format) {
     127                        if (@file_exists($d = (_DIR_LOGOS . $nom . '.' . $format))) {
     128                                $logo = array(
     129                                        $d,
     130                                        _DIR_LOGOS,
     131                                        $nom,
     132                                        $format,
     133                                        @filemtime($d),
     134                                        '',
     135                                        $etat,
     136                                );
     137                                break; // S'arrêter au 1er fichier trouvé
    81138                        }
    82139                }
    83140        }
    84         if (!$logo
    85                 and $document = sql_allfetsel(
    86                 'fichier, extension, titre, maj, l.id_document, l.role',
    87                 'spip_documents AS docs' .
    88                         ' INNER JOIN spip_documents_liens AS l' .
    89                         ' ON l.id_document = docs.id_document',
    90                 array(
    91                         'objet = ' . sql_quote($objet),
    92                         'id_objet = ' . intval($id_objet),
    93                         'role = ' . sql_quote($role),
    94                         'SUBSTR(role, 1, 4) = ' . sql_quote('logo'), // s'assurer qu'il s'agit d'un role de logo
    95                 )
    96         )) {
    97                 $document = array_shift($document);
    98                 $chemin = _NOM_PERMANENTS_ACCESSIBLES . $document['fichier'];
    99                 $dossier = _NOM_PERMANENTS_ACCESSIBLES . substr($document['fichier'], 0, strrpos($document['fichier'], '/'));
    100                 $logo = array(
    101                         $chemin,
    102                         $dossier,
    103                         $document['titre'],
    104                         $document['extension'],
    105                         strtotime($document['maj']),
    106                         $document['id_document'],
    107                         $document['role'],
    108                 );
    109         }
    110        
     141
    111142        return $logo;
    112143}
     
    134165// Exceptions standards (historique)
    135166$GLOBALS['table_logos'] = array(
    136         'id_article' => 'art',
     167        'id_article'  => 'art',
    137168        'id_auteur'   => 'aut',
    138169        'id_rubrique' => 'rub',
  • _plugins_/roles_documents/trunk/roles_documents_pipelines.php

    r109229 r109235  
    310310        // Ajout de document
    311311        if ($flux['args']['fond'] == 'formulaires/inc-upload_document'
    312                 and !empty($flux['args']['contexte']['objet'])
    313                 and !empty($flux['args']['contexte']['id_objet'])
    314         ) {
    315        
     312                and isset($flux['args']['contexte']['objet'])
     313                and isset($flux['args']['contexte']['id_objet'])
     314        ) {
     315
    316316                // Est-ce qu'il s'agit d'un ajout de logo ?
    317317                $editer_logo = !empty($flux['args']['contexte']['editer_logo']);
Note: See TracChangeset for help on using the changeset viewer.