Changeset 113280 in spip-zone


Ignore:
Timestamp:
Jan 7, 2019, 10:00:22 AM (2 months ago)
Author:
bystrano@…
Message:

Surcharger le critère {logo} pour retourner aussi les docs avec des rôles logo_*

Pour éviter de mauvaises performances sur les sites avec beaucoup de logos, on
ne se sert pas de l'API pour trouver les logos, mais on fait directement des
jointures sur spip_documents_liens.

Location:
_plugins_/roles_documents/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/roles_documents/trunk/paquet.xml

    r113246 r113280  
    22        prefix="roles_documents"
    33        categorie="edition"
    4         version="1.2.18"
     4        version="1.2.19"
    55        etat="dev"
    66        compatibilite="[3.2.0;3.2.*]"
  • _plugins_/roles_documents/trunk/roles_documents_fonctions.php

    r109249 r113280  
    9999        return $done[$hash] = $roles;
    100100}
     101
     102/**
     103 * Surcharge du critère `logo`
     104 *
     105 * Tout comme le critère {logo} par défaut, on permet de sélectionner tous les
     106 * objets qui ont un logo, quel qu'il soit, au format historique ou au format
     107 * document.
     108 *
     109 * Un unique paramètre optionnel permet de se restreindre à un rôle
     110 * particulier. Par exemple, {logo accueil} permet de sélectionner les logos
     111 * dont le rôle est 'logo_accueil'.
     112 *
     113 * {!logo} permet d'inverser la sélection, pour avoir les objets qui n'ont PAS
     114 * de logo.
     115 *
     116 * @uses lister_objets_avec_logos()
     117 *     Pour obtenir les éléments qui ont un logo enregistrés avec la méthode
     118 *     "historique".
     119 *
     120 * @param string $idb Identifiant de la boucle
     121 * @param array $boucles AST du squelette
     122 * @param Critere $crit Paramètres du critère dans cette boucle
     123 * @return void
     124 */
     125function critere_logo($idb, &$boucles, $crit) {
     126
     127        $boucle = &$boucles[$idb];
     128
     129        // On interprète le premier paramètre du critère, qui nous donne le type de
     130        // logo
     131        if (count($crit->param)) {
     132                $type_logo = calculer_liste(
     133                        array_shift($crit->param),
     134                        array(),
     135                        $boucles,
     136                        $boucle->id_parent
     137                );
     138                $type_logo = trim($type_logo, "'");
     139        }
     140
     141        // Pour ajouter la jointure qu'il nous faut à la boucle, on lui donne le
     142        // premier alias L* qui n'est pas utilisé.
     143        $i = 1;
     144        while (isset($boucle->from["L$i"])) {
     145                $i++;
     146        }
     147        $alias_jointure = "L$i";
     148
     149        $alias_table = $boucle->id_table;
     150        $id_table_objet = $boucle->primary;
     151
     152        // On fait un LEFT JOIN avec les liens de documents qui correspondent au(x)
     153        // rôle(s) cherchés. Cela permet de sélectionner aussi les objets qui n'ont
     154        // pas de logo, dont le rôle sera alors NULL. C'est nécessaire pour pouvoir
     155        // gérer les logos enregistrés avec l'ancienne méthode, et pour {!logo}.
     156        $boucle->from[$alias_jointure] = 'spip_documents_liens';
     157        $boucle->from_type[$alias_jointure] = 'LEFT';
     158        $boucle->join[$alias_jointure] = array(
     159                "'$alias_table'",
     160                "'id_objet'",
     161                "'$id_table_objet'",
     162                "'$alias_jointure.objet='.sql_quote('" . objet_type($alias_table) . "')." .
     163                "' AND $alias_jointure.role LIKE \'logo\_" . ($type_logo ?: '%') . "\''",
     164        );
     165        $boucle->group[] = "$alias_table.$id_table_objet";
     166
     167        // On calcule alors le where qui va bien.
     168        if ($crit->not) {
     169                $where = "$alias_jointure.role IS NULL";
     170        } else {
     171                $where = array(
     172                        "'LIKE'",
     173                        "'$alias_jointure.role'",
     174                        "'\'logo\_" . ($type_logo ?: '%') . "\''",
     175                );
     176        }
     177
     178        // Rétro-compatibilité : Si l'on ne cherche pas un type de logo particulier,
     179        // on retourne aussi les logos enregistrés avec la méthode "historique".
     180        if (! $type_logo) {
     181                $where_historique =
     182                        'sql_in('
     183                        . "'$alias_table.$id_table_objet', "
     184                        . "lister_objets_avec_logos('$id_table_objet'), "
     185                        . "'')";
     186
     187                if ($crit->not) {
     188                        $where_historique = array("'NOT'", $where_historique);
     189                }
     190
     191                $where = array(
     192                        "'OR'",
     193                        $where,
     194                        $where_historique
     195                );
     196        }
     197
     198        // On ajoute le where à la boucle
     199        $boucle->where[] = $where;
     200}
Note: See TracChangeset for help on using the changeset viewer.