renseigner_document.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  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. if (!defined("_ECRIRE_INC_VERSION")) return;
  12. /**
  13. * recuperer les infos distantes d'une url,
  14. * et renseigner pour une insertion en base
  15. * utilise une variable static car appellee plusieurs fois au cours du meme hit
  16. * (verification puis traitement)
  17. *
  18. * @param string $source
  19. * @return string
  20. */
  21. function renseigner_source_distante($source){
  22. static $infos = array();
  23. if (isset($infos[$source]))
  24. return $infos[$source];
  25. include_spip('inc/distant');
  26. // on passe la source dans le pipeline, le premier plugin
  27. // qui est capable de renseigner complete
  28. // fichier et mode + tous les autres champs a son gout
  29. // ex : oembed
  30. $a = pipeline('renseigner_document_distant',array('source'=>$source));
  31. // si la source est encore la, en revenir a la
  32. // methode traditionnelle : chargement de l'url puis analyse
  33. if (!isset($a['fichier']) OR !isset($a['mode'])){
  34. if (!$a = recuperer_infos_distantes($a['source'])) {
  35. return _T('medias:erreur_chemin_distant',array('nom'=>$source));
  36. }
  37. # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
  38. # $a['fichier'] est une copie locale du fichier
  39. unset($a['body']);
  40. $a['distant'] = 'oui';
  41. $a['mode'] = 'document';
  42. $a['fichier'] = set_spip_doc($source);
  43. }
  44. // stocker pour la seconde demande
  45. return $infos[$source] = $a;
  46. }
  47. /**
  48. * Renseigner les informations de taille et dimension d'un document
  49. *
  50. * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document
  51. * Utilise pour cela les fonctions du répertoire metadatas/*
  52. *
  53. * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis
  54. * comme editable dans la déclaration de la table spip_documents
  55. *
  56. * TODO Renommer cette fonction sans "_image"
  57. *
  58. * @param string $fichier
  59. * Le fichier à examiner
  60. * @param string $ext
  61. * L'extension du fichier à examiner
  62. * @return array|string $infos
  63. * Si c'est une chaine, c'est une erreur
  64. * Si c'est un tableau, l'ensemble des informations récupérées du fichier
  65. */
  66. function renseigner_taille_dimension_image($fichier,$ext){
  67. $infos = array(
  68. 'largeur'=>0,
  69. 'hauteur'=>0,
  70. 'type_image'=>'',
  71. 'taille'=>0
  72. );
  73. // Quelques infos sur le fichier
  74. if (
  75. !$fichier
  76. OR !@file_exists($fichier)
  77. OR !$infos['taille'] = @intval(filesize($fichier))) {
  78. spip_log ("Echec copie du fichier $fichier");
  79. return _T('medias:erreur_copie_fichier',array('nom'=> $fichier));
  80. }
  81. // chercher une fonction de description
  82. $meta = array();
  83. if ($metadata = charger_fonction($ext,"metadata",true)){
  84. $meta = $metadata($fichier);
  85. }
  86. else {
  87. $media = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($ext));
  88. if ($metadata = charger_fonction($media,"metadata",true)){
  89. $meta = $metadata($fichier);
  90. }
  91. }
  92. $meta = pipeline('renseigner_document',array('args'=>array('extension'=>$ext,'fichier'=>$fichier),'data' => $meta));
  93. include_spip('inc/filtres'); # pour objet_info()
  94. $editables = objet_info('document','champs_editables');
  95. foreach($meta as $m=>$v)
  96. if (isset($infos[$m]) OR in_array($m,$editables))
  97. $infos[$m] = $v;
  98. return $infos;
  99. }
  100. ?>