function vues_dist($type, $modele, $id, $content, $wid)
{
    // pour ce qui a une {lang_select} par defaut dans la boucle,
    // la regler histoire d'avoir la bonne typo dans le propre()
    // NB: ceci n'a d'impact que sur le "par defaut" en bas
    list($distant, $table) = distant_table($type);
    if (colonne_table($type, 'lang')) {
        $b = valeur_colonne_table($type, 'lang', $id);
        lang_select($a = array_pop($b));
    } else {
        lang_select($a = $GLOBALS['meta']['langue_site']);
    }
    // chercher vues/article_toto.html
    // sinon vues/toto.html
    if (find_in_path(($fond = 'vues/' . $type . '_' . $modele) . '.html') or find_in_path(($fond = 'vues/' . $modele) . '.html') or find_in_path(($fond = 'vues/' . $type) . '.html')) {
        $primary = function_exists('id_table_objet') ? id_table_objet($table) : 'id_' . $table;
        $contexte = array($primary => $id, 'crayon_type' => $type, 'crayon_modele' => $modele, 'champ' => $modele, 'class' => _request('class_' . $wid), 'self' => _request('self'), 'lang' => $GLOBALS['spip_lang']);
        $contexte = array_merge($contexte, $content);
        include_spip('public/assembler');
        return recuperer_fond($fond, $contexte);
    } else {
        // Par precaution on va rechercher la valeur
        // dans la base de donnees (meme si a priori la valeur est
        // ce qu'on vient d'envoyer, il y a nettoyage des caracteres et
        // eventuellement d'autres filtres de saisie...)
        $bdd = valeur_colonne_table($type, $modele, $id);
        if (count($bdd)) {
            $valeur = array_pop($bdd);
        } else {
            // les champs n'ont pas ete retrouves dans la base
            // ce qui signifie a priori que nous sommes en face d'une cle primaire compose
            // et qu'un crayon a modifie un element de cette cle (c'est pas malin !)
            // dans ce cas, on reaffiche a minima ce qu'on vient de publier
            // mais il sera impossible de le reediter dans la foulee avec le meme crayon
            // (car l'identifiant du crayon se base sur l'id).
            // Il faudra donc recharger la page pour pouvoir reediter.
            if (is_scalar($id)) {
                $valeur = $content[$modele];
            }
        }
        if ($valeur) {
            // seul spip core sait rendre les donnees
            if (function_exists('appliquer_traitement_champ')) {
                $valeur = appliquer_traitement_champ($valeur, $modele, table_objet($table));
            } else {
                if (in_array($modele, array('chapo', 'texte', 'descriptif', 'ps', 'bio'))) {
                    $valeur = propre($valeur);
                } else {
                    $valeur = typo($valeur);
                }
            }
        }
        return $valeur;
    }
}
Beispiel #2
0
/**
 * Calcul d'une introduction
 *
 * L'introduction est prise dans le descriptif s'il est renseigné,
 * sinon elle est calculée depuis le texte : à ce moment là,
 * l'introduction est prise dans le contenu entre les balises
 * `<intro>` et `</intro>` si présentes, sinon en coupant le
 * texte à la taille indiquée.
 *
 * Cette fonction est utilisée par la balise #INTRODUCTION
 *
 * @param string $descriptif
 *     Descriptif de l'introduction
 * @param string $texte
 *     Texte à utiliser en absence de descriptif
 * @param string $longueur
 *     Longueur de l'introduction
 * @param string $connect
 *     Nom du connecteur à la base de données
 * @param string $suite
 *     points de suite si on coupe (par defaut _INTRODUCTION_SUITE et sinon &nbsp;(...)
 * @return string
 *     Introduction calculée
 **/
