Dépôt officiel du core SPIP * Copie possible par svn sur svn://trac.rezo.net/spip * Les svn:externals sont présent 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.
 
 
 
 

391 lines
10 KiB

  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2019 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details 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 = array('zbug_balise_sans_argument', array('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 http://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 http://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 http://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 http://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. return $p;
  254. }
  255. $s = 'connect=' . addslashes($s);
  256. $args = (($args and $args !== "''") ? "$args . '&$s'" : "'$s'");
  257. }
  258. if (!$code) {
  259. $noentities = $p->etoile ? "'&'" : '';
  260. $code = "url_de_base() . preg_replace(',^./,', '', self($noentities))";
  261. } else {
  262. if (!$args) {
  263. $args = "''";
  264. }
  265. $noentities = $p->etoile ? ", true" : '';
  266. $code = "generer_url_public($code, $args$noentities)";
  267. }
  268. $p->code = $code;
  269. spip_log("Calcul url page : connect vaut $s ca donne :" . $p->code . " args $args", _LOG_INFO);
  270. #$p->interdire_scripts = true;
  271. return $p;
  272. }
  273. /**
  274. * Compile la balise `#URL_ECRIRE` qui retourne une URL d'une page de l'espace privé
  275. *
  276. * - `#URL_ECRIRE{nom}` génère l'url pour la page `nom` de l'espace privé
  277. * - `#URL_ECRIRE{nom,param=valeur}` génère l'url pour la page `nom` avec des paramètres
  278. * - `#URL_ECRIRE` génère l'url pour la page d'accueil de l'espace privé
  279. * - `#URL_ECRIRE*` retourne l'URL sans convertir les `&` en `&amp;`
  280. *
  281. * @balise
  282. * @link http://www.spip.net/5566
  283. * @see generer_url_ecrire()
  284. * @example
  285. * ```
  286. * #URL_ECRIRE{rubriques} -> ecrire/?exec=rubriques
  287. * ```
  288. *
  289. * @param Champ $p
  290. * Pile au niveau de la balise
  291. * @return Champ
  292. * Pile complétée par le code à générer
  293. */
  294. function balise_URL_ECRIRE_dist($p) {
  295. $code = interprete_argument_balise(1, $p);
  296. if (!$code) {
  297. $fonc = "''";
  298. } else {
  299. $fonc = $code;
  300. $args = interprete_argument_balise(2, $p);
  301. if ($args === null) {
  302. $args = "''";
  303. }
  304. $noentities = $p->etoile ? ", true" : '';
  305. if (($args != "''") or $noentities) {
  306. $fonc .= ",$args$noentities";
  307. }
  308. }
  309. $p->code = 'generer_url_ecrire(' . $fonc . ')';
  310. $p->interdire_scripts = false;
  311. return $p;
  312. }
  313. /**
  314. * Compile la balise `#URL_ACTION_AUTEUR` qui retourne une URL d'action
  315. * sécurisée pour l'auteur en cours
  316. *
  317. * La balise accepte 3 paramètres. Les 2 premiers sont obligatoires :
  318. *
  319. * - le nom de l'action
  320. * - l'argument transmis à l'action (une chaîne de caractère)
  321. * - une éventuelle URL de redirection qui sert une fois l'action réalisée
  322. *
  323. * @balise
  324. * @see generer_action_auteur()
  325. * @example
  326. * `#URL_ACTION_AUTEUR{converser,arg,redirect}` pourra produire
  327. * `ecrire/?action=converser&arg=arg&hash=xxx&redirect=redirect`
  328. *
  329. * @param Champ $p
  330. * Pile au niveau de la balise
  331. * @return Champ
  332. * Pile complétée par le code à générer
  333. */
  334. function balise_URL_ACTION_AUTEUR_dist($p) {
  335. $p->descr['session'] = true;
  336. $p->code = interprete_argument_balise(1, $p);
  337. $args = interprete_argument_balise(2, $p);
  338. if ($args != "''" && $args !== null) {
  339. $p->code .= "," . $args;
  340. }
  341. $redirect = interprete_argument_balise(3, $p);
  342. if ($redirect != "''" && $redirect !== null) {
  343. if ($args == "''" || $args === null) {
  344. $p->code .= ",''";
  345. }
  346. $p->code .= "," . $redirect;
  347. }
  348. $p->code = "generer_action_auteur(" . $p->code . ")";
  349. $p->interdire_scripts = false;
  350. return $p;
  351. }