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.

430 lines
13 KiB

10 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. * Utilisations de pipelines
  13. *
  14. * @package SPIP\Medias\Pipelines
  15. **/
  16. if (!defined('_ECRIRE_INC_VERSION')) {
  17. return;
  18. }
  19. /**
  20. * Traiter le cas pathologique d'un upload de document ayant echoué
  21. * car étant trop gros
  22. *
  23. * @uses erreur_upload_trop_gros()
  24. * @pipeline detecter_fond_par_defaut
  25. * @param string $fond
  26. * Nom du squelette par défaut qui sera utilisé
  27. * @return string
  28. * Nom du squelette par défaut qui sera utilisé
  29. **/
  30. function medias_detecter_fond_par_defaut($fond) {
  31. if (
  32. empty($_GET) and empty($_POST) and empty($_FILES)
  33. and isset($_SERVER['CONTENT_LENGTH'])
  34. and isset($_SERVER['CONTENT_TYPE'])
  35. and strstr($_SERVER['CONTENT_TYPE'], 'multipart/form-data;')
  36. ) {
  37. include_spip('inc/getdocument');
  38. erreur_upload_trop_gros();
  39. }
  40. return $fond;
  41. }
  42. /**
  43. * À chaque insertion d'un nouvel objet editorial
  44. * auquel on a attaché des documents, restituer l'identifiant
  45. * du nouvel objet crée sur les liaisons documents/objet,
  46. * qui ont ponctuellement un identifiant id_objet négatif.
  47. *
  48. * @see medias_affiche_gauche()
  49. * @pipeline post_insertion
  50. *
  51. * @param array $flux
  52. * Données du pipeline
  53. * @return array
  54. * Données du pipeline
  55. **/
  56. function medias_post_insertion($flux) {
  57. $objet = objet_type($flux['args']['table']);
  58. $id_objet = $flux['args']['id_objet'];
  59. $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur']) ? $GLOBALS['visiteur_session']['id_auteur'] : 0;
  60. include_spip('inc/autoriser');
  61. if (autoriser('joindredocument', $objet, $id_objet) and $id_auteur) {
  62. # cf. HACK medias_affiche_gauche()
  63. # rattrapper les documents associes a cet objet nouveau
  64. # ils ont un id = 0-id_auteur
  65. # utiliser l'api editer_lien pour les appels aux pipeline edition_lien
  66. include_spip('action/editer_liens');
  67. $liens = objet_trouver_liens(['document' => '*'], [$objet => 0 - $id_auteur]);
  68. foreach ($liens as $lien) {
  69. objet_associer(['document' => $lien['document']], [$objet => $id_objet], $lien);
  70. }
  71. // un simple delete pour supprimer les liens temporaires
  72. sql_delete('spip_documents_liens', ['id_objet = ' . (0 - $id_auteur), 'objet=' . sql_quote($objet)]);
  73. }
  74. return $flux;
  75. }
  76. /**
  77. * Ajoute la configuration des documents à la page de configuration des contenus
  78. *
  79. * @pipeline affiche_milieu
  80. * @param array $flux
  81. * @return array
  82. */
  83. function medias_affiche_milieu($flux) {
  84. if ($flux['args']['exec'] == 'configurer_contenu') {
  85. $flux['data'] .= recuperer_fond(
  86. 'prive/squelettes/inclure/configurer',
  87. ['configurer' => 'configurer_documents']
  88. );
  89. }
  90. return $flux;
  91. }
  92. /**
  93. * Définir les meta de configuration liées aux documents
  94. *
  95. * @pipeline configurer_liste_metas
  96. * @param array $config
  97. * Couples nom de la méta => valeur par défaut
  98. * @return array
  99. * Couples nom de la méta => valeur par défaut
  100. */
  101. function medias_configurer_liste_metas($config) {
  102. $config['documents_objets'] = 'spip_articles';
  103. $config['documents_date'] = 'non';
  104. return $config;
  105. }
  106. /**
  107. * Institue ou met à jour les liens de documents après l'édition d'un objet
  108. *
  109. * @pipeline post_edition
  110. * @param array $flux
  111. * Données du pipeline
  112. * @return array
  113. * Données du pipeline
  114. **/
  115. function medias_post_edition($flux) {
  116. // le serveur n'est pas toujours la
  117. $serveur = (isset($flux['args']['serveur']) ? $flux['args']['serveur'] : '');
  118. // si on ajoute un document, mettre son statut a jour
  119. if (isset($flux['args']['action']) and $flux['args']['action'] == 'ajouter_document') {
  120. include_spip('action/editer_document');
  121. // mettre a jour le statut si necessaire
  122. document_instituer($flux['args']['id_objet']);
  123. } // si on institue un objet, mettre ses documents lies a jour
  124. elseif (isset($flux['args']['table']) and $flux['args']['table'] !== 'spip_documents') {
  125. $type = isset($flux['args']['type']) ? $flux['args']['type'] : objet_type($flux['args']['table']);
  126. // verifier d'abord les doublons !
  127. include_spip('inc/autoriser');
  128. if (autoriser('autoassocierdocument', $type, $flux['args']['id_objet'])) {
  129. $table_objet = isset($flux['args']['table_objet']) ?
  130. $flux['args']['table_objet'] : table_objet($flux['args']['table'], $serveur);
  131. $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
  132. $marquer_doublons_doc(
  133. $flux['data'],
  134. $flux['args']['id_objet'],
  135. $type,
  136. id_table_objet($type, $serveur),
  137. $table_objet,
  138. $flux['args']['table'],
  139. '',
  140. $serveur
  141. );
  142. }
  143. if (($flux['args']['action'] and $flux['args']['action'] == 'instituer') or isset($flux['data']['statut'])) {
  144. include_spip('base/abstract_sql');
  145. $id = $flux['args']['id_objet'];
  146. $docs = array_column(
  147. sql_allfetsel('id_document', 'spip_documents_liens', 'id_objet=' . intval($id) . ' AND objet=' . sql_quote($type)),
  148. 'id_document'
  149. );
  150. include_spip('action/editer_document');
  151. foreach ($docs as $id_document) {
  152. // mettre a jour le statut si necessaire
  153. document_instituer($id_document);
  154. }
  155. }
  156. } else {
  157. if (isset($flux['args']['table']) and $flux['args']['table'] !== 'spip_documents') {
  158. // verifier les doublons !
  159. $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
  160. $marquer_doublons_doc(
  161. $flux['data'],
  162. $flux['args']['id_objet'],
  163. $flux['args']['type'],
  164. id_table_objet($flux['args']['type'], $serveur),
  165. $flux['args']['table_objet'],
  166. $flux['args']['spip_table_objet'],
  167. '',
  168. $serveur
  169. );
  170. }
  171. }
  172. return $flux;
  173. }
  174. /**
  175. * Ajouter le portfolio et ajout de document sur les fiches objet
  176. *
  177. * Uniquement sur les objets pour lesquelles les medias ont été activés
  178. *
  179. * @pipeline afficher_complement_objet
  180. * @param array $flux
  181. * @return array
  182. */
  183. function medias_afficher_complement_objet($flux) {
  184. if (
  185. $type = $flux['args']['type']
  186. and $id = intval($flux['args']['id'])
  187. ) {
  188. include_spip('inc/config');
  189. // document autorisé en upload sur cet objet ?
  190. if ($type == 'article' or in_array(table_objet_sql($type), explode(',', lire_config('documents_objets', '')))) {
  191. $documenter_objet = charger_fonction('documenter_objet', 'inc');
  192. $flux['data'] .= $documenter_objet($id, $type);
  193. }
  194. }
  195. return $flux;
  196. }
  197. /**
  198. * Ajoute le formulaire d'ajout de document au formulaire d'édition
  199. * d'un objet (lorsque cet objet peut recevoir des documents).
  200. *
  201. * @note
  202. * HACK : Lors d'une première création de l'objet, celui-ci n'ayant pas
  203. * encore d'identifiant tant que le formulaire d'édition n'est pas enregistré,
  204. * les liaisions entre les documents liés et l'objet à créer sauvegardent
  205. * un identifiant d'objet négatif de la valeur de id_auteur (l'auteur
  206. * connecte). Ces liaisons seront corrigées après validation dans
  207. * le pipeline medias_post_insertion()
  208. *
  209. * @pipeline affiche_gauche
  210. * @see medias_post_insertion()
  211. *
  212. * @param array $flux
  213. * Données du pipeline
  214. * @return array
  215. * Données du pipeline
  216. */
  217. function medias_affiche_gauche($flux) {
  218. if (
  219. $en_cours = trouver_objet_exec($flux['args']['exec'])
  220. and $en_cours['edition'] !== false // page edition uniquement
  221. and $type = $en_cours['type']
  222. and $id_table_objet = $en_cours['id_table_objet']
  223. // id non defini sur les formulaires de nouveaux objets
  224. and (isset($flux['args'][$id_table_objet]) and $id = intval($flux['args'][$id_table_objet])
  225. // et justement dans ce cas, on met un identifiant negatif
  226. or $id = 0 - $GLOBALS['visiteur_session']['id_auteur'])
  227. and autoriser('joindredocument', $type, $id)
  228. ) {
  229. $flux['data'] .= recuperer_fond(
  230. 'prive/objets/editer/colonne_document',
  231. ['objet' => $type, 'id_objet' => $id]
  232. );
  233. }
  234. return $flux;
  235. }
  236. /**
  237. * Utilisation du pipeline document_desc_actions
  238. *
  239. * Ne fait rien ici.
  240. *
  241. * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires
  242. * sur les formulaires d'ajouts de documents
  243. *
  244. * @pipeline document_desc_actions
  245. * @param array $flux
  246. * Données du pipeline
  247. * @return array
  248. * Données du pipeline
  249. **/
  250. function medias_document_desc_actions($flux) {
  251. return $flux;
  252. }
  253. /**
  254. * Utilisation du pipeline editer_document_actions
  255. *
  256. * Ne fait rien ici.
  257. *
  258. * Ce pipeline permet aux plugins d'ajouter de boutons d'action supplémentaires
  259. * sur les formulaires d'édition de documents
  260. *
  261. * @pipeline editer_document_actions
  262. * @param array $flux
  263. * Données du pipeline
  264. * @return array
  265. * Données du pipeline
  266. **/
  267. function medias_editer_document_actions($flux) {
  268. return $flux;
  269. }
  270. /**
  271. * Utilisation du pipeline renseigner_document_distant
  272. *
  273. * Ne fait rien ici.
  274. *
  275. * Ce pipeline permet aux plugins de renseigner les clés `fichier` et
  276. * `mode` d'un document distant à partir de l'URL du fichier dans
  277. * la clé `source`.
  278. *
  279. * @see renseigner_source_distante()
  280. * @pipeline renseigner_document_distant
  281. * @param array $flux
  282. * Données du pipeline
  283. * @return array
  284. * Données du pipeline
  285. **/
  286. function medias_renseigner_document_distant($flux) {
  287. return $flux;
  288. }
  289. /**
  290. * Compter les documents dans un objet
  291. *
  292. * @pipeline objet_compte_enfants
  293. * @param array $flux
  294. * @return array
  295. */
  296. function medias_objet_compte_enfants($flux) {
  297. if (
  298. $objet = $flux['args']['objet']
  299. and $id = intval($flux['args']['id_objet'])
  300. ) {
  301. // juste les publies ?
  302. if (array_key_exists('statut', $flux['args']) and ($flux['args']['statut'] == 'publie')) {
  303. $flux['data']['document'] = sql_countsel(
  304. 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
  305. 'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval($id) . " AND (D.statut='publie') and D.mode NOT IN ('logoon','logoff') "
  306. );
  307. } else {
  308. $flux['data']['document'] = sql_countsel(
  309. 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document',
  310. 'L.objet=' . sql_quote($objet) . 'AND L.id_objet=' . intval($id) . " AND (D.statut='publie' OR D.statut='prepa') and D.mode NOT IN ('logoon','logoff')"
  311. );
  312. }
  313. }
  314. return $flux;
  315. }
  316. /**
  317. * Afficher le nombre de documents dans chaque rubrique
  318. *
  319. * @pipeline boite_infos
  320. * @param array $flux
  321. * @return array
  322. */
  323. function medias_boite_infos($flux) {
  324. if (
  325. $flux['args']['type'] == 'rubrique'
  326. and $id_rubrique = $flux['args']['id']
  327. ) {
  328. if ($nb = sql_countsel('spip_documents_liens', "objet='rubrique' AND id_objet=" . intval($id_rubrique))) {
  329. $nb = '<div>' . singulier_ou_pluriel($nb, 'medias:un_document', 'medias:des_documents') . '</div>';
  330. if ($p = strpos($flux['data'], '<!--nb_elements-->')) {
  331. $flux['data'] = substr_replace($flux['data'], $nb, $p, 0);
  332. }
  333. }
  334. }
  335. return $flux;
  336. }
  337. /**
  338. * Insertion dans le pipeline revisions_chercher_label (Plugin révisions)
  339. * Trouver le bon label à afficher sur les champs dans les listes de révisions
  340. *
  341. * Si un champ est un champ extra, son label correspond au label défini du champs extra
  342. *
  343. * @pipeline revisions_chercher_label
  344. * @param array $flux Données du pipeline
  345. * @return array Données du pipeline
  346. **/
  347. function medias_revisions_chercher_label($flux) {
  348. foreach (['id_vignette', 'hauteur', 'largeur', 'mode', 'taille'] as $champ) {
  349. if ($flux['args']['champ'] == $champ) {
  350. $flux['data'] = 'medias:info_' . $champ;
  351. return $flux;
  352. }
  353. }
  354. foreach (['fichier', 'taille', 'mode', 'credits'] as $champ) {
  355. if ($flux['args']['champ'] == $champ) {
  356. $flux['data'] = 'medias:label_' . $champ;
  357. return $flux;
  358. }
  359. }
  360. if ($flux['args']['champ'] == 'distant') {
  361. $flux['data'] = $flux['data'] = 'medias:fichier_distant';
  362. }
  363. return $flux;
  364. }
  365. /**
  366. * Publier une rubrique ayant un document joint…
  367. *
  368. * @param array $flux
  369. * @return array
  370. */
  371. function medias_calculer_rubriques($flux) {
  372. $r = sql_select(
  373. 'R.id_rubrique AS id, max(D.date) AS date_h',
  374. ['spip_rubriques AS R', 'spip_documents_liens AS DL', 'spip_documents AS D'],
  375. [
  376. 'R.id_rubrique = DL.id_objet',
  377. "DL.objet = 'rubrique'",
  378. 'D.id_document = DL.id_document',
  379. "D.statut = 'publie'",
  380. 'D.date > R.date_tmp',
  381. sql_in('D.mode', ['image', 'document'])
  382. ],
  383. 'R.id_rubrique'
  384. );
  385. while ($row = sql_fetch($r)) {
  386. sql_updateq(
  387. 'spip_rubriques',
  388. ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']],
  389. 'id_rubrique=' . $row['id']
  390. );
  391. }
  392. return $flux;
  393. }