function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null)
{
    // Si un descriptif est envoye, on l'utilise directement
    if (strlen($descriptif)) {
        return appliquer_traitement_champ($descriptif, 'introduction', '', array(), $connect);
    }
    // De preference ce qui est marque <intro>...</intro>
    $intro = '';
    $texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte);
    // minuscules
    while ($fin = strpos($texte, "</intro>")) {
        $zone = substr($texte, 0, $fin);
        $texte = substr($texte, $fin + strlen("</intro>"));
        if ($deb = strpos($zone, "<intro>") or substr($zone, 0, 7) == "<intro>") {
            $zone = substr($zone, $deb + 7);
        }
        $intro .= $zone;
    }
    // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
    // qui inclus raccourcis et modeles
    // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
    // par ailleurs le nettoyage des raccourcis ne tient pas compte
    // des surcharges et enrichissement de propre
    // couper doit se faire apres propre
    //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
    // Cependant pour des questions de perfs on coupe quand meme, en prenant
    // large et en se mefiant des tableaux #1323
    if (strlen($intro)) {
        $texte = $intro;
    } else {
        if (strpos("\n" . $texte, "\n|") === false and strlen($texte) > 2.5 * $longueur) {
            if (strpos($texte, "<multi") !== false) {
                $texte = extraire_multi($texte);
            }
            $texte = couper($texte, 2 * $longueur);
        }
    }
    // ne pas tenir compte des notes
    if ($notes = charger_fonction('notes', 'inc', true)) {
        $notes('', 'empiler');
    }
    // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
    // dans l'introduction.
    $texte = supprime_img($texte, '');
    $texte = appliquer_traitement_champ($texte, 'introduction', '', array(), $connect);
    if ($notes) {
        $notes('', 'depiler');
    }
    if (is_null($suite)) {
        $suite = defined('_INTRODUCTION_SUITE') ? _INTRODUCTION_SUITE : '&nbsp;(...)';
    }
    $texte = couper($texte, $longueur, $suite);
    // comme on a coupe il faut repasser la typo (on a perdu les insecables)
    $texte = typo($texte, true, $connect, array());
    // et reparagrapher si necessaire (coherence avec le cas descriptif)
    // une introduction a tojours un <p>
    if ($GLOBALS['toujours_paragrapher']) {
        $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
    }
    return $texte;
}
Beispiel #3
0
/**
 * Donner n'importe quelle information sur un objet de maniere generique.
 *
 * La fonction va gerer en interne deux cas particuliers les plus utilises :
 * l'URL et le titre (qui n'est pas forcemment le champ SQL "titre").
 *
 * On peut ensuite personnaliser les autres infos en creant une fonction
 * generer_<nom_info>_entite($id_objet, $type_objet, $ligne).
 * $ligne correspond a la ligne SQL de tous les champs de l'objet, les fonctions
 * de personnalisation n'ont donc pas a refaire de requete.
 *
 * @param int $id_objet
 * @param string $type_objet
 * @param string $info
 * @param string $etoile
 * @return string
 */
function generer_info_entite($id_objet, $type_objet, $info, $etoile = "")
{
    static $trouver_table = null;
    static $objets;
    // On verifie qu'on a tout ce qu'il faut
    $id_objet = intval($id_objet);
    if (!($id_objet and $type_objet and $info)) {
        return '';
    }
    // si on a deja note que l'objet n'existe pas, ne pas aller plus loin
    if (isset($objets[$type_objet]) and $objets[$type_objet] === false) {
        return '';
    }
    // Si on demande l'url, on retourne direct la fonction
    if ($info == 'url') {
        return generer_url_entite($id_objet, $type_objet);
    }
    // Sinon on va tout chercher dans la table et on garde en memoire
    $demande_titre = $info == 'titre';
    // 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
    if (!isset($objets[$type_objet][$id_objet]) or $demande_titre and !isset($objets[$type_objet][$id_objet]['titre'])) {
        if (!$trouver_table) {
            $trouver_table = charger_fonction('trouver_table', 'base');
        }
        $desc = $trouver_table(table_objet_sql($type_objet));
        if (!$desc) {
            return $objets[$type_objet] = false;
        }
        // Si on demande le titre, on le gere en interne
        $champ_titre = "";
        if ($demande_titre) {
            // si pas de titre declare mais champ titre, il sera peuple par le select *
            $champ_titre = !empty($desc['titre']) ? ', ' . $desc['titre'] : '';
        }
        include_spip('base/abstract_sql');
        include_spip('base/connect_sql');
        $objets[$type_objet][$id_objet] = sql_fetsel('*' . $champ_titre, $desc['table_sql'], id_table_objet($type_objet) . ' = ' . intval($id_objet));
    }
    // Si la fonction generer_TRUC_TYPE existe, on l'utilise pour formater $info_generee
    if ($generer = charger_fonction("generer_{$info}_{$type_objet}", '', true)) {
        $info_generee = $generer($id_objet, $objets[$type_objet][$id_objet]);
    } else {
        if ($generer = charger_fonction("generer_{$info}_entite", '', true)) {
            $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet]);
        } else {
            $info_generee = isset($objets[$type_objet][$id_objet][$info]) ? $objets[$type_objet][$id_objet][$info] : '';
        }
    }
    // On va ensuite appliquer les traitements automatiques si besoin
    if (!$etoile) {
        // FIXME: on fournit un ENV minimum avec id et type et connect=''
        // mais ce fonctionnement est a ameliorer !
        $info_generee = appliquer_traitement_champ($info_generee, $info, table_objet_sql($type_objet), array('id_objet' => $id_objet, 'objet' => $type_objet, ''));
    }
    return $info_generee;
}