[SPIP] v3.2.1-->v3.2.3
[lhc/web/www.git] / www / plugins-dist / medias / medias_fonctions.php
index 97ee198..17d7f85 100644 (file)
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2013                                                *
+ *  Copyright (c) 2001-2019                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
+/**
+ * Fonctions utiles pour les squelettes et déclarations de boucle
+ * pour le compilateur
+ *
+ * @package SPIP\Medias\Fonctions
+ **/
 
-//
-// Ce fichier definit les boucles standard de SPIP
-//
+// sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
-if (!defined('_ECRIRE_INC_VERSION')) return;
+// nettoyer les zip abandonnes par l'utilisateur
+if (isset($GLOBALS['visiteur_session']['zip_to_clean'])
+       and test_espace_prive()
+       and isset($_SERVER['REQUEST_METHOD'])
+       and $_SERVER['REQUEST_METHOD'] !== 'POST'
+) {
+       $zip_to_clean = unserialize($GLOBALS['visiteur_session']['zip_to_clean']);
+       if ($zip_to_clean) {
+               foreach ($zip_to_clean as $zip) {
+                       if (@file_exists($zip)) {
+                               @unlink($zip);
+                       }
+               }
+       }
+       session_set('zip_to_clean');
+}
 
+// capturer un formulaire POST plus grand que post_max_size
+// on genere un minipres car on ne peut rien faire de mieux
+if (isset($_SERVER['REQUEST_METHOD'])
+       and $_SERVER['REQUEST_METHOD'] == 'POST'
+       and empty($_POST)
+       and strlen($_SERVER['CONTENT_TYPE']) > 0
+       and strncmp($_SERVER['CONTENT_TYPE'], 'multipart/form-data', 19) == 0
+       and $_SERVER['CONTENT_LENGTH'] > medias_inigetoctets('post_max_size')
+) {
+       include_spip('inc/minipres');
+       echo minipres(_T('medias:upload_limit', array('max' => ini_get('post_max_size'))));
+       exit;
+}
 
 /**
- * Afficher la puce de statut pour les documents
+ * Retourne la taille en octet d'une valeur de configuration php
  *
- * @param unknown_type $id_document
- * @param unknown_type $statut
- * @param unknown_type $id_rubrique
- * @param unknown_type $type
- * @param unknown_type $ajax
- * @return unknown
- */
-function medias_puce_statut_document($id_document, $statut){
-       if ($statut=='publie') {
-               $puce='puce-verte.gif';
+ * @param string $var
+ *     Clé de configuration ; valeur récupérée par `ini_get()`. Exemple `post_max_size`
+ * @return int|string
+ *     Taille en octet, sinon chaine vide.
+ **/
+function medias_inigetoctets($var) {
+       $last = '';
+       $val = trim(@ini_get($var));
+       if (is_numeric($val)) {
+               return $val;
+       }
+       // en octet si "32M"
+       if ($val != '') {
+               $last = strtolower($val[strlen($val) - 1]);
+               $val = substr($val, 0, -1);
        }
-       else if ($statut == "prepa") {
-               $puce = 'puce-blanche.gif';
+       switch ($last) { // The 'G' modifier is available since PHP 5.1.0
+               case 'g':
+                       $val *= 1024 * 1024 * 1024;
+                       break;
+               case 'm':
+                       $val *= 1024 * 1024;
+                       break;
+               case 'k':
+                       $val *= 1024;
+                       break;
        }
-       else if ($statut == "poubelle") {
-               $puce = 'puce-poubelle.gif';
+
+       return $val;
+}
+
+/**
+ * Afficher la puce de statut pour les documents
+ *
+ * @param int $id_document
+ *     Identifiant du document
+ * @param string $statut
+ *     Statut du document
+ * @return string
+ *     Code HTML de l'image de puce
+ */
+function medias_puce_statut_document($id_document, $statut) {
+       if ($statut == 'publie') {
+               $puce = 'puce-verte.gif';
+       } else {
+               if ($statut == 'prepa') {
+                       $puce = 'puce-blanche.gif';
+               } else {
+                       if ($statut == 'poubelle') {
+                               $puce = 'puce-poubelle.gif';
+                       } else {
+                               $puce = 'puce-blanche.gif';
+                       }
+               }
        }
-       else
-               $puce = 'puce-blanche.gif';
 
        return http_img_pack($puce, $statut, "class='puce'");
 }
 
-//
-// <BOUCLE(DOCUMENTS)>
-//
-// http://doc.spip.org/@boucle_DOCUMENTS_dist
+
+/**
+ * Compile la boucle `DOCUMENTS` qui retourne une liste de documents multimédia
+ *
+ * `<BOUCLE(DOCUMENTS)>`
+ *
+ * @param string $id_boucle
+ *     Identifiant de la boucle
+ * @param array $boucles
+ *     AST du squelette
+ * @return string
+ *     Code PHP compilé de la boucle
+ **/
 function boucle_DOCUMENTS($id_boucle, &$boucles) {
        $boucle = &$boucles[$id_boucle];
        $id_table = $boucle->id_table;
 
        // on ne veut pas des fichiers de taille nulle,
        // sauf s'ils sont distants (taille inconnue)
-       array_unshift($boucle->where,array("'($id_table.taille > 0 OR $id_table.distant=\\'oui\\')'"));
+       array_unshift($boucle->where, array("'($id_table.taille > 0 OR $id_table.distant=\\'oui\\')'"));
 
        /**
         * N'afficher que les modes de documents que l'on accepte
         * Utiliser le "pipeline medias_documents_visibles" pour en ajouter
         */
        if (!isset($boucle->modificateur['criteres']['mode'])
-       AND !isset($boucle->modificateur['tout'])) {
-               $modes = pipeline('medias_documents_visibles',array('image','document'));
+               and !isset($boucle->modificateur['tout'])
+       ) {
+               $modes = pipeline('medias_documents_visibles', array('image', 'document'));
                $f = sql_serveur('quote', $boucle->sql_serveur, true);
                $modes = addslashes(join(',', array_map($f, array_unique($modes))));
-               array_unshift($boucle->where,array("'IN'", "'$id_table.mode'", "'($modes)'"));
+               array_unshift($boucle->where, array("'IN'", "'$id_table.mode'", "'($modes)'"));
        }
 
        return calculer_boucle($id_boucle, $boucles);
 }
 
 
-function lien_objet($id,$type,$longueur=80,$connect=NULL){
-       include_spip('inc/liens');
-       $titre = traiter_raccourci_titre($id, $type, $connect);
-       // lorsque l'objet n'est plus declare (plugin desactive par exemple)
-       // le raccourcis n'est plus valide
-       $titre = isset($titre['titre']) ? typo($titre['titre']) : '';
-       if (!strlen($titre))
-               $titre = _T('info_sans_titre');
-       $url = generer_url_entite($id,$type);
-       return "<a href='$url' class='$type'>".couper($titre,$longueur)."</a>";
+/**
+ * Pour compat uniquement, utiliser generer_lien_entite
+ *
+ * @deprecated
+ * @uses generer_lien_entite()
+ *
+ * @param int $id
+ * @param string $type
+ * @param int $longueur
+ * @param null $connect
+ * @return string
+ */
+function lien_objet($id, $type, $longueur = 80, $connect = null) {
+       return generer_lien_entite($id, $type, $longueur, $connect);
 }
 
 /**
@@ -95,16 +180,16 @@ function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) {
 
        $boucle = &$boucles[$idb];
        $cond = $crit->cond;
-       $not = $crit->not?"":"NOT";
+       $not = $crit->not ? '' : 'NOT';
 
-       $select = sql_get_select("DISTINCT id_document","spip_documents_liens as oooo");
-       $where = "'".$boucle->id_table.".id_document $not IN ($select)'";
-       if ($cond){
+       $select = sql_get_select('DISTINCT id_document', 'spip_documents_liens as oooo');
+       $where = "'" . $boucle->id_table . ".id_document $not IN ($select)'";
+       if ($cond) {
                $_quoi = '@$Pile[0]["orphelins"]';
                $where = "($_quoi)?$where:''";
        }
 
-       $boucle->where[]= $where;
+       $boucle->where[] = $where;
 }
 
 /**
@@ -121,7 +206,7 @@ function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) {
 function critere_DOCUMENTS_portrait_dist($idb, &$boucles, $crit) {
        $boucle = &$boucles[$idb];
        $table = $boucle->id_table;
-       $not = ($crit->not?"NOT ":"");
+       $not = ($crit->not ? 'NOT ' : '');
        $boucle->where[] = "'$not($table.largeur>0 AND $table.hauteur > $table.largeur)'";
 }
 
@@ -139,7 +224,7 @@ function critere_DOCUMENTS_portrait_dist($idb, &$boucles, $crit) {
 function critere_DOCUMENTS_paysage_dist($idb, &$boucles, $crit) {
        $boucle = &$boucles[$idb];
        $table = $boucle->id_table;
-       $not = ($crit->not?"NOT ":"");
+       $not = ($crit->not ? 'NOT ' : '');
        $boucle->where[] = "'$not($table.largeur>0 AND $table.largeur > $table.hauteur)'";
 }
 
@@ -157,7 +242,109 @@ function critere_DOCUMENTS_paysage_dist($idb, &$boucles, $crit) {
 function critere_DOCUMENTS_carre_dist($idb, &$boucles, $crit) {
        $boucle = &$boucles[$idb];
        $table = $boucle->id_table;
-       $not = ($crit->not?"NOT ":"");
+       $not = ($crit->not ? 'NOT ' : '');
        $boucle->where[] = "'$not($table.largeur>0 AND $table.largeur = $table.hauteur)'";
 }
-?>
+
+
+/**
+ * Calcule la vignette d'une extension (l'image du type de fichier)
+ *
+ * Utile dans une boucle DOCUMENTS pour afficher une vignette du type
+ * du document (balise `#EXTENSION`) alors que ce document a déjà une vignette
+ * personnalisée (affichable par `#LOGO_DOCUMENT`).
+ *
+ * @example
+ *     `[(#EXTENSION|vignette)]` produit une balise `<img ... />`
+ *     `[(#EXTENSION|vignette{true})]` retourne le chemin de l'image
+ *
+ * @param string $extension
+ *     L'extension du fichier, exemple : png ou pdf
+ * @param bool $get_chemin
+ *     false pour obtenir une balise img de l'image,
+ *     true pour obtenir seulement le chemin du fichier
+ * @return string
+ *     Balise HTML <img...> ou chemin du fichier
+ **/
+function filtre_vignette_dist($extension = 'defaut', $get_chemin = false) {
+       static $vignette = false;
+       static $balise_img = false;
+
+       if (!$vignette) {
+               $vignette = charger_fonction('vignette', 'inc');
+               $balise_img = charger_filtre('balise_img');
+       }
+
+       $fichier = $vignette($extension, false);
+       // retourne simplement le chemin du fichier
+       if ($get_chemin) {
+               return $fichier;
+       }
+
+       // retourne une balise <img ... />
+       return $balise_img($fichier);
+}
+
+/**
+ * Determiner les methodes upload en fonction du env de inc-upload_document
+ *
+ * @param string|array $env
+ * @return array
+ */
+function medias_lister_methodes_upload($env) {
+       if (is_string($env)) {
+               $env = unserialize($env);
+       }
+
+       $methodes = array();
+       // méthodes d'upload disponibles
+       $methodes = array();
+       $methodes['upload'] = array('label_lien'=>_T('medias:bouton_download_local'),'label_bouton'=>_T('bouton_upload'));
+
+       if((isset($env['mediatheque']) and $env['mediatheque'])){
+               $methodes['mediatheque'] = array('label_lien'=>_T('medias:bouton_download_par_mediatheque'),'label_bouton'=>_T('medias:bouton_attacher_document'));
+       }
+       
+       if((isset($env['proposer_ftp']) and $env['proposer_ftp'])){
+               $methodes['ftp'] = array('label_lien'=>_T('medias:bouton_download_par_ftp'),'label_bouton'=>_T('bouton_choisir'));
+       }
+       $methodes['distant'] = array('label_lien'=>_T('medias:bouton_download_sur_le_web'),'label_bouton'=>_T('bouton_choisir'));
+
+       // pipeline pour les méthodes d'upload
+       $objet = isset($env['objet']) ? $env['objet'] : '';
+       $id_objet = isset($env['id_objet']) ? $env['id_objet'] : '';
+
+       $methodes = pipeline('medias_methodes_upload',
+               array(
+                       'args' => array('objet' => $objet, 'id_objet' => $id_objet),
+                       'data' => $methodes
+               )
+       );
+
+       return $methodes;
+}
+
+function duree_en_secondes($duree, $precis = false) {
+       $out = "";
+       $heures = $minutes = 0;
+       if ($duree>3600) {
+               $heures = intval(floor($duree/3600));
+               $duree -= $heures * 3600;
+       }
+       if ($duree>60) {
+               $minutes = intval(floor($duree/60));
+               $duree -= $minutes * 60;
+       }
+
+       if ($heures>0 or $minutes>0) {
+               $out = _T('date_fmt_heures_minutes', array('h' => $heures, 'm' => $minutes));
+               if (!$heures) {
+                       $out = preg_replace(',^0[^\d]+,Uims', '', $out);
+               }
+       }
+
+       if (!$heures or $precis) {
+               $out .= intval($duree).'s';
+       }
+       return $out;
+}
\ No newline at end of file