PageRenderTime 26ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/plugins-dist/medias/medias_fonctions.php

https://bitbucket.org/re_al_/real.test.spip
PHP | 350 lines | 175 code | 38 blank | 137 comment | 32 complexity | 6ddc7e75bf516a5271fbaf34cbad2cfa MD5 | raw file
Possible License(s): LGPL-2.1, MIT
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2016 *
  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 utiles pour les squelettes et déclarations de boucle
  13. * pour le compilateur
  14. *
  15. * @package SPIP\Medias\Fonctions
  16. **/
  17. // sécurité
  18. if (!defined('_ECRIRE_INC_VERSION')) {
  19. return;
  20. }
  21. // nettoyer les zip abandonnes par l'utilisateur
  22. if (isset($GLOBALS['visiteur_session']['zip_to_clean'])
  23. and test_espace_prive()
  24. and isset($_SERVER['REQUEST_METHOD'])
  25. and $_SERVER['REQUEST_METHOD'] !== 'POST'
  26. ) {
  27. $zip_to_clean = unserialize($GLOBALS['visiteur_session']['zip_to_clean']);
  28. if ($zip_to_clean) {
  29. foreach ($zip_to_clean as $zip) {
  30. if (@file_exists($zip)) {
  31. @unlink($zip);
  32. }
  33. }
  34. }
  35. session_set('zip_to_clean');
  36. }
  37. // capturer un formulaire POST plus grand que post_max_size
  38. // on genere un minipres car on ne peut rien faire de mieux
  39. if (isset($_SERVER['REQUEST_METHOD'])
  40. and $_SERVER['REQUEST_METHOD'] == 'POST'
  41. and empty($_POST)
  42. and strlen($_SERVER['CONTENT_TYPE']) > 0
  43. and strncmp($_SERVER['CONTENT_TYPE'], 'multipart/form-data', 19) == 0
  44. and $_SERVER['CONTENT_LENGTH'] > medias_inigetoctets('post_max_size')
  45. ) {
  46. include_spip('inc/minipres');
  47. echo minipres(_T('medias:upload_limit', array('max' => ini_get('post_max_size'))));
  48. exit;
  49. }
  50. /**
  51. * Retourne la taille en octet d'une valeur de configuration php
  52. *
  53. * @param string $var
  54. * Clé de configuration ; valeur récupérée par `ini_get()`. Exemple `post_max_size`
  55. * @return int|string
  56. * Taille en octet, sinon chaine vide.
  57. **/
  58. function medias_inigetoctets($var) {
  59. $last = '';
  60. $val = trim(@ini_get($var));
  61. if (is_numeric($val)) {
  62. return $val;
  63. }
  64. // en octet si "32M"
  65. if ($val != '') {
  66. $last = strtolower($val[strlen($val) - 1]);
  67. $val = substr($val, 0, -1);
  68. }
  69. switch ($last) { // The 'G' modifier is available since PHP 5.1.0
  70. case 'g':
  71. $val *= 1024 * 1024 * 1024;
  72. break;
  73. case 'm':
  74. $val *= 1024 * 1024;
  75. break;
  76. case 'k':
  77. $val *= 1024;
  78. break;
  79. }
  80. return $val;
  81. }
  82. /**
  83. * Afficher la puce de statut pour les documents
  84. *
  85. * @param int $id_document
  86. * Identifiant du document
  87. * @param string $statut
  88. * Statut du document
  89. * @return string
  90. * Code HTML de l'image de puce
  91. */
  92. function medias_puce_statut_document($id_document, $statut) {
  93. if ($statut == 'publie') {
  94. $puce = 'puce-verte.gif';
  95. } else {
  96. if ($statut == 'prepa') {
  97. $puce = 'puce-blanche.gif';
  98. } else {
  99. if ($statut == 'poubelle') {
  100. $puce = 'puce-poubelle.gif';
  101. } else {
  102. $puce = 'puce-blanche.gif';
  103. }
  104. }
  105. }
  106. return http_img_pack($puce, $statut, "class='puce'");
  107. }
  108. /**
  109. * Compile la boucle `DOCUMENTS` qui retourne une liste de documents multimédia
  110. *
  111. * `<BOUCLE(DOCUMENTS)>`
  112. *
  113. * @param string $id_boucle
  114. * Identifiant de la boucle
  115. * @param array $boucles
  116. * AST du squelette
  117. * @return string
  118. * Code PHP compilé de la boucle
  119. **/
  120. function boucle_DOCUMENTS($id_boucle, &$boucles) {
  121. $boucle = &$boucles[$id_boucle];
  122. $id_table = $boucle->id_table;
  123. // on ne veut pas des fichiers de taille nulle,
  124. // sauf s'ils sont distants (taille inconnue)
  125. array_unshift($boucle->where, array("'($id_table.taille > 0 OR $id_table.distant=\\'oui\\')'"));
  126. /**
  127. * N'afficher que les modes de documents que l'on accepte
  128. * Utiliser le "pipeline medias_documents_visibles" pour en ajouter
  129. */
  130. if (!isset($boucle->modificateur['criteres']['mode'])
  131. and !isset($boucle->modificateur['tout'])
  132. ) {
  133. $modes = pipeline('medias_documents_visibles', array('image', 'document'));
  134. $f = sql_serveur('quote', $boucle->sql_serveur, true);
  135. $modes = addslashes(join(',', array_map($f, array_unique($modes))));
  136. array_unshift($boucle->where, array("'IN'", "'$id_table.mode'", "'($modes)'"));
  137. }
  138. return calculer_boucle($id_boucle, $boucles);
  139. }
  140. /**
  141. * Pour compat uniquement, utiliser generer_lien_entite
  142. *
  143. * @deprecated
  144. * @uses generer_lien_entite()
  145. *
  146. * @param int $id
  147. * @param string $type
  148. * @param int $longueur
  149. * @param null $connect
  150. * @return string
  151. */
  152. function lien_objet($id, $type, $longueur = 80, $connect = null) {
  153. return generer_lien_entite($id, $type, $longueur, $connect);
  154. }
  155. /**
  156. * critere {orphelins} selectionne les documents sans liens avec un objet editorial
  157. *
  158. * @param string $idb
  159. * @param object $boucles
  160. * @param object $crit
  161. */
  162. function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) {
  163. $boucle = &$boucles[$idb];
  164. $cond = $crit->cond;
  165. $not = $crit->not ? '' : 'NOT';
  166. $select = sql_get_select('DISTINCT id_document', 'spip_documents_liens as oooo');
  167. $where = "'" . $boucle->id_table . ".id_document $not IN ($select)'";
  168. if ($cond) {
  169. $_quoi = '@$Pile[0]["orphelins"]';
  170. $where = "($_quoi)?$where:''";
  171. }
  172. $boucle->where[] = $where;
  173. }
  174. /**
  175. * critere {portrait} qui selectionne
  176. * - les documents dont les dimensions sont connues
  177. * - les documents dont la hauteur est superieure a la largeur
  178. *
  179. * {!portrait} exclus ces documents
  180. *
  181. * @param string $idb
  182. * @param object $boucles
  183. * @param object $crit
  184. */
  185. function critere_DOCUMENTS_portrait_dist($idb, &$boucles, $crit) {
  186. $boucle = &$boucles[$idb];
  187. $table = $boucle->id_table;
  188. $not = ($crit->not ? 'NOT ' : '');
  189. $boucle->where[] = "'$not($table.largeur>0 AND $table.hauteur > $table.largeur)'";
  190. }
  191. /**
  192. * critere {paysage} qui selectionne
  193. * - les documents dont les dimensions sont connues
  194. * - les documents dont la hauteur est inferieure a la largeur
  195. *
  196. * {!paysage} exclus ces documents
  197. *
  198. * @param string $idb
  199. * @param object $boucles
  200. * @param object $crit
  201. */
  202. function critere_DOCUMENTS_paysage_dist($idb, &$boucles, $crit) {
  203. $boucle = &$boucles[$idb];
  204. $table = $boucle->id_table;
  205. $not = ($crit->not ? 'NOT ' : '');
  206. $boucle->where[] = "'$not($table.largeur>0 AND $table.largeur > $table.hauteur)'";
  207. }
  208. /**
  209. * critere {carre} qui selectionne
  210. * - les documents dont les dimensions sont connues
  211. * - les documents dont la hauteur est egale a la largeur
  212. *
  213. * {!carre} exclus ces documents
  214. *
  215. * @param string $idb
  216. * @param object $boucles
  217. * @param object $crit
  218. */
  219. function critere_DOCUMENTS_carre_dist($idb, &$boucles, $crit) {
  220. $boucle = &$boucles[$idb];
  221. $table = $boucle->id_table;
  222. $not = ($crit->not ? 'NOT ' : '');
  223. $boucle->where[] = "'$not($table.largeur>0 AND $table.largeur = $table.hauteur)'";
  224. }
  225. /**
  226. * Calcule la vignette d'une extension (l'image du type de fichier)
  227. *
  228. * Utile dans une boucle DOCUMENTS pour afficher une vignette du type
  229. * du document (balise `#EXTENSION`) alors que ce document a déjà une vignette
  230. * personnalisée (affichable par `#LOGO_DOCUMENT`).
  231. *
  232. * @example
  233. * `[(#EXTENSION|vignette)]` produit une balise `<img ... />`
  234. * `[(#EXTENSION|vignette{true})]` retourne le chemin de l'image
  235. *
  236. * @param string $extension
  237. * L'extension du fichier, exemple : png ou pdf
  238. * @param bool $get_chemin
  239. * false pour obtenir une balise img de l'image,
  240. * true pour obtenir seulement le chemin du fichier
  241. * @return string
  242. * Balise HTML <img...> ou chemin du fichier
  243. **/
  244. function filtre_vignette_dist($extension = 'defaut', $get_chemin = false) {
  245. static $vignette = false;
  246. static $balise_img = false;
  247. if (!$vignette) {
  248. $vignette = charger_fonction('vignette', 'inc');
  249. $balise_img = charger_filtre('balise_img');
  250. }
  251. $fichier = $vignette($extension, false);
  252. // retourne simplement le chemin du fichier
  253. if ($get_chemin) {
  254. return $fichier;
  255. }
  256. // retourne une balise <img ... />
  257. return $balise_img($fichier);
  258. }
  259. /**
  260. * Determiner les methodes upload en fonction du env de inc-upload_document
  261. *
  262. * @param string|array $env
  263. * @return array
  264. */
  265. function medias_lister_methodes_upload($env) {
  266. if (is_string($env)) {
  267. $env = unserialize($env);
  268. }
  269. $methodes = array();
  270. // méthodes d'upload disponibles
  271. $methodes = array();
  272. $methodes['upload'] = array('label_lien'=>_T('medias:bouton_download_local'),'label_bouton'=>_T('bouton_upload'));
  273. if((isset($env['mediatheque']) and $env['mediatheque'])){
  274. $methodes['mediatheque'] = array('label_lien'=>_T('medias:bouton_download_par_mediatheque'),'label_bouton'=>_T('medias:bouton_attacher_document'));
  275. }
  276. if((isset($env['proposer_ftp']) and $env['proposer_ftp'])){
  277. $methodes['ftp'] = array('label_lien'=>_T('medias:bouton_download_par_ftp'),'label_bouton'=>_T('bouton_choisir'));
  278. }
  279. $methodes['distant'] = array('label_lien'=>_T('medias:bouton_download_sur_le_web'),'label_bouton'=>_T('bouton_choisir'));
  280. // pipeline pour les méthodes d'upload
  281. $objet = isset($env['objet']) ? $env['objet'] : '';
  282. $id_objet = isset($env['id_objet']) ? $env['id_objet'] : '';
  283. $methodes = pipeline('medias_methodes_upload',
  284. array(
  285. 'args' => array('objet' => $objet, 'id_objet' => $id_objet),
  286. 'data' => $methodes
  287. )
  288. );
  289. return $methodes;
  290. }
  291. function duree_en_secondes($duree, $precis = false) {
  292. $out = "";
  293. $heures = $minutes = 0;
  294. if ($duree>3600) {
  295. $heures = intval(floor($duree/3600));
  296. $duree -= $heures * 3600;
  297. }
  298. if ($duree>60) {
  299. $minutes = intval(floor($duree/60));
  300. $duree -= $minutes * 60;
  301. }
  302. if ($heures>0 or $minutes>0) {
  303. $out = _T('date_fmt_heures_minutes', array('h' => $heures, 'm' => $minutes));
  304. if (!$heures) {
  305. $out = preg_replace(',^0[^\d]+,Uims', '', $out);
  306. }
  307. }
  308. if (!$heures or $precis) {
  309. $out .= intval($duree).'s';
  310. }
  311. return $out;
  312. }