Dépôt officiel du core SPIP * Anciennement présent sur svn://trac.rezo.net/spip * Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/SPIP/[nom du plugin dist] https://www.spip.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

390 lines
10 KiB

11 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Système de publication pour l'internet *
  4. * *
  5. * Copyright © avec tendresse depuis 2001 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
  9. * Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. /**
  12. * Fonctions génériques pour les balises `#URL_XXXX`
  13. *
  14. * Les balises `URL_$type` sont génériques, sauf quelques cas particuliers.
  15. *
  16. * @package SPIP\Core\Compilateur\Balises
  17. **/
  18. if (!defined('_ECRIRE_INC_VERSION')) {
  19. return;
  20. }
  21. /**
  22. * Génère le code compilé des balises d'URL
  23. *
  24. * Utilise le premier paramètre de la balise d'URL comme identifiant d'objet
  25. * s'il est donné, sinon le prendra dans un champ d'une boucle englobante.
  26. *
  27. * @uses generer_generer_url_arg()
  28. * @param string $type
  29. * Type d'objet
  30. * @param Champ $p
  31. * Pile au niveau de la balise
  32. * @return string
  33. * Code compilé
  34. **/
  35. function generer_generer_url($type, $p) {
  36. $_id = interprete_argument_balise(1, $p);
  37. if (!$_id) {
  38. $primary = id_table_objet($type);
  39. $_id = champ_sql($primary, $p);
  40. }
  41. return generer_generer_url_arg($type, $p, $_id);
  42. }
  43. /**
  44. * Génère le code compilé des balises d'URL (en connaissant l'identifiant)
  45. *
  46. * - Si ces balises sont utilisées pour la base locale,
  47. * production des appels à `generer_url_entite(id-courant, entite)`
  48. * - Si la base est externe et sous SPIP, on produit
  49. *
  50. * - l'URL de l'objet si c'est une pièce jointe, ou sinon
  51. * - l'URL du site local appliqué sur l'objet externe,
  52. * ce qui permet de le voir à travers les squelettes du site local
  53. *
  54. * On communique le type-url distant à `generer_url_entite` mais il ne sert pas
  55. * car rien ne garantit que le .htaccess soit identique. À approfondir.
  56. *
  57. * @see generer_url_entite()
  58. *
  59. * @param string $type
  60. * Type d'objet
  61. * @param Champ $p
  62. * Pile au niveau de la balise
  63. * @param string $_id
  64. * Code compilé permettant d'obtenir l'identifiant de l'objet
  65. * @return string
  66. * Code compilé
  67. **/
  68. function generer_generer_url_arg($type, $p, $_id) {
  69. if ($s = trouver_nom_serveur_distant($p)) {
  70. // si une fonction de generation des url a ete definie pour ce connect l'utiliser
  71. if (function_exists($f = 'generer_generer_url_' . $s)) {
  72. return $f($type, $_id, $s);
  73. }
  74. if (!$GLOBALS['connexions'][strtolower($s)]['spip_connect_version']) {
  75. return null;
  76. }
  77. $s = _q($s);
  78. # exception des urls de documents sur un serveur distant...
  79. if ($type == 'document') {
  80. return
  81. "quete_meta('adresse_site', $s) . '/' .\n\t" .
  82. "quete_meta('dir_img', $s) . \n\t" .
  83. "quete_fichier($_id,$s)";
  84. }
  85. $s = ", '', '', $s, quete_meta('type_urls', $s)";
  86. } else {
  87. $s = ", '', '', true";
  88. }
  89. return "urlencode_1738(generer_url_entite($_id, '$type'$s))";
  90. }
  91. /**
  92. * Compile la balise générique `#URL_xxx` qui génère l'URL d'un objet
  93. *
  94. * S'il existe une fonction spécifique de calcul d'URL pour l'objet demandé,
  95. * tel que `balise_URL_ARTICLE_dist()`, la fonction l'utilisera. Sinon,
  96. * on calcule une URL de façon générique.
  97. *
  98. * @balise
  99. * @uses generer_generer_url()
  100. * @example
  101. * ```
  102. * #URL_ARTICLE
  103. * #URL_ARTICLE{3}
  104. * ```
  105. * @param Champ $p
  106. * Pile au niveau de la balise
  107. * @return Champ
  108. * Pile complétée par le code à générer
  109. */
  110. function balise_URL__dist($p) {
  111. $nom = $p->nom_champ;
  112. if ($nom === 'URL_') {
  113. $msg = ['zbug_balise_sans_argument', ['balise' => ' URL_']];
  114. erreur_squelette($msg, $p);
  115. $p->interdire_scripts = false;
  116. return $p;
  117. } elseif ($f = charger_fonction($nom, 'balise', true)) {
  118. return $f($p);
  119. } else {
  120. $nom = strtolower($nom);
  121. $code = generer_generer_url(substr($nom, 4), $p);
  122. $code = champ_sql($nom, $p, $code);
  123. $p->code = $code;
  124. if (!$p->etoile) {
  125. $p->code = "vider_url($code)";
  126. }
  127. $p->interdire_scripts = false;
  128. return $p;
  129. }
  130. }
  131. /**
  132. * Compile la balise `#URL_ARTICLE` qui génère l'URL d'un article
  133. *
  134. * Retourne l'URL (locale) d'un article mais retourne dans le cas
  135. * d'un article syndiqué (boucle SYNDIC_ARTICLES), son URL distante d'origine.
  136. *
  137. * @balise
  138. * @uses generer_generer_url()
  139. * @link https://www.spip.net/3963
  140. * @example
  141. * ```
  142. * #URL_ARTICLE
  143. * #URL_ARTICLE{3}
  144. * ```
  145. * @param Champ $p
  146. * Pile au niveau de la balise
  147. * @return Champ
  148. * Pile complétée par le code à générer
  149. */
  150. function balise_URL_ARTICLE_dist($p) {
  151. // Cas particulier des boucles (SYNDIC_ARTICLES)
  152. if ($p->type_requete == 'syndic_articles') {
  153. $code = champ_sql('url', $p);
  154. } else {
  155. $code = generer_generer_url('article', $p);
  156. }
  157. $p->code = $code;
  158. if (!$p->etoile) {
  159. $p->code = "vider_url($code)";
  160. }
  161. $p->interdire_scripts = false;
  162. return $p;
  163. }
  164. /**
  165. * Compile la balise `#URL_SITE` qui génère l'URL d'un site ou de cas spécifiques
  166. *
  167. * Génère une URL spécifique si la colonne SQL `url_site` est trouvée
  168. * (par exemple lien hypertexte d'un article), sinon l'URL d'un site syndiqué
  169. *
  170. * @balise
  171. * @uses generer_generer_url()
  172. * @see calculer_url()
  173. * @link https://www.spip.net/3861
  174. *
  175. * @param Champ $p
  176. * Pile au niveau de la balise
  177. * @return Champ
  178. * Pile complétée par le code à générer
  179. */
  180. function balise_URL_SITE_dist($p) {
  181. $code = champ_sql('url_site', $p);
  182. if (strpos($code, '@$Pile[0]') !== false) {
  183. $code = generer_generer_url('site', $p);
  184. if ($code === null) {
  185. return null;
  186. }
  187. } else {
  188. if (!$p->etoile) {
  189. $code = "calculer_url($code,'','url', \$connect)";
  190. }
  191. }
  192. $p->code = $code;
  193. $p->interdire_scripts = false;
  194. return $p;
  195. }
  196. // Autres balises URL_*, qui ne concernent pas une table
  197. // (historique)
  198. /**
  199. * Compile la balise `#URL_SITE_SPIP` qui retourne l'URL du site
  200. * telle que définie dans la configuration
  201. *
  202. * @balise
  203. * @link https://www.spip.net/4623
  204. *
  205. * @param Champ $p
  206. * Pile au niveau de la balise
  207. * @return Champ
  208. * Pile complétée par le code à générer
  209. */
  210. function balise_URL_SITE_SPIP_dist($p) {
  211. $p->code = "sinon(\$GLOBALS['meta']['adresse_site'],'.')";
  212. $p->code = 'spip_htmlspecialchars(' . $p->code . ')';
  213. $p->interdire_scripts = false;
  214. return $p;
  215. }
  216. /**
  217. * Compile la balise `#URL_PAGE` qui retourne une URL de type « page »
  218. *
  219. * - `#URL_PAGE{nom}` génère l'url pour la page `nom`
  220. * - `#URL_PAGE{nom,param=valeur}` génère l'url pour la page `nom` avec des paramètres
  221. * - `#URL_PAGE` sans argument retourne l'URL courante.
  222. * - `#URL_PAGE*` retourne l'URL sans convertir les `&` en `&amp;`
  223. *
  224. * @balise
  225. * @link https://www.spip.net/4630
  226. * @see generer_url_public()
  227. * @example
  228. * ```
  229. * #URL_PAGE{backend} produit ?page=backend
  230. * #URL_PAGE{backend,id_rubrique=1} est équivalent à
  231. * [(#URL_PAGE{backend}|parametre_url{id_rubrique,1})]
  232. * ```
  233. *
  234. * @param Champ $p
  235. * Pile au niveau de la balise
  236. * @return Champ
  237. * Pile complétée par le code à générer
  238. */
  239. function balise_URL_PAGE_dist($p) {
  240. $code = interprete_argument_balise(1, $p);
  241. $args = interprete_argument_balise(2, $p);
  242. if ($args == null) {
  243. $args = "''";
  244. }
  245. if ($s = trouver_nom_serveur_distant($p)) {
  246. // si une fonction de generation des url a ete definie pour ce connect l'utiliser
  247. // elle devra aussi traiter le cas derogatoire type=page
  248. if (function_exists($f = 'generer_generer_url_' . $s)) {
  249. if ($args and $args !== "''") {
  250. $code .= ", $args";
  251. }
  252. $code = $f('page', $code, $s);
  253. $p->code = $code;
  254. return $p;
  255. }
  256. $s = 'connect=' . addslashes($s);
  257. $args = (($args and $args !== "''") ? "$args . '&$s'" : "'$s'");
  258. }
  259. if (!$code) {
  260. $noentities = $p->etoile ? "'&'" : '';
  261. $code = "url_de_base() . preg_replace(',^./,', '', self($noentities))";
  262. } else {
  263. if (!$args) {
  264. $args = "''";
  265. }
  266. $noentities = $p->etoile ? ', true' : '';
  267. $code = "generer_url_public($code, $args$noentities)";
  268. }
  269. $p->code = $code;
  270. spip_log("Calcul url page : connect vaut $s ca donne :" . $p->code . " args $args", _LOG_INFO);
  271. #$p->interdire_scripts = true;
  272. return $p;
  273. }
  274. /**
  275. * Compile la balise `#URL_ECRIRE` qui retourne une URL d'une page de l'espace privé
  276. *
  277. * - `#URL_ECRIRE{nom}` génère l'url pour la page `nom` de l'espace privé
  278. * - `#URL_ECRIRE{nom,param=valeur}` génère l'url pour la page `nom` avec des paramètres
  279. * - `#URL_ECRIRE` génère l'url pour la page d'accueil de l'espace privé
  280. * - `#URL_ECRIRE*` retourne l'URL sans convertir les `&` en `&amp;`
  281. *
  282. * @balise
  283. * @link https://www.spip.net/5566
  284. * @see generer_url_ecrire()
  285. * @example
  286. * ```
  287. * #URL_ECRIRE{rubriques} -> ecrire/?exec=rubriques
  288. * ```
  289. *
  290. * @param Champ $p
  291. * Pile au niveau de la balise
  292. * @return Champ
  293. * Pile complétée par le code à générer
  294. */
  295. function balise_URL_ECRIRE_dist($p) {
  296. $code = interprete_argument_balise(1, $p);
  297. if (!$code) {
  298. $fonc = "''";
  299. } else {
  300. $fonc = $code;
  301. $args = interprete_argument_balise(2, $p);
  302. if ($args === null) {
  303. $args = "''";
  304. }
  305. $noentities = $p->etoile ? ', true' : '';
  306. if (($args != "''") or $noentities) {
  307. $fonc .= ",$args$noentities";
  308. }
  309. }
  310. $p->code = 'generer_url_ecrire(' . $fonc . ')';
  311. $p->interdire_scripts = false;
  312. return $p;
  313. }
  314. /**
  315. * Compile la balise `#URL_ACTION_AUTEUR` qui retourne une URL d'action
  316. * sécurisée pour l'auteur en cours
  317. *
  318. * La balise accepte 3 paramètres. Les 2 premiers sont obligatoires :
  319. *
  320. * - le nom de l'action
  321. * - l'argument transmis à l'action (une chaîne de caractère)
  322. * - une éventuelle URL de redirection qui sert une fois l'action réalisée
  323. *
  324. * @balise
  325. * @see generer_action_auteur()
  326. * @example
  327. * `#URL_ACTION_AUTEUR{converser,arg,redirect}` pourra produire
  328. * `ecrire/?action=converser&arg=arg&hash=xxx&redirect=redirect`
  329. *
  330. * @param Champ $p
  331. * Pile au niveau de la balise
  332. * @return Champ
  333. * Pile complétée par le code à générer
  334. */
  335. function balise_URL_ACTION_AUTEUR_dist($p) {
  336. $p->descr['session'] = true;
  337. $p->code = interprete_argument_balise(1, $p);
  338. $args = interprete_argument_balise(2, $p);
  339. if ($args != "''" && $args !== null) {
  340. $p->code .= ',' . $args;
  341. }
  342. $redirect = interprete_argument_balise(3, $p);
  343. if ($redirect != "''" && $redirect !== null) {
  344. if ($args == "''" || $args === null) {
  345. $p->code .= ",''";
  346. }
  347. $p->code .= ',' . $redirect;
  348. }
  349. $p->code = 'generer_action_auteur(' . $p->code . ')';
  350. $p->interdire_scripts = false;
  351. return $p;
  352. }