Changeset 31574 in spip-zone


Ignore:
Timestamp:
Sep 14, 2009, 12:45:56 PM (10 years ago)
Author:
rastapopoulos@…
Message:

Une nouvelle fonctionnalité générique dans bonux : optenir les infos de n'importe quel type d'objet.

#INFO_<QUOI>{type_objet, id_objet}

Exemple :
#INFO_TITRE{article, 2}
#INFO_TITRE{patate, #ENV{id_patate}}

Il y a une fontion PHP associé qu'on peut donc utiliser dans ses scripts : generer_info_entite($id_objet, $type_objet, $info).

Par défaut une info est tout simplement le champ SQL de l'objet mais c'est personnalisable par une fonction generer_<quoi>_entite().
En effet, il y a des infos qui sont calculées et ne sont donc pas le champ directement.

De plus, deux infos sont prisent en compte en interne par la fonction : l'URL via generer_url_entite() et le titre car SPIP permet de déclarer un titre autre que le champ SQL "titre".

La fonction respecte la magie de SPIP : l'information demandée va être automatiquement transformée s'il y a des traitements automatiques de déclarés pour cette info (cf. la gobale $table_des_traitements). Notamment pour gérer directement les textes <multi> et autres transformations.

Location:
_plugins_/spip-bonux-2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/spip-bonux-2/plugin.xml

    r31282 r31574  
    44  <icon>img_pack/spip-bonux.png</icon>
    55  <licence>(c) 2008-2009 GPL</licence>
    6   <version>1.8.2</version>
     6  <version>1.8.3</version>
    77  <etat>stable</etat>
    88  <description>Le plugin qui lave plus SPIP que SPIP, avec des chouettes cadeaux dedans ! Interface douce, boucles POUR et CONDITION, tableaux, compteur, etc.</description>
  • _plugins_/spip-bonux-2/public/spip_bonux_balises.php

    r29215 r31574  
    311311        return $p;
    312312}
     313
     314/**
     315 * Generer n'importe quel info pour un objet : #INFO_ARTICLE{#ENV{id_article}, titre}
     316 * Utilise la fonction generer_info_entite(), se reporter a sa documentation
     317 */
     318function balise_INFO__dist($p){
     319        $info = $p->nom_champ;
     320        $type_objet = interprete_argument_balise(1,$p);
     321        $id_objet = interprete_argument_balise(2,$p);
     322        if ($info === 'INFO_' or !$type_objet or !$id_objet) {
     323                $msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_'));
     324                erreur_squelette($msg, $p);
     325                $p->interdire_scripts = false;
     326                return $p;
     327        } elseif ($f = charger_fonction($nom, 'balise', true)) {
     328                return $f($p);
     329        }else {
     330                $p->code = champ_sql($info, $p);
     331                if (strpos($p->code, '@$Pile[0]') !== false) {
     332                        $info = strtolower(substr($info,5));
     333                        $p->code = "generer_info_entite($id_objet, $type_objet, '$info')";
     334                }
     335                $p->interdire_scripts = false;
     336                return $p;
     337        }
     338}
    313339?>
  • _plugins_/spip-bonux-2/spip_bonux_fonctions.php

    r28778 r31574  
    8686        return json_export(array('type'=>$type,'id'=>"$type|$id",'titre'=>$titre));
    8787}
     88
     89/**
     90 * Donner n'importe quelle information sur un objet de maniere generique.
     91 *
     92 * La fonction va gerer en interne deux cas particuliers les plus utilises :
     93 * l'URL et le titre (qui n'est pas forcemment la champ SQL "titre").
     94 *
     95 * On peut ensuite personnaliser les autres infos en creant une fonction
     96 * generer_<nom_info>_entite($id_objet, $type_objet, $ligne).
     97 * $ligne correspond a la ligne SQL de tous les champs de l'objet, les fonctions
     98 * de personnalisation n'ont donc pas a refaire de requete.
     99 *
     100 * @param int $id_objet
     101 * @param string $type_objet
     102 * @param string $info
     103 * @return string
     104 */
     105function generer_info_entite($id_objet, $type_objet, $info){
     106        // On verifie qu'on a tout ce qu'il faut
     107        $id_objet = intval($id_objet);
     108        if (!($id_objet and $type_objet and $info))
     109                return '';
     110       
     111        // Si on demande l'url, on retourne direct la fonction
     112        if ($info == 'url')
     113                return generer_url_entite($id_objet, $type_objet);
     114       
     115        // Si on demande le titre, on le gere en interne
     116        if ($demande_titre = ($info == 'titre')){
     117                global $table_titre;
     118                $champ_titre = $table_titre[table_objet($type_objet)];
     119                if (!$champ_titre) $champ_titre = 'titre';
     120                $champ_titre = ", $champ_titre";
     121        }
     122       
     123        // Sinon on va tout chercher dans la table et on garde en memoire
     124        static $objets;
     125       
     126        // On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore
     127        if (!$objets[$type_objet][$id_objet] or ($demande_titre and !$objets[$type_objet][$id_objet]['titre'])){
     128                include_spip('base/abstract_sql');
     129                include_spip('base/connect_sql');
     130                $objets[$type_objet][$id_objet] = sql_fetsel(
     131                        '*'.$champ_titre,
     132                        table_objet_sql($type_objet),
     133                        id_table_objet($type_objet).' = '.intval($id_objet)
     134                );
     135        }
     136        $ligne = $objets[$type_objet][$id_objet];
     137       
     138        if ($demande_titre)
     139                $info_generee = $objets[$type_objet][$id_objet]['titre'];
     140        // Si la fonction generer_TRUC_entite existe, on l'utilise
     141        else if ($generer = charger_fonction("generer_${info}_entite", '', true))
     142                $info_generee = $generer($id_objet, $type_objet, $ligne);
     143        // Sinon on prend le champ SQL
     144        else
     145                $info_generee = $ligne[$info];
     146       
     147        // On va ensuite chercher les traitements automatiques a faire
     148        global $table_des_traitements;
     149        $maj = strtoupper($info);
     150        $traitement = $table_des_traitements[$maj];
     151        $table_objet = table_objet($type_objet);
     152       
     153        if (is_array($traitement)){
     154                $traitement = $traitement[isset($traitement[$table_objet]) ? $table_objet : 0];
     155                $traitement = str_replace('%s', '"'.str_replace('"', '\\"', $info_generee).'"', $traitement);
     156                eval("\$info_generee = $traitement;");
     157        }
     158       
     159        return $info_generee;
     160}
     161
    88162?>
Note: See TracChangeset for help on using the changeset viewer.