Changeset 113282 in spip-zone


Ignore:
Timestamp:
Jan 7, 2019, 10:08:15 AM (3 months ago)
Author:
bystrano@…
Message:

report de 113280 : performance du critère logo

On rétro-porte le critère logo de la branche de dév de roles_documents.

Location:
_plugins_/logos_roles/branches/v1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/logos_roles/branches/v1/logos_roles_fonctions.php

    r111571 r113282  
    243243 * Surcharge du critère `logo`
    244244 *
    245  * @uses lister_objets_avec_logos_roles()
    246  *     Pour obtenir les éléments qui ont un logo
     245 * Tout comme le critère {logo} par défaut, on permet de sélectionner tous les
     246 * objets qui ont un logo, quel qu'il soit, au format historique ou au format
     247 * document.
     248 *
     249 * Un unique paramètre optionnel permet de se restreindre à un rôle
     250 * particulier. Par exemple, {logo accueil} permet de sélectionner les logos
     251 * dont le rôle est 'logo_accueil'.
     252 *
     253 * {!logo} permet d'inverser la sélection, pour avoir les objets qui n'ont PAS
     254 * de logo.
     255 *
     256 * @uses lister_objets_avec_logos()
     257 *     Pour obtenir les éléments qui ont un logo enregistrés avec la méthode
     258 *     "historique".
    247259 *
    248260 * @param string $idb Identifiant de la boucle
     
    253265function critere_logo($idb, &$boucles, $crit) {
    254266
    255         $not = $crit->not;
    256267        $boucle = &$boucles[$idb];
    257268
    258         $c = "sql_in('" .
    259                 $boucle->id_table . '.' . $boucle->primary
    260                         . "', lister_objets_avec_logos_roles('" . $boucle->primary . "'), '')";
    261 
    262         if ($crit->cond) {
    263                 $c = "($arg ? $c : 1)";
    264         }
    265 
    266         if ($not) {
    267                 $boucle->where[] = array("'NOT'", $c);
     269        // On interprète le premier paramètre du critère, qui nous donne le type de
     270        // logo
     271        if (count($crit->param)) {
     272                $type_logo = calculer_liste(
     273                        array_shift($crit->param),
     274                        array(),
     275                        $boucles,
     276                        $boucle->id_parent
     277                );
     278                $type_logo = trim($type_logo, "'");
     279        }
     280
     281        // Pour ajouter la jointure qu'il nous faut à la boucle, on lui donne le
     282        // premier alias L* qui n'est pas utilisé.
     283        $i = 1;
     284        while (isset($boucle->from["L$i"])) {
     285                $i++;
     286        }
     287        $alias_jointure = "L$i";
     288
     289        $alias_table = $boucle->id_table;
     290        $id_table_objet = $boucle->primary;
     291
     292        // On fait un LEFT JOIN avec les liens de documents qui correspondent au(x)
     293        // rôle(s) cherchés. Cela permet de sélectionner aussi les objets qui n'ont
     294        // pas de logo, dont le rôle sera alors NULL. C'est nécessaire pour pouvoir
     295        // gérer les logos enregistrés avec l'ancienne méthode, et pour {!logo}.
     296        $boucle->from[$alias_jointure] = 'spip_documents_liens';
     297        $boucle->from_type[$alias_jointure] = 'LEFT';
     298        $boucle->join[$alias_jointure] = array(
     299                "'$alias_table'",
     300                "'id_objet'",
     301                "'$id_table_objet'",
     302                "'$alias_jointure.objet='.sql_quote('" . objet_type($alias_table) . "')." .
     303                "' AND $alias_jointure.role LIKE \'logo\_" . ($type_logo ?: '%') . "\''",
     304        );
     305        $boucle->group[] = "$alias_table.$id_table_objet";
     306
     307        // On calcule alors le where qui va bien.
     308        if ($crit->not) {
     309                $where = "$alias_jointure.role IS NULL";
    268310        } else {
    269                 $boucle->where[] = $c;
    270         }
    271 }
    272 
    273 /**
    274  * Retourne pour une clé primaire d'objet donnée les identifiants ayant un logo
    275  *
    276  * Version pour les logos par rôle de la fonction lister_objets_avec_logos du
    277  * core. On utilise l'API chercher_logo au lieu de parcourir le dossier IMG/.
    278  *
    279  * @param string $type
    280  *     Nom de la clé primaire de l'objet
    281  * @return string
    282  *     Liste des identifiants ayant un logo (séparés par une virgule)
    283  **/
    284 function lister_objets_avec_logos_roles($type) {
    285 
    286         $logos = array();
    287         $chercher_logo = charger_fonction('chercher_logo', 'inc/');
    288 
    289         $rows = sql_allfetsel($type, table_objet_sql($type));
    290 
    291         foreach ($rows as $r) {
    292                 if (! empty($chercher_logo($r[$type], $type))) {
    293                         $logos[] = $r[$type];
    294                 }
    295         }
    296 
    297         return join(',', $logos);
     311                $where = array(
     312                        "'LIKE'",
     313                        "'$alias_jointure.role'",
     314                        "'\'logo\_" . ($type_logo ?: '%') . "\''",
     315                );
     316        }
     317
     318        // Rétro-compatibilité : Si l'on ne cherche pas un type de logo particulier,
     319        // on retourne aussi les logos enregistrés avec la méthode "historique".
     320        if (! $type_logo) {
     321                $where_historique =
     322                        'sql_in('
     323                        . "'$alias_table.$id_table_objet', "
     324                        . "lister_objets_avec_logos('$id_table_objet'), "
     325                        . "'')";
     326
     327                if ($crit->not) {
     328                        $where_historique = array("'NOT'", $where_historique);
     329                }
     330
     331                $where = array(
     332                        "'OR'",
     333                        $where,
     334                        $where_historique
     335                );
     336        }
     337
     338        // On ajoute le where à la boucle
     339        $boucle->where[] = $where;
    298340}
    299341
  • _plugins_/logos_roles/branches/v1/paquet.xml

    r111571 r113282  
    22        prefix="logos_roles"
    33        categorie="multimedia"
    4         version="0.8.6"
     4        version="0.8.7"
    55        etat="stable"
    66        compatibilite="[3.1.1;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.