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; } }
/** * 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 (...) * @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 : ' (...)'; } $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; }
/** * 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; }