Changeset 125289 in spip-zone


Ignore:
Timestamp:
Jun 24, 2020, 9:32:45 AM (3 weeks ago)
Author:
tcharlss
Message:

[WIP] Une nouvelle balise Spip pour produire une balise img en fonction d'un rôle de document. Un peu l'équivalent de la balise #LOGO, mais ça se base sur des rôles donc. Et c'est utile uniquement pour les rôles uniques à usage unique bien sûr.

Pas encore fixé sur le nom de la balise, pour l'instant c'est #IMAGEROLE_{role} : par exemple #IMAGEROLE_COUVERTURE, #IMAGEROLE_4COUV, etc.. On peut aussi faire #IMAGEROLE_COUVERTURE{patate,10} en dehors d'une boucle.

Voir ticket #2 pour les tergiversations sur le nom de la balise.

Rangement : on en profite pour déplacer tous les critères et balises dans un fichier à part dans public/

Location:
_plugins_/roles_documents/branches/issue_2
Files:
2 added
2 edited
1 copied

Legend:

Unmodified
Added
Removed
  • _plugins_/roles_documents/branches/issue_2/lang/roles_documents_fr.php

    r109228 r125289  
    2828        // T
    2929        'titre_ajouter_logo' => 'Ajouter un logo',
     30
     31        // Z
     32        'zbug_balise_role_inconnu' => 'Rôle inconnu pour la balise @balise@',
     33        'zbug_balise_hors_boucle' => 'Hors boucle, @balise@ nécessite 2 paramètres'
    3034);
  • _plugins_/roles_documents/branches/issue_2/roles_documents_fonctions.php

    r115977 r125289  
    1515}
    1616
     17// Balises et critères
     18include_spip('public/roles_documents');
    1719
    1820/**
     
    139141        return $roles_documents;
    140142}
    141 
    142 /**
    143  * Surcharge du critère `logo`
    144  *
    145  * Tout comme le critère {logo} par défaut, on permet de sélectionner tous les
    146  * objets qui ont un logo, quel qu'il soit, au format historique ou au format
    147  * document.
    148  *
    149  * Un unique paramètre optionnel permet de se restreindre à un rôle
    150  * particulier. Par exemple, {logo accueil} permet de sélectionner les logos
    151  * dont le rôle est 'logo_accueil'.
    152  *
    153  * {!logo} permet d'inverser la sélection, pour avoir les objets qui n'ont PAS
    154  * de logo.
    155  *
    156  * @uses lister_objets_avec_logos()
    157  *     Pour obtenir les éléments qui ont un logo enregistrés avec la méthode
    158  *     "historique".
    159  *
    160  * @param string $idb Identifiant de la boucle
    161  * @param array $boucles AST du squelette
    162  * @param Critere $crit Paramètres du critère dans cette boucle
    163  * @return void
    164  */
    165 function critere_logo($idb, &$boucles, $crit) {
    166 
    167         $boucle = &$boucles[$idb];
    168 
    169         // On interprète le premier paramètre du critère, qui nous donne le type de
    170         // logo
    171         if (count($crit->param)) {
    172                 $type_logo = calculer_liste(
    173                         array_shift($crit->param),
    174                         array(),
    175                         $boucles,
    176                         $boucle->id_parent
    177                 );
    178                 $type_logo = trim($type_logo, "'");
    179         }
    180 
    181         // Pour ajouter la jointure qu'il nous faut à la boucle, on lui donne le
    182         // premier alias L* qui n'est pas utilisé.
    183         $i = 1;
    184         while (isset($boucle->from["L$i"])) {
    185                 $i++;
    186         }
    187         $alias_jointure = "L$i";
    188 
    189         $alias_table = $boucle->id_table;
    190         $id_table_objet = $boucle->primary;
    191 
    192         // On fait un LEFT JOIN avec les liens de documents qui correspondent au(x)
    193         // rôle(s) cherchés. Cela permet de sélectionner aussi les objets qui n'ont
    194         // pas de logo, dont le rôle sera alors NULL. C'est nécessaire pour pouvoir
    195         // gérer les logos enregistrés avec l'ancienne méthode, et pour {!logo}.
    196         $boucle->from[$alias_jointure] = 'spip_documents_liens';
    197         $boucle->from_type[$alias_jointure] = 'LEFT';
    198         $boucle->join[$alias_jointure] = array(
    199                 "'$alias_table'",
    200                 "'id_objet'",
    201                 "'$id_table_objet'",
    202                 "'$alias_jointure.objet='.sql_quote('" . objet_type($alias_table) . "')." .
    203                 "' AND $alias_jointure.role LIKE \'logo\_" . ($type_logo ?: '%') . "\''",
    204         );
    205         $boucle->group[] = "$alias_table.$id_table_objet";
    206 
    207         // On calcule alors le where qui va bien.
    208         if ($crit->not) {
    209                 $where = "$alias_jointure.role IS NULL";
    210         } else {
    211                 $where = array(
    212                         "'LIKE'",
    213                         "'$alias_jointure.role'",
    214                         "'\'logo\_" . ($type_logo ?: '%') . "\''",
    215                 );
    216         }
    217 
    218         // Rétro-compatibilité : Si l'on ne cherche pas un type de logo particulier,
    219         // on retourne aussi les logos enregistrés avec la méthode "historique".
    220         if (! $type_logo) {
    221                 $where_historique =
    222                         'sql_in('
    223                         . "'$alias_table.$id_table_objet', "
    224                         . "lister_objets_avec_logos('$id_table_objet'), "
    225                         . "'')";
    226 
    227                 if ($crit->not) {
    228                         $where_historique = array("'NOT'", $where_historique);
    229                 }
    230 
    231                 $where = array(
    232                         "'OR'",
    233                         $where,
    234                         $where_historique
    235                 );
    236         }
    237 
    238         // On ajoute le where à la boucle
    239         $boucle->where[] = $where;
    240 }
Note: See TracChangeset for help on using the changeset viewer.