/class.xfiledef.inc
PHP | 1560 lines | 1383 code | 74 blank | 103 comment | 291 complexity | b6c21925187ad431547e037c84508d23 MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
Large files files are truncated, but you can click here to view the full file
- <?php
- /// Gestion d'un champ fichier, y compris images et videos
- class XFileDef extends XFieldDef {
- public $maxlength='';
- public $usealt=true;
- public $accept='.*';
- public $secured=false;
- public $crypt=false;
- public $sourcemodule=NULL;
- public $nocopydup=false;
- public $image_crop_ration='';
- public $image_geometry='640x480%3E';
- public $image_max_geometry=null;
- public $video_geometry='320x240%3E';
- public $video_bitrate='512';
- public $audio_geometry='300x30';
- public $audio_bitrate='128';
- public $autoplay=false;
- public $usemimehtml=false;
- public $viewlink=true;
- public $gzipped=false;
- public $indexable=true;
- public $auto_write_meta=false;
- static $html5_video_format = array(
- 'webm' => array('ffmpeg_opts' => FFMPEG_WEBM_OPTS),
- 'ogg' => array('ffmpeg_opts' => FFMPEG_OGG_OPTS),
- 'mp4' => array('ffmpeg_opts' => FFMPEG_MP4_OPTS),
- );
- function __construct($obj=NULL) {
- parent::__construct($obj);
- $this->thumb_geometry = TZR_THUMB_SIZE.'x'.TZR_THUMB_SIZE;
- $this->multivalued=false;
- if(empty($this->image_max_geometry) && defined('XFILEDEF_IMAGE_MAX_GEOMETRY')) $this->image_max_geometry=XFILEDEF_IMAGE_MAX_GEOMETRY;
- }
- /// Retourne l'extention d'un type mime
- static function mime2extension($mime) {
- $mimeClasse=XMimeTypes::getInstance();
- return $mimeClasse->get_extension($mime);
- }
- /// Retourne vrai si le type mime représente une image
- static public function isImage($mime){
- $mimeClasse=XMimeTypes::getInstance();
- return $mimeClasse->isImage($mime);
- }
- /// Retourne vrai si le type mime représente une vidéo
- static public function isVideo($mime){
- $mimeClasse=XMimeTypes::getInstance();
- return $mimeClasse->isVideo($mime);
- }
- /// Retourne vrai si le type mime représente un fichier audio
- static public function isAudio($mime){
- $mimeClasse = XMimeTypes::getInstance();
- return $mimeClasse->isAudio($mime);
- }
- /**
- * Function isEmpty
- * @return true si le champ n'est pas remplit
- */
- public function isEmpty($r) {
- if (property_exists($r, 'filename'))
- return empty($r->filename) && empty($r->externalUrl);
- else return true;
- }
- static function mkfilename($str, $mime) {
- $s=preg_replace('@([^\/0-9a-zA-Z_-]+)@','',$str);
- $mimeClasse = XMimeTypes::getInstance();
- $ext=$mimeClasse->get_extension($mime);
- return $s.'.'.$ext;
- }
- public function hasExternals() {
- return true;
- }
- /// Retourne le nom du fichier
- public function externals($value) {
- list($file,$mime,$originalname,$title)=explode(';',$value);
- $files=$this->filename($file,false,true);
- if(!empty($files)) return array($files);
- else return NULL;
- }
- /// Copie le fichier d'une fiche vers une autre fiche
- public function copyExternalsTo($value,$oidsrc,$oiddst,$upd=NULL) {
- if(empty($value) || empty($oiddst)) return NULL;
- if($value==TZR_UNCHANGED) return $value;
- @list($file,$mime,$originalname,$title) = explode(';',$value);
- if(strpos($file,'.')) list($lang)=explode('.',$file);
- $files=$this->filename($file,false,true);
- if(!empty($files) && file_exists($GLOBALS['DATA_DIR'].$files)) {
- list($table,$idd) = explode(':',$oiddst);
- if(!empty($lang)) $idd=$lang.'.'.$idd;
- // 1er appel : creation de l'arbo / 2eme appel : recupereation du nom du fichier
- $nfiles=$this->filename($idd,true,false,$upd);
- $nfiles=$this->filename($idd,false,false,$upd);
- copy($GLOBALS['DATA_DIR'].$files,$GLOBALS['DATA_DIR'].$nfiles);
- return $idd.';'.$mime.';'.$originalname.';'.$title;
- }else{
- return TZR_UNCHANGED;
- }
- }
- function initOptions() {
- parent::initOptions();
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','xfileviewlink'), 'viewlink','boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','usemimehtml'), 'usemimehtml','boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','maxlength'), 'maxlength', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','usealt'), 'usealt', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','accept'), 'accept', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','browsemods'), 'browsemods', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','sourcemodule'), 'sourcemodule', 'module');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','secured'), 'secured', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','crypt'), 'crypt', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','image_crop_ratio'), 'image_crop_ratio', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','image_geometry'), 'image_geometry', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','image_max_geometry'), 'image_max_geometry', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','video_geometry'), 'video_geometry', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','video_bitrate'), 'video_bitrate', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','audio_bitrate'), 'audio_bitrate', 'text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','autoplay'), 'autoplay', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','gzipped'), 'gzipped', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','allow_externalfile'), 'allow_externalfile', 'boolean');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef','xfiledef_autowritemeta'),'auto_write_meta','boolean');
- $querygroup=XLabels::getSysLabel('general','query','text');
- $this->_options->setOpt(XLabels::getSysLabel('xfielddef.indexable'), 'indexable', 'boolean', NULL, true, $querygroup);
- }
- // Verification que les repertoires qui contiennent les fichiers n'existent pas, sinon on les cree
- function _checkDir() {
- global $DATA_DIR;
- umask(0000);
- $root=$DATA_DIR.$this->table.'/'.$this->field;
- if(!is_dir($root)) {
- if(!is_dir($DATA_DIR.$this->table)) {
- @mkdir($DATA_DIR.$this->table,0777);
- }
- if(!is_dir($DATA_DIR.$this->table.'/'.$this->field)) {
- @mkdir($DATA_DIR.$this->table.'/'.$this->field,0777);
- }
- }
- }
- /// Suppression du champ, i.e. suppression du repertoire et des donnees incluses dans ce repertoire
- function delfield() {
- global $DATA_DIR;
- XDir::unlink($DATA_DIR.$this->table.'/'.$this->field);
- }
- /// Ecriture dans un fichier excel
- function writeXLS(&$xl,$i,$j,&$value,$format=0,&$ss=NULL) {
- if(!empty($value->url)){
- $lab=$value->text;
- if(empty($lab)) $lab='Link';
- convert_charset($lab,TZR_INTERNAL_CHARSET,'UTF-8');
- $xl->setCellValueByColumnAndRow($j,$i,$lab);
- $xl->getCellByColumnAndRow($j,$i)->getHyperlink()->setUrl($GLOBALS['HOME_ROOT_URL'].$value->url);
- if(is_array($format)) $xl->getStyleByColumnAndRow($j,$i)->applyFromArray($format);
- }
- }
- /// Ecriture dans un csv
- function writeCSV(&$o,$textsep){
- return $textsep.$o->originalname.$textsep;
- }
- /// Affiche dans le mode parcourir
- function my_browse(&$value,&$options) {
- $r=&$this->my_display($value,$options);
- if($this->usemimehtml && !empty($options['admin'])) {
- $r->html=$r->html_preview;
- }
- return $r;
- }
- /// Retourne la taille du fichier
- function getFileSize($r){
- if(empty($r->filesize)) $r->filesize=filesize($r->filename);
- return $r->filesize;
- }
- /// Affichage du champ
- function my_display($value,&$options) {
- global $DATA_DIR;
- $langdata = XShell::getLangData();
- $resizer=TZR_RESIZER;
- $r=$this->_newXFieldVal($options, true);
- $r->type = NULL;
- $r->resizer = NULL;
- $r->mime = NULL;
- $r->isImage = false;
- $r->isVideo = false;
- if($value=='' || $value==TZR_UNCHANGED)
- return $r;
- @list($file,$mime,$originalname,$title) = explode(';',$value);
- if (strpos($file, ':') !== false)
- return $this->displayExternal($r, $file, $value, $options);
- if(empty($originalname)) {
- $originalname = 'download';
- $mimeClasse = XMimeTypes::getInstance();
- $originalname .= '.'.$mimeClasse->get_extension($mime);
- }
- $files=$this->filename($file,false,false,@$options['_archive']);
- if(!$files) return $r;
- $filename=$DATA_DIR.$files;
- $originalname_corrected=preg_replace('@([^\._a-zA-Z0-9-]+)@','_',$originalname);
- $downloader=$this->getDownloader($files, $mime, $originalname_corrected, $title, @$options['fmoid']);
- $r->filename=$filename;
- $r->shortfilename=$files;
- $r->mime=$mime;
- $r->title=$title;
- $r->originalname=$originalname;
- $r->raw=$value;
- $r->url=$downloader[0];
- $r->text=$r->title?$r->title:$r->originalname;
- $r->mimepicto=XLabels::getSysLabel('mime',$mime, 'both', 'mime', 'unknown/unknown');
- $r->html_default='<a bt-xpath="'.TZR_AJAX8.'?class=xfiledef&function=xfiledef_getfilesize&file='.$files.'&_='.XShell::uniqid().'" class="tzr-hottip-c tzr-file" href="'.$r->url.'" target="_self">'.$r->mimepicto.(empty($title)?$originalname:$title).'</a>';
- $r->html_preview=$r->html_default;
- $r->html=$r->html_default;
- if(XFileDef::isVideo($mime)) $this->displayVideo($r,$value,$options);
- elseif(XFileDef::isImage($mime)) $this->displayImage($r,$value,$options);
- elseif($mime=='application/pdf') $this->displayPDF($r,$value,$options);
- elseif(XFileDef::isAudio($mime)) $this->displayAudio($r,$value,$options);
- return $r;
- }
- /// Affichage d'un fichier externe
- function displayExternal(&$r, $file, $value, $options) {
- $r->file = $file;
- $r->raw = $value;
- list($r->type, $r->id) = explode(':', $file, 2);
- $r->isExternal = true;
- $displayFunction = 'display'.$r->type;
- if (method_exists($this, $displayFunction))
- return $this->$displayFunction($r, $options);
- $r->externalUrl = $r->id;
- return $r;
- }
-
- /* Image */
- /// Complete l'objet d'affichage dans le cas d'une image
- function displayImage(&$r,&$value,$options){
- $resizer=$this->getResizer($r->shortfilename,$r->mime,$r->originalname);
- if(!empty($resizer) && !empty($resizer['resizer'])) {
- $r->resizer=$resizer['resizer'];
- $r->weresizer=$resizer['weresizer'];
- }
- $r->isImage=true;
- if($this->usemimehtml){
- $r->html = '<img class="tzr-image" src="'.$r->resizer.'&geometry='.$this->image_geometry.'" alt="'.$r->title.'" title="'.$r->title.'">';
- if ($this->viewlink) $r->html.='<br>'.$r->html_default;
- }
- $r->html_preview = '<img class="tzr-image" src="'.$r->resizer.'&geometry='.TZR_THUMB_SIZE.'x'.TZR_THUMB_SIZE.'%3E" alt="'.$r->title.'" title="'.$r->title.'">';
- if ($this->viewlink) $r->html_preview.='<br>'.$r->html_default;
- }
-
- /// Retourne le code html du preview d'une image
- function html_previewImage($r, $options=array()) {
- $options = array_merge(array('title' => $r->title, 'geometry' => $this->thumb_geometry), $options);
- return $this->htmlImage($r, $options);
- }
-
- /// Retourne le code html d'une image
- function htmlImage($r, $options=array()) {
- $options = array_merge(array('title' => $r->title, 'geometry' => $this->image_geometry), $options);
- $geometry = $options['geometry'];
- $this->getImageSize($r);
- list($w, $h) = explode('x', str_replace('>', '', $geometry));
- $w = (integer)$w;
- $h = (integer)$h;
- $ratio = $r->fullheight / $r->fullwidth;
- if (isset($options['gravity'])) { // on peux croper
- $geometry = (integer)($ratio * $r->fullwidth).'x'.(integer)($ratio * $r->fullheight);
- $crop = '&crop='.$w.'x'.$h.'&gravity='.$options['gravity'];
- } else {
- if ($w < $r->fullwidth || $h < $r->fullheight) {
- if ($ratio < 1)
- $h = (integer)($w*$ratio);
- else
- $w = (integer)($h/$ratio);
- } else {
- $w = $r->fullwidth;
- $h = $r->fullheight;
- }
- $geometry = $w.'x'.$h;
- }
- return '<img class="tzr-image" src="'.$r->resizer.'&geometry='.$geometry.@$crop.'" '.(isset($options['title']) ? ' alt="'.@$options['title'].'" title="'.@$options['title'].'"':'').(isset($w)?' width="'.$w.'" height="'.$h.'"':'').'>';
- }
- /// Retourne le code html
- function completeHTML($r, $options=array(), $alt){
- if (empty($r) || $r->raw == '')
- return '';
- if (is_string($options)) { // from template
- parse_str($options, $options);
- }
- if (count($options)==1 && current($options) == '') // compatibilité
- $options = array('geometry' => key($options));
- if ($r->isExternal) {
- $htmlFunction = 'html'.$r->type;
- if (method_exists($this, $htmlFunction))
- $html = $this->$htmlFunction($r, $options);
- }
- elseif ($r->isImage || $r->isPDF)
- $html = $this->htmlImage($r, $options);
- elseif ($r->isVideo)
- $html = $this->htmlVideo($r, $options);
- elseif ($r->isAudio)
- $html = $this->htmlAudio($r, $options, $alt);
- else
- $html = $r->html_default;
- return $html;
- }
-
- /// Retourne l'url des reiszer
- protected function getResizer($filename,$mime="null/null",$originalname=NULL){
- $mimedst=$mime;
- if($mime=='image/x-png') $mime=$mimedst='image/png';
- if(($mime!='image/gif') && ($mime!='image/png')) $mimedst='image/jpeg';
- $mimedst=rawurlencode($mimedst);
- $fmime = '';
- $mimeClasse=XMimeTypes::getInstance();
- if($mime=='application/pdf'){
- $fmime=$mime;
- }elseif($mimeClasse->isImage($mime)) {
- $fmime=$mimedst;
- }
- if(!empty($fmime)){
- $str = '?filename='.$filename.'&mime='.$fmime.'&';
- if($originalname) $str .= '&originalname='.rawurlencode($originalname);
- $resizer=TZR_RESIZER.$str;
- $weresizer=TZR_WERESIZER.$str;
- }else{
- $resizer=$weresizer='';
- }
- return array('resizer'=>$resizer,'weresizer'=>$weresizer);
- }
-
- /// Retourne la taille en px d'une image
- function getImageSize($r,$dim=NULL){
- if(!isset($r->fullwidth)){
- if($r->isImage) $t=getimagesize($r->filename);
- elseif($r->isVideo) $t=getimagesize($r->filename.'-fullsizeimage');
- elseif($r->isPDF) {
- if (!file_exists($r->filename.'-fullsizeimage'))
- exec(TZR_MOGRIFY_RESIZER . ' ' . $r->filename . '[0] jpeg:' . $r->filename . '-fullsizeimage');
- $t=getimagesize($r->filename.'-fullsizeimage');
- }
- else $t=array(0,0);
- $r->fullwidth=$t[0];
- $r->fullheight=$t[1];
- }
- if($dim) return $r->$dim;
- }
-
- /// Recupere la largeur ou la hauteur finale d'une image en fonction d'une géométrie passée au resizer
- function getImageResize($r,$geometry,$dim){
- if(empty($r->_cache['size'][$geometry])){
- $this->getImageSize($r);
- $t=array($r->fullwidth,$r->fullheight);
- $oratio=$t[0]/$t[1];
- $size=explode('x',$geometry);
- if(!is_numeric($size[0])) $size[0]=0;
- if(empty($size[1]) || !is_numeric($size[1])) $size[1]=0;
- $ratio=$size[0]/$size[1];
- if(!empty($size[0]) && ($oratio>$ratio || empty($size[1]))){
- $w=$size[0];
- $h=round($t[1]*$size[0]/$t[0]);
- }else{
- $w=round($t[0]*$size[1]/$t[1]);
- $h=$size[1];
- }
- $r->_cache['size'][$geometry]=array('width'=>$w,'height'=>$h);
- }
- return $r->_cache['size'][$geometry][$dim];
- }
- /// Retourne une propriété iptc ou l'objet iptc de l'image
- function getIPTC($r,$prop=NULL){
- if($r->mime=='image/jpeg'){
- if(empty($r->meta_data)) $r->meta_data=XFileDef::loadMeta($r->filename);
- if(!$prop) return $r->meta_data;
- else return $r->meta_data->getIPTCProperty($prop);
- }
- return NULL;
- }
- /// Retourne une propriété exif ou l'objet exif de l'image
- function getEXIF($r,$prop=NULL){
- if($r->mime=='image/jpeg'){
- if(empty($r->exif_data)) $r->exif_data=exif_read_data($r->filename);
- if(!$prop) return $r->exif_data;
- else return $r->exif_data[$prop];
- }
- return NULL;
- }
- /// Retourne une propriété XMP ou l'objet XMP de l'image
- function getXMP($r,$prop=NULL){
- if($r->mime=='image/jpeg'){
- if(empty($r->meta_data)) $r->meta_data=XFileDef::loadMeta($r->filename);
- if(!$prop) return $r->meta_data;
- else return $r->meta_data->getXMPProperty($prop,array('Alt'=>array('lang'=>array(XShell::getLangData(),'x-default'))));
- }
- return NULL;
- }
- /// Charge l'objet meta du fichier
- static function loadMeta($file){
- return new MetaAnalyser($file);
- }
- /// Redimensione une image
- function resizeImage($file,$geo=null){
- if(!$geo) return false;
- // Verifie si l'image est plus grande qua la taille max ou pas
- $s=getimagesize($file);
- list($w,$h)=explode('x',$geo);
- if(!is_numeric($w)) $w=99999;
- if(empty($h) || !is_numeric($h)) $h=99999;
- if($s[0]<$w && $s[1]<$h) return false;
- // Redimensionne l'image
- $geo=rawurldecode($geo);
- exec(TZR_MOGRIFY_RESIZER.' -resize "'.$geo.'" '.$file.' '.$file);
- return true;
- }
- /// Applique rotate et flip à un fichier selon son orientation exif
- function rotateAndFlip($filename,$mime){
- $r=(object)array('filename'=>$filename,'mime'=>$mime);
- $o=$this->getExif($r,'Orientation');
- if(!empty($o) && $o!=1){
- switch ($o){
- case 2:
- $opt='-flop';
- break;
- case 3:
- $opt='-rotate 180';
- break;
- case 4:
- $opt='-flip';
- break;
- case 5:
- $opt='-flip -rotate "90"';
- break;
- case 6:
- $opt='-rotate "90"';
- break;
- case 7:
- $opt='-flop -rotate "90"';
- break;
- case 8:
- $opt='-rotate "-90"';
- break;
- }
- exec(TZR_MOGRIFY_RESIZER.' '.$opt.' '.$filename.' '.$filename);
- }
- }
- /* Video */
- /// Complete l'objet d'affichage dans le cas d'une video
- function displayVideo(&$r,&$value,&$options){
- $r->isVideo=true;
- $r->resizer=TZR_VIDEOCONVERT.'?filename='.$r->shortfilename;
- $r->preview=TZR_VIDEOCONVERT.'?preview=true&filename='.$r->shortfilename;
- if ($this->usemimehtml) {
- $r->html_preview = $this->html_previewVideo($r, $options);
- $r->html = $this->htmlVideo($r, $options);
- if ($this->viewlink) {
- $r->html .= '<br>'.$r->html_default;
- $r->html_preview .= '<br>'.$r->html_default;
- }
- } else
- $r->html = $r->html_preview;
- }
- /// Code html du preview d'une vidéo
- function html_previewVideo($r, $options=array()) {
- $options = array_merge(array('title' => $r->title, 'geometry' => $this->thumb_geometry), $options);
- $geometry = XFileDef::videoGetGeometry($r->filename, $options['geometry']);
- list($width, $height) = explode('x', $geometry);
- return '<img class="tzr-image" src="'.$r->preview.'&geometry='.$geometry.'" alt="'.$options['title'].'" title="'.$options['title'].'" width="'.$width.'" height="'.$height.'">';
- }
- /// Code html de l'affichage d'une vidéo
- function htmlVideo(&$r, $options=array(1=>1)) {
- global $DATA_URL;
- $options = array_merge(array('title' => $r->title, 'geometry' => $this->video_geometry, 'video_bitrate' => $this->video_bitrate, 'autoplay' => $this->autoplay, 'fullscreen' => 1), $options);
- $geometry = XFileDef::videoGetGeometry($r->filename, $options['geometry']);
- list($width, $height) = explode('x', $geometry);
- $r->video_bitrate = $options['video_bitrate'];
- if ($this->videoReady($r, $geometry, true, $options['video_bitrate'])) {
- if (defined('HTML5MEDIA')) {
- $html = '
- <div class="tzr-video-div">
- <video id="'.$r->varid.'" class="tzr-video" '.($options['autoplay'] ? ' autoplay="autoplay"' : '').' width="'.$width.'" height="'.$height.'" controls poster="'.$r->preview.'&geometry='.$geometry.'" preload="none">';
- foreach (XFileDef::$html5_video_format as $format => $opts) {
- $html .= '
- <source src="'.$r->resizer.'&geometry='.$geometry.'&bitrate='.$options['video_bitrate'].'&format='.$format.'&type=.'.$format.'" type="video/'.$format.'"/>';
- }
- $html .= '
- </video>
- <script type="text/javascript">
- jQuery("#'.$r->varid.'").mediaelementplayer({pluginPath: "'.TZR_SHARE_URL.'js/jmediaelement/"});
- </script>
- </div>';
- } else {
- $html = '<div style="width='.$width.'px;height:'.$height.'px"><div id="'.$r->varid.'"></div></div><script type="text/javascript">swfobject.embedSWF("'.TZR_SHARE_URL.'flash/player_flv_maxi.swf","'.$r->varid.'","'.$width.'","'.$height.'","8","",{flv:"'.urlencode($r->resizer.'&geometry='.$geometry.'&bitrate='.$options['video_bitrate']).'",startimage:"'.urlencode($r->preview.'&geometry='.$geometry).'",autoplay:'.($options['autoplay']?'1':'0').',showfullscreen:'.($options['fullscreen']?'1':'0').',margin:0,showstop:1,showvolume:1,showtime:1,ondoubleclick:"fullscreen"},{allowFullScreen:true, wmode:"transparent"});</script>';
- }
- }
- else {
- $html = '<img src="'.$r->preview.'&geometry='.$geometry.'" alt="'.$title.'" title="'.$title.'" width="'.$width.'" height="'.$height.'">';
- }
- return $html;
- }
- /// Determine si le fichier est directement disponible dans le format.
- /// Si 'force' a true et fichier non disponible, lance la tache de conversion.
- function videoReady($r,$geometry,$forceConvert=true) {
- if(!XFileDef::isVideo($r->mime))
- return false;
- $geometry=XFileDef::videoGetGeometry($r->filename,$geometry);
- $ready = true;
- $ffmpeg = '';
- if (defined('HTML5MEDIA')) { // html5 video tag
- foreach (XFileDef::$html5_video_format as $format => $opts) {
- $hash = md5($geometry.$r->video_bitrate.'video/'.$format);
- $filename_cache = $r->filename.'-'.$hash.'-cache';
- if (!file_exists($filename_cache) || (filemtime($filename)>filemtime($filename_cache))) {
- $ready = false;
- if ($forceConvert) {
- $ffmpeg .= FFMPEG." -y -i {$r->filename} {$opts['ffmpeg_opts']} -vb {$r->video_bitrate}k -s $geometry $filename_cache ;\n";
- }
- }
- }
- }
- else {
- $hash = md5($geometry.$r->video_bitrate.'video/x-flv');
- $filename_cache=$r->filename.'-'.$hash.'-cache';
- if (!file_exists($filename_cache) || (filemtime($filename)>filemtime($filename_cache))) {
- $ready = false;
- if ($forceConvert) {
- $ffmpeg .= FFMPEG." -y -i {$r->filename} -ab 64k -ar 22050 -f flv -vb {$r->video_bitrate}k -s $geometry $filename_cache ";
- }
- }
- }
- if ($ffmpeg) {
- $s=new XModScheduler(array('tplentry'=>TZR_RETURN_DATA));
- $s->createIdleShellJob(md5($ffmpeg),'Video encoding',$ffmpeg,'');
- }
- return $ready;
- }
- /// Affichage d'une video youtube
- function displayYoutube(&$r, $value, $options) {
- require_once 'Zend/Loader.php'; // the Zend dir must be in your include_path
- Zend_Loader::loadClass('Zend_Gdata_YouTube');
- $r->videoid = $r->id;
- $r->videourl = 'http://www.youtube.com/watch?v='.$r->videoid;
- $r->isVideo = true;
- $r->videoReady = true;
- $r->resizer = '';
- $yt = new Zend_Gdata_YouTube();
- $yt->setMajorProtocolVersion(2);
- try {
- $videoEntry = $yt->getVideoEntry($r->videoid);
- $r->externalUrl = $videoEntry->getVideoWatchPageUrl();
- $r->embedUrl = 'http://www.youtube.com/embed/' . $r->videoid;
- $thumbnails = $videoEntry->getVideoThumbnails();
- $r->flashplayer = $videoEntry->getFlashPlayerUrl();
- $r->preview = $thumbnails[0]; /// TODO: choose best size
- $r->title = $videoEntry->getVideoTitle();
- $r->text = $r->title;
- $r->error = false;
- } catch(Zend_Gdata_App_HttpException $e) {
- $r->error = true;
- XLogs::notice('XFileDef::displayYoutube', "Error : " . $e->getMessage());
- }
- $r->fullwidth = 1600;
- $r->fullheight = 900;
- $r->html_preview = $this->html_previewYoutube($r, $options);
- if ($this->usemimehtml)
- $r->html = $this->htmlYoutube($r, $options);
- else
- $r->html = $r->html_preview;
- return $r;
- }
- /// html du preview d'une video youtube
- function html_previewYoutube($r, $options=array()) {
- if ($r->error)
- return '';
- if (isset($options['geometry']))
- list($width, $height) = explode('x', str_replace('>', '', $options['geometry']));
- else
- $width = $height = TZR_THUMB_SIZE;
- $margin = (int) -($width * $r->preview['height']/$r->preview['width'] - $height) /2;
- return '<div style="width:'.$width.'px;height:'.$height.'px;overflow:hidden;display:inline"><img src="'.$r->preview['url'].'" alt="'.$r->title.'" width="'.$width.'" class="tzr-externalfile" rel="'.$r->file.'"'.($margin<0?'style="margin-top:'.$margin.'px"':'').'></div>';
- }
- /// html d'une video youtube
- function htmlYoutube($r, $options=array()) {
- if ($r->error)
- return '';
- $options = array_merge(array('autoplay' => $this->autoplay, 'geometry' => $this->video_geometry), $options);
- list($width, $height) = explode('x', str_replace('>', '', rawurldecode($options['geometry'])));
- return '<iframe id="'.$r->varid.'" width="'.$width.'" height="'.$height.'" style="width:'.$width.'px;height:'.$height.'px" src="'.$r->embedUrl.'?enablejsapi=1&origin='.$GLOBALS['TZR_SESSION_MANAGER']::makeDomainName().'&wmode=transparent'.($options['autoplay']?'&autoplay=1':'').'"></iframe>';
- }
- /// Affichage d'une video Daily Motion
- function displayDailyMotion(&$r, $file, $value, $options) {
- $videoid = substr($file, 12);
- $r->videoid = $r->id;
- $r->videourl = 'http://www.dailymotion.com/video/'.$r->videoid;
- $r->isVideo = true;
- $r->videoReady = true;
- $r->resizer = '';
- if (!$videoEntry = file_get_contents('https://api.dailymotion.com/video/'.$r->videoid.'?fields=allow_embed,url,embed_url,thumbnail_medium_url,title')) {
- XLogs::notice('XFileDef::displayDailyMotion', "Error : cannot retreive video information ");
- $r->error = true;
- return $r;
- }
- $videoEntry = json_decode($videoEntry);
- if ($videoEntry->error) {
- XLogs::notice('XFileDef::displayDailyMotion', "Error : " . $videoEntry->error->message);
- $r->error = true;
- return $r;
- }
- if (!$videoEntry->allow_embed) {
- XLogs::notice('XFileDef::displayDailyMotion', "Error : {$r->videoid} embed not allowed");
- return $r;
- }
- $r->preview = array(
- 'url' => $videoEntry->thumbnail_medium_url,
- 'width' => 160,
- 'height' => 120
- );
- $r->title = $videoEntry->title;
- $r->externalUrl = $videoEntry->url;
- $r->embedUrl = $videoEntry->embed_url;
- $r->html_preview = $this->html_previewDailyMotion($r, $options);
- if ($this->usemimehtml)
- $r->html = $this->htmlDailyMotion($r, $options);
- else
- $r->html = $r->html_preview;
- return $r;
- }
- /// html du preview d'une video Daily Motion
- function html_previewDailyMotion($r, $options=array()) {
- return $this->html_previewYoutube($r, $options=array());
- }
- /// html d'une video Daily Motion
- function htmlDailyMotion($r, $options=array()) {
- return $this->htmlYoutube($r, $options=array());
- }
- /// Gestion de la geometrie d'une video
- static function videoGetGeometry($filename,$geometry){
- if(strpos($filename,$GLOBALS['DATA_DIR'])===false) $filename=$GLOBALS['DATA_DIR'].$filename;
- $geometry=rawurldecode($geometry);
- if(substr($geometry,-1)=='>')
- $geometry=substr($geometry,0,-1);
- $filefullsizeimage=$filename.'-fullsizeimage';
- if(!($t=@getimagesize($filefullsizeimage))){
- exec(FFMPEG.' -y -i "'.$filename.'" -f image2 -vcodec mjpeg -vframes 1 -an "'.$filefullsizeimage.'"');
- $t=@getimagesize($filefullsizeimage);
- }
- $oratio=$t[0]/$t[1];
- $size=explode('x',$geometry);
- $ratio=$size[0]/$size[1];
- if (!$size[0] || !$size[1])
- XLogs::critical('videoGetGeometry geometry imcomplete definition: '.$size[0].'x'.$size[1], '', true);
- if($oratio>$ratio){
- $w=$size[0];
- $h=round($t[1]*$size[0]/$t[0]);
- }else{
- $w=round($t[0]*$size[1]/$t[1]);
- $h=$size[1];
- }
- if($w%2) $w--;
- if($h%2) $h--;
- $geometry=$w.'x'.$h;
- return $geometry;
- }
- /* Audio */
- /// Complete l'objet d'affichage dans le cas d'un fichier audio
- function displayAudio(&$r,&$value,&$options){
- global $DATA_URL;
- $r->isAudio=true;
- $r->audio_bitrate = $this->audio_bitrate;
- $r->prehear = TZR_AUDIOCONVERT.'?prehear=true&filename='.$r->shortfilename.'&type=.mp3';
- $r->fullaudio = TZR_AUDIOCONVERT.'?filename='.$r->shortfilename.'&type=.mp3';
- if (defined('HTML5MEDIA')) {
- $r->prehear_ogg = TZR_AUDIOCONVERT.'?mime=audio/ogg&prehear=true&filename='.$r->shortfilename.'&type=.ogg';
- $r->fullaudio_ogg = TZR_AUDIOCONVERT.'?mime=audio/ogg&filename='.$r->shortfilename.'&type=.ogg';
- }
- if ($this->usemimehtml) {
- $r->html_preview = $this->html_previewAudio($r, $options);
- $r->html = $this->htmlAudio($r, $options);
- if ($this->viewlink) {
- $r->html .= '<br>'.$r->html_default;
- $r->html_preview .= '<br>'.$r->html_default;
- }
- } else
- $r->html = $r->html_preview;
- return $r;
- }
- /// html preview audio, $alt est un media alternatif (image)
- function html_previewAudio($r, $options=array(), $alt) {
- $options = array_merge(array('title' => $r->title, 'geometry' => $this->thumb_geometry, 'img' => TZR_SHARE_URL.'ico/mime/big-mp3.gif'), $options);
- if ($alt && is_object($alt) && $alt->raw)
- return $this->html_previewImage($alt, $options);
- $html = '<img src="'.$options['img'].'" alt="'.$r->title.'">';
- return $html;
- }
- /// html audio, $alt est un media alternatif (image)
- function htmlAudio(&$r, $options=array(), $alt) {
- $options = array_merge(array('audio_bitrate' => $this->audio_bitrate, 'audio_geometry' => $this->audio_geometry, 'geometry' => $this->geometry, 'autoplay' => $this->autoplay), $options);
- list($width, $height) = explode('x', str_replace('>', '', $options['audio_geometry']));
- list($altwidth, $altheight) = explode('x', str_replace('>', '', $options['geometry']));
- if ($options['audio_bitrate'] != $this->audio_bitrate) {
- $r->audio_bitrate = $options['audio_bitrate'];
- $this->displayAudio($r);
- }
- if ($alt && is_object($alt) && $alt->raw) {
- $options['geometry'] = $altwidth.'x'.($altheight-$height);
- $img = '<div class="tzr-audio-alt">' . $this->htmlImage($alt, $options) . '</div>';
- }
- if (defined('HTML5MEDIA')) {
- if ($this->audioReady($r, true))
- $audio = '
- <audio id="'.$r->varid.'" class="tzr-audio" '.($options['autoplay'] ? ' autoplay="autoplay"' : '').' controls="controls" height="'.$height.'" width="'.$width.'" style="height:'.$height.'px;width:'.$width.'px" preload="none">
- <source src="'.$r->fullaudio_ogg.'" type="audio/ogg" />
- <source src="'.$r->fullaudio.'" type="audio/mp3" />
- </audio>';
- else
- $audio = '
- <audio id="'.$r->varid.'" class="tzr-audio" '.($options['autoplay'] ? ' autoplay="autoplay"' : '').' controls="controls" height="'.$height.'" width="'.$width.'" style="height:'.$height.'px;width:'.$width.'px">
- <source src="'.$r->prehear_ogg.'" type="audio/ogg" />
- <source src="'.$r->prehear.'" type="audio/mp3" />
- </audio>';
- $html = '
- <div class="tzr-audio-div">
- '.@$img.$audio.'
- <script type="text/javascript">
- jQuery("#'.$r->varid.'").mediaelementplayer({pluginPath: "'.TZR_SHARE_URL.'js/jmediaelement/build/"});
- </script>
- </div>';
- }
- else
- $html = @$img.'<div style="height:27px;width:'.$width.'px;"><div id="'.$r->varid.'"></div></div><script type="text/javascript">swfobject.embedSWF("'.TZR_SHARE_URL.'flash/mpw_player.swf","'.$r->varid.'","'.$width.'","27","8","",{mp3:"'.urlencode(($this->audioReady($r,true)?$r->fullaudio:$r->prehear.'&bitrate='.$r->audio_bitrate)).'",autoplay:'.($options['autoplay']?'1':'0').'},{bgcolor:"000000"});</script>';
- return $html;
- }
- /// Determine si le fichier est directement disponible dans la format. Si 'force' a true et fichier non disponible, lance la tache
- function audioReady($r, $forceConvert=true){
- if(!XFileDef::isAudio($r->mime))
- return false;
- $ready = true;
- $filename_cache = $r->filename.'-'.md5($r->audio_bitrate.'audio/mpeg').'-cache';
- if(!file_exists($filename_cache) || (filemtime($r->filename)>filemtime($filename_cache))){
- $ready = false;
- if($forceConvert){
- $ffmpeg = FFMPEG.' -y -i '.$r->filename.' -ab '.$r->audio_bitrate.'k -ar 44100 -f mp3 '.$filename_cache.';';
- }
- }
- if (defined('HTML5MEDIA')) {
- $filename_cache=$r->filename.'-'.md5($r->audio_bitrate.'audio/ogg').'-cache';
- if(!file_exists($filename_cache) || (filemtime($r->filename)>filemtime($filename_cache))){
- $ready = false;
- if($forceConvert){
- $ffmpeg .= FFMPEG.' -y-i '.$r->filename.' -ab '.$r->audio_bitrate.'k -acodec libvorbis -f ogg '.$filename_cache;
- }
- }
- }
- if ($ffmpeg) {
- $s=new XModScheduler(array('tplentry'=>TZR_RETURN_DATA));
- $s->createIdleShellJob(md5($ffmpeg),'Audio encoding',$ffmpeg,'');
- }
- return $ready;
- }
- /// Renvoie la duree d'une video ou d'un audio en secondes
- function getDuration($file,$mime){
- if(!$file || !file_exists($file)) return 0;
- elseif(XFileDef::isVideo($mime) || XFileDef::isAudio($mime)){
- $ffmpeg=exec(FFMPEG.' -i '.$file.' 2>&1|grep "Duration"|sed \'s/^.*Duration: \(.*\)\.[0-9],.*$/\1/\'');
- if(!empty($ffmpeg)) list($h,$m,$s)=explode(':',$ffmpeg);
- else return 0;
- if($h && $m && $s) return intval($h)*3600+intval($m)*60+intval($s);
- }
- return 0;
- }
-
- /* PDF */
- /// Complete l'objet d'affichage dans le cas d'une image
- function displayPDF(&$r,&$value,&$options){
- $resizer=$this->getResizer($r->shortfilename,$r->mime,$r->originalname);
- if(!empty($resizer) && !empty($resizer['resizer'])) {
- $r->resizer=$resizer['resizer'];
- $r->weresizer=$resizer['weresizer'];
- }
- $r->isPDF = true;
- $r->html = $r->html_default;
- return $r;
- }
- /// Affichage d'un pdf Calaméo
- function displayCalameo(&$r, $value, $options) {
- $book_id = substr($r->file, 8);
- $params = array(
- 'action' => 'API.getBookInfos',
- 'apikey' => CALAMEO_PUBLIC_KEY, // a définir dans le local.inc
- 'book_id' => $book_id,
- 'output' => 'PHP'
- );
- $url = 'http://api.calameo.com/1.0?';
- $signature = CALAMEO_SECRET_KEY; // a définir dans le local.inc
- foreach ($params as $key => $value) {
- $url .= "$key=$value&";
- $signature .= "$key$value";
- }
- $url .= 'signature=' . md5($signature);
- $response = unserialize(file_get_contents($url));
- $response = $response['response'];
- if ($response['status'] == 'error') {
- XLogs::notice(__CLASS__.'::'.__FUNCTION__, "error code {$response['error']['code']}, {$response['error']['message']}");
- $r->error = true;
- return $r;
- }
- $r->error = false;
- $r->isCalameo = true;
- $r->mime = 'application/pdf';
- $r->resizer = '';
- $r->preview = $response['content']['ThumbUrl'];
- $r->title = $response['content']['Name'];
- $r->text = $r->title;
- $r->externalUrl = $response['content']['ViewUrl'];
- $r->downloadUrl = str_replace('read', 'download', $response['content']['ViewUrl']);
- $r->fullwidth = $response['content']['Width'];
- $r->fullheight = $response['content']['Height'];
- $r->dltarget = 'calameo'; // target pour le lien download, si pdf non dispo
- $r->html_preview = $this->html_previewCalameo($r, $options);
- if ($this->usemimehtml)
- $r->html = $this->htmlCalameo($r, $options);
- else
- $r->html = $r->html_preview;
- return $r;
- }
- /// html preview calaméo
- function html_previewCalameo($r, $options=array()) {
- if ($r->error)
- return '';
- if (isset($options['geometry'])) {
- list($width, $height) = explode('x', str_replace('>', '', $options['geometry']));
- $width = (integer)$width;
- $height = (integer)$height;
- $ratio = min($width / $r->fullwidth, $height / $r->fullheight);
- $width = (integer)($ratio * $r->fullwidth);
- $height = (integer)($ratio * $r->fullwidth);
- } else {
- $width = TZR_THUMB_SIZE;
- $height = TZR_THUMB_SIZE;
- }
- return '<img src="'.$r->preview.'" width="'.$width.'" height="'.$height.'" alt="'.$r->title.'" class="tzr-externalfile" rel="'.$r->file.'">';
- }
- /// html calaméo
- function htmlCalameo($r, $options=array()) {
- if ($r->error)
- return '';
- $geometry = @$options['geometry'] ? $options['geometry'] : $this->image_geometry;
- list($width, $height) = explode('x', $geometry);
- $width = (integer)$width;
- $height = (integer)$height;
- return '<iframe id="'.$r->varid.'" src="'.$r->externalUrl.'" wmode="transparent" style="width:'.$width.'px;height:'.$height.'px"></iframe>';
- }
- /// Tag les valeurs IPTC/XMP d'un fichier via un tableau de donnée
- static function setFileMetaWithArray($data,$file,$tmpfile=NULL,$clean=false){
- if(empty($file)) return false;
- if($tmpfile=='auto'){
- $infos=pathinfo($file);
- $tmpfile=TZR_TMP_DIR.uniqid('metafile').'.'.$infos['extension'];
- copy($file,$tmpfile);
- }elseif($tmpfile){
- copy($file,$tmpfile);
- }else{
- $tmpfile=$file;
- }
- if($clean) XFileDef::cleanFileMeta($tmpfile);
-
- $mimeClasse=XMimeTypes::getInstance();
- $mime=$mimeClasse->getValidMime(NULL,$tmpfile,NULL);
- if($mime=='image/jpeg'){
- $meta=XFileDef::loadMeta($tmpfile);
- if(!empty($data['IPTC'])){
- foreach($data['IPTC'] as $tag=>$value){
- $meta->setIPTCProperty($tag,$value);
- }
- }
- if(!empty($data['XMP'])){
- foreach($data['XMP'] as $tag=>$value){
- $meta->setXMPProperty($tag,$value);
- }
- }
- $meta->save();
- }
- return $tmpfile;
- }
-
- /// Tag les valeurs IPTC/XMP d'un fichier via un template
- static function setFileMetaWithTemplate($tpl,$file,$tmpfile=NULL,$standards=array('IPTC','XMP'),$clean=false){
- if(empty($file)) return false;
- if($tmpfile=='auto'){
- $infos=pathinfo($file);
- $tmpfile=TZR_TMP_DIR.uniqid('metafile').'.'.$infos['extension'];
- copy($file,$tmpfile);
- }elseif($tmpfile){
- copy($file,$tmpfile);
- }else{
- $tmpfile=$file;
- }
- if($clean) XFileDef::cleanFileMeta($tmpfile);
- $mimeClasse=XMimeTypes::getInstance();
- $mime=$mimeClasse->getValidMime(NULL,$tmpfile,NULL);
- if($mime=='image/jpeg' && !empty($standards)){
- $tplmeta=XFileDef::loadMeta($tpl);
- $meta=XFileDef::loadMeta($tmpfile);
- // Traitement des tags IPTC
- if(in_array('IPTC',$standards)){
- $tags=$tplmeta->getIPTCAll();
- foreach($tags as $tag=>$value){
- $meta->setIPTCProperty($value['IPTC_Type'],$value['RecData']);
- }
- }
-
- // Traitement des tags XMP
- if(in_array('XMP',$standards)){
- $tags=$tplmeta->xmp_xpath->query($tplmeta->xmp_descr_path.'/'.$tplmeta->xmp_descr_node.'/*');
- foreach($tags as $tag){
- list($prefix,$foo)=explode(':',$tag->nodeName);
- if($prefix!='dc') continue;
- $n=$meta->xmp_xpath->query($meta->xmp_descr_path.'/'.$meta->xmp_descr_node.'/'.$tag->nodeName);
- if($n->length){
- $p=$n->parentNode;
- $p->removeChild($n);
- }else{
- $d=$meta->getXMPDescriptionFromPrefix($prefix);
- if(empty($d)) $d=$meta->addXMPDescription($prefix,$tag->parentNode->lookupNamespaceURI($prefix));
- $p=$d;
- }
- $p->appendChild($meta->xmp_dom->importNode($tag,true));
- }
- }
- $meta->save();
- }
- return $tmpfile;
- }
- /// Tag les valeurs IPTC/XMP d'un fichier via un display
- static function setFileMetaWithDisplay($d,$file,$tmpfile=NULL,$standards=array('IPTC','XMP'),$clean=false){
- if(empty($file)) return false;
- if($tmpfile=='auto'){
- $infos=pathinfo($file);
- $tmpfile=TZR_TMP_DIR.uniqid('metafile').'.'.$infos['extension'];
- copy($file,$tmpfile);
- }elseif($tmpfile){
- copy($file,$tmpfile);
- }else{
- $tmpfile=$file;
- }
- if($clean) XFileDef::cleanFileMeta($tmpfile);
- $mimeClasse=XMimeTypes::getInstance();
- $mime=$mimeClasse->getValidMime(NULL,$file,NULL);
- if($mime=='image/jpeg' && !empty($standards)){
- $meta=XFileDef::loadMeta($tmpfile);
- if(!isset($d['fields_object'])){
- foreach($d as $i=>&$dd){
- foreach($dd['fields_object'] as $i=>&$f){
- $fdef=&$f->fielddef;
- $fdef->setMetaFromValue($meta,$dd['o'.$fdef->field],$standards);
- }
- }
- }else{
- foreach($d['fields_object'] as $i=>&$f){
- $fdef=&$f->fielddef;
- $fdef->setMetaFromValue($meta,$d['o'.$fdef->field],$standards);
- }
- }
- $meta->save();
- }
- return $tmpfile;
- }
- /// Nettoie tous les metas d'un fichier
- static function cleanFileMeta($file){
- $mimeClasse=XMimeTypes::getInstance();
- $mime=$mimeClasse->getValidMime(NULL,$file,NULL);
- if($mime=='image/jpeg'){
- system(TZR_MOGRIFY_RESIZER.' +profile "*" '.$file.' '.$file.';'. TZR_MOGRIFY_RESIZER.' +profile "*" '.$file.'_ld '.$file.'_ld');
- }
- }
- // generation du nom du fichier
- //
- function filename($value,$test=false,$testfinal=false,$secondaryroot=NULL) {
- global $DATA_DIR;
- $ar=NULL;
- if($value=='') return NULL;
- if($value==TZR_UNCHANGED) return NULL;
- $langdata = XShell::getLangData();
- @list($file,$mime,$originalname) = @explode(';',$value);
- if($file=='') return NULL;
- if($test) $this->_checkDir();
- umask(0000);
- $root=$this->table;
- if(!empty($secondaryroot)) {
- $root='A_'.$this->table.'/'.$secondaryroot;
- }
- $root.='/'.$this->field;
- $subdir=md5($file);
- while(strlen($subdir)>=16) {
- $tmp=substr($subdir,0,2);
- $root.='/'.$tmp;
- $subdir=substr($subdir,16);
- }
- if($test) XDir::mkdir($DATA_DIR.$root, false);
- $filename=$root.'/'.$file;
- if($test || $testfinal) {
- if(file_exists($DATA_DIR.$filename)) {
- $ar=$filename;
- } elseif($test) {
- $ar=NULL;
- }
- } else {
- $ar=$filename;
- }
- return $ar;
- }
- /// Generation du champ pour modification du fichier
- function my_edit(&$value,&$options) {
- $lang = XShell::getLangUser();
- $r=$this->_newXFieldVal($options,true);
- if(isset($options['intable'])) {
- return $r;
- $o = $options['intable'];
- $fname=$this->field.'['.$o.']';
- $hiddenname=$this->field.'_HID['.$o.']';
- } elseif(!empty($options['fieldname'])) {
- $fname=$options['fieldname'];
- $hiddenname=$options['fieldname'].'_HID';
- } else {
- $fname=$this->field;
- $hiddenname=$this->field.'_HID';
- }
- $r->raw=$value;
- $this->_checkDir();
- $varid=$r->varid;
- $disp=$this->my_display($value,$options);
- // Titre à part
- $txt='<table class="tzr-xfiledef"><tr>';
- if($this->usealt)
- $txt.='<td><label>'.XLabels::getSysLabel('general','title','text').'</label></td><td id="'.$varid.'-tdtitle"><input type="text" name="'.$fname.'_title" value="'.$disp->title.'"/></td></tr><tr><td><label>'.XLabels::getSysLabel('xfielddef','xfiledef','text').'</label></td>';
- // Input fichier + bouton parcourir console
- $txt.='<td id="'.$varid.'-tdfile"'.($disp->isExternal?' style="display:none"':'').'><input type="file" name="'.$fname.'" accept="'.$this->accept.'"'.(!empty($this->maxlength)?' maxlength="'.$this->maxlength.'"':'').' id="'.$varid.'"><br/>';
- if(XShell::admini_mode() && $this->browsemods) {
- $url=$GLOBALS['TZR_SESSION_MANAGER']::complete_self().'moid='.XModule::getMoid(XMODADMIN_TOID).'&function=modulesList&tplentry=br&_nonav=1&_nohistory=1&template=basic/source-file.html'.
- '&skip=1&ajaxurl='.rawurlencode($GLOBALS['TZR_SESSION_MANAGER']::complete_self().'&function=browseFiles&tplentry=br&template=basic/source-file-ajax.html'.
- '&pagesize=20&skip=1&recipientid='.$varid.'&_nonav=1&_nohistory=1&selectedprops[published]=1'.
- '&selectedtypes[]=XFileDef&selectedtypes[]=XFolderDef&selectedop=OR');
- if($this->sourcemodule) $url.='&toid=xx&ajaxmoid='.$this->sourcemodule;
- else $url.='&toid[]=25&toid[]=8001';
- $txt.='<input type="button" value="'.XLabels::getSysLabel('xmodule','browsemods','text').'" onclick="window.open(\''.$url.'\',\'\',\'width=655,height=550,menubar=0,resizable=1,scrollbars=1\');">';
- }
- // Fichier externe
- if ($this->allow_externalfile) {
- $txt .= '<input type="button" value="'.XLabels::getSysLabel('xfielddef','externalfile').'" onclick="jQuery(\'#'.$r->varid.'-tdfile, #'.$r->varid.'-tdexternal, #'.$r->varid.'-trcancel\').toggle()">';
- }
- $txt.='</td>';
- if (XShell::admini_mode() && $this->browsemods) {
- $txt .= '<td id="'.$r->varid.'-tdbrowsemods"></td>';
- }
- if ($this->allow_externalfile) {
- $txt .= '<td id="'.$r->varid.'-tdexternal"'.($disp->isExternal?'':' style="display:none"').'>'.XLabels::getSysLabel('xfielddef','externalfile').' : <input type="text" id="'.$r->varid.'-external" value="'.$disp->externalUrl.'" name="'.$hiddenname.'[external]" size="50" maxsize="200"/></td>';
- }
- $txt.='</tr>';
- if (XShell::admini_mode() && $this->browsemods || $this->allow_externalfile) {
- $txt.='<tr '.($disp->isExternal?'':' style="display:none"').' id="'.$r->varid.'-trcancel"><td colspan="4"><input type="button" value="'.XLabels::getSysLabel('general','cancel').'" onclick="jQuery(\'#'.$r->varid.'-tdexternal,#'.$r->varid.'-trcancel\').hide();jQuery(\'#'.$r->varid.'-tdbrowsemods\').html(\'\').hide();jQuery(\'#'.$r->varid.'-tdfile\').show();jQuery(\'#'.$r->varid.'-from, #'.$r->varid.'-external\').val(\'\')"></td></tr>';
- }
- $txt.='</tr></table>';
- $txt.='<input type="hidden" id="'.$r->varid.'-old" name="'.$hiddenname.'[old]" value="'.$value.'"/>';
- $txt.='<input id="'.$varid.'-from" type="hidden" name="'.$hiddenname.'[from]" value=""/>';
- // Bouton de supression
- if($disp->html!='' && !$this->compulsory)
- $txt.=' '.XLabels::getSysLabel('xfielddef','detach_file').' : <input type="checkbox" name="'.$fname.'_del" class="checkbox"/><br/>';
- if ($this->compulsory) {
- $txt .= '<script type="text/javascript">TZR.addValidator(["'.$r->varid.'","","'.addslashes($this->label).'","'.XIni::get('error_color').'","XFileDef","","'.$this->browsemods.'","'.$this->allow_externalfile.'"]);</script>';
- }
- $r->html=$txt;
- $r->originalname=$disp->originalname;
- $r->filename=$disp->filename;
- $r->mime=$disp->mime;
- if(XFileDef::isImage($r->mime) || get_class($this)=='XImageDef')
- $this->editImage($r,$value,$options,$disp,$fname,$hiddenname);
- elseif($disp->mime=='text/html' || $disp->mime=='text/plain')
- $this->editHTML($r,$value,$options,$disp,$fname,$hiddenname);
- else
- $r->html .= $disp->html_preview;
- return $r;
- }
- /// Complete l'objet d'edition dans le cas d'une image
- function editImage(&$r,&$value,&$options,&$disp,$fname,$hiddenname){
- $r->isImage=true;
- if(!empty($this->image_crop_ratio)){
- $r->html.='<div id="'.$r->varid.'-cropinfo" class="tzr-xfiledef-cropinfo"><a href="#" onclick="return false;">'.XLabels::getSysLabel('xfielddef','image_crop').'</a></div>';
- $r->html.='<script type="text/javascript">TZR.Image.activeCrop(\''.$r->varid.'\',\''.$this->image_crop_ratio.'\');</script>';
- }
- if($disp->html){
- $px=' '.XLabels::getSysLabel('general','pixels','text');
- $r->html='<table><tr><td colspan="2">'.$r->html.'</td></tr><tr><td><img src="'.$disp->resizer.'&geometry='.TZR_THUMB_SIZE.'x'.TZR_THUMB_SIZE.'%3E"></td><td>'.
- $disp->html_default.'<br>'.
- XLabels::getSysLabel('xfielddef','file_size').' : '.round($this->getFileSize($r)/1024).' Ko<br>'.
- XLabels::getSysLabel('general','width','text').' : '.$this->getImageSize($r,'fullwidth').$px.'<br>'.
- XLabels::getSysLabel('general','height','text').' : '.$this->getImageSize($r,'fullheight').$px.
- '</td></tr></table>';
- }
- }
- /// Complete l'objet d'édition dans le cas d'un fichier HTML
- function editHTML(&$r,&$value,&$options,&$disp,$fname,$hiddenname){
- if($options['fmoid']){
- $edition='';
- $tmpname=md5(session_id().$disp->table.$disp->field.$options['oid']);
- copy($disp->filename, TZR_TMP_DIR.$tmpname);
- $dla=$this->getDownloader($tmpname, $disp->mime, $disp->originalname, $disp->originalname, $options['fmoid']);
- $dl=$dla[0].'&tmp=1&disp=inline';
- $url=$GLOBALS['TZR_SESSION_MANAGER']::complete_self(true,true).'&function=edit&selectedfields[]='.$this->field.'&moid='.$options['fmoid'].'&template=popfileedit.html&field='.$this->field.'&tplentry=br&oid='.$options['oid'];
- $upl=TZR_FILE_EDITOR_UPLOADER.'?moid='.$options['fmoid'].'&table='.$disp->table.'&field='.$disp->field.'&oid='.$options['oid'].'&moid='.$options['fmoid'];
- $edition.='<input type="hidden" name="'.$hiddenname.'[editflag]" value="no"/>';
- $edition.=' <a href="#" onclick="TZR.openhtmlfileeditor({uniqid:\''.XShell::uniqid().'\',url:\''.$url.'\',uploader:\''.$upl.'\', editflag:\''.$hiddenname.'[editflag]\'}); return false;">'.XLabels::getSysLabel('general','edit','text').'</a>';
- $r->html.=$disp->html.$edition;
- }else{
- $r->html.=$disp->html;
- }
- }
- function sqltype() {
- return 'varchar(200)';
- }
- /// Suppression de la donnee
- function delete($value, $oid) {
- global $DATA_DIR;
- $langdata = XShell::getLangData();
- // calcul du nom du fichier associe
- $filename= $this->filename($value,true);
- if($filename) {
- if(file_exists($DATA_DIR.$filename)) {
- XLogs::debug('[XFileDef::delete]unlink('.$DATA_DIR.$filename.')');
- @unlink($DATA_DIR.$filename);
- }
- }
- return 1;
- }
- function post_edit($value,$options) {
- global $DATA_DIR;
- $p=new XParam($options,array('del'=>true));
- $r=$this->_newXFieldVal($options);
- $langdata=XShell::getLangData();
- $hidden=$options[$this->field.'_HID'];
- $del=$p->get('del');
- $mimeClasse=XMimeTypes::getInstance();
- // Verification que les repertoires existent
- $oid=$p->get(…
Large files files are truncated, but you can click here to view the full file