* Copyright (C) 2010-2011 Regis Houssin * Copyright (c) 2010 Juanjo Menent * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** * \file htdocs/core/class/html.formfile.class.php * \ingroup core * \brief File of class to offer components to list and upload files * \version $Id: html.formfile.class.php,v 1.45 2011/07/06 17:44:56 eldy Exp $ */ /** * \class FormFile * \brief Class to offer components to list and upload files */ class FormFile { var $db; var $error; var $numoffiles; /** * Constructor * @param DB handler d'acces base de donnee */ function FormFile($DB) { $this->db = $DB; $this->numoffiles=0; return 1; } /** * Show form to upload a new file * @param url Url * @param title Title zone (Title or '' or 'none') * @param addcancel 1=Add 'Cancel' button * @param sectionid If upload must be done inside a particular ECM section * @param perm Value of permission to allow upload * @param size Length of input file area * @return int <0 ij KO, >0 if OK */ function form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50) { global $conf,$langs; $maxlength=$size; print "\n\n\n"; if (empty($title)) $title=$langs->trans("AttachANewFile"); if ($title != 'none') print_titre($title); print '
'; print ''; print ''; print ''; print '"; print "
'; $max=$conf->global->MAIN_UPLOAD_DOC; // En Kb $maxphp=@ini_get('upload_max_filesize'); // En inconnu if (preg_match('/m$/i',$maxphp)) $maxphp=$maxphp*1024; if (preg_match('/k$/i',$maxphp)) $maxphp=$maxphp; // Now $max and $maxphp are in Kb if ($maxphp > 0) $max=min($max,$maxphp); if ($max > 0) { print ''; } print 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="true"':''); print '>'; print '   '; print 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="true"':''); print '>'; if ($addcancel) { print '   '; print ''; } if (! empty($conf->global->MAIN_UPLOAD_DOC)) { if ($perm) { print ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb"); print ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1); print ')'; } } else { print ' ('.$langs->trans("UploadDisabled").')'; } print "
"; print '
'; if (empty($sectionid)) print '
'; print "\n\n\n"; return 1; } /** * Show the box with list of available documents for object * @param modulepart propal, facture, facture_fourn, ... * @param filename Sub dir to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if filedir already complete) * @param filedir Dir to scan * @param urlsource Url of origin page (for return) * @param genallowed Generation is allowed (1/0 or array of formats) * @param delallowed Remove is allowed (1/0) * @param modelselected Model to preselect by default * @param allowgenifempty Show warning if no model activated * @param forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param iconPDF Show only PDF icon with link (1/0) * @param maxfilenamelength Max length for filename shown * @param noform Do not output html form tags * @param param More param on http links * @param title Title to show on top of form * @param buttonlabel Label on submit button * @param codelang Default language code to use on lang combo box if multilang is enabled * @param hooks Object hook of external modules * @return int <0 if KO, number of shown files if OK */ function show_documents($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='',$hooks='') { print $this->showdocuments($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed,$modelselected,$allowgenifempty,$forcenomultilang,$iconPDF,$maxfilenamelength,$noform,$param,$title,$buttonlabel,$codelang,$hooks); return $this->numoffiles; } /** * Return a string to show the box with list of available documents for object. * This also set the property $this->numoffiles. * @param modulepart propal, facture, facture_fourn, ... * @param filename Sub dir to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if filedir already complete) * @param filedir Dir to scan * @param urlsource Url of origin page (for return) * @param genallowed Generation is allowed (1/0 or array of formats) * @param delallowed Remove is allowed (1/0) * @param modelselected Model to preselect by default * @param allowgenifempty Show warning if no model activated * @param forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param iconPDF Show only PDF icon with link (1/0) * @param maxfilenamelength Max length for filename shown * @param noform Do not output html form tags * @param param More param on http links * @param title Title to show on top of form * @param buttonlabel Label on submit button * @param codelang Default language code to use on lang combo box if multilang is enabled * @param hooks Object hook of external modules * @return string Output string. */ function showdocuments($modulepart,$filename,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='',$hooks='') { // filedir = conf->...dir_ouput."/".get_exdir(id) include_once(DOL_DOCUMENT_ROOT.'/lib/files.lib.php'); global $langs,$bc,$conf; $out=''; $var=true; // Clean paramaters if ($iconPDF == 1) { $genallowed = ''; $delallowed = 0; $modelselected = ''; $forcenomultilang=0; } //$filename = dol_sanitizeFileName($filename); //Must be sanitized before calling show_documents $headershown=0; $showempty=0; $i=0; $titletoshow=$langs->trans("Documents"); if (! empty($title)) $titletoshow=$title; $out.= "\n".''."\n"; //print 'filedir='.$filedir; // Affiche en-tete tableau if ($genallowed) { $modellist=array(); $cgvlist=array(); if ($modulepart == 'company') { $showempty=1; if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/societe/modules_societe.class.php'); $model=new ModeleThirdPartyDoc(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'propal') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/propale/modules_propale.php'); $model=new ModelePDFPropales(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'commande') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/commande/modules_commande.php'); $model=new ModelePDFCommandes(); $modellist=$model->liste_modeles($this->db); } } elseif ($modulepart == 'expedition') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/expedition/pdf/ModelePdfExpedition.class.php'); $model=new ModelePDFExpedition(); $modellist=$model->liste_modeles($this->db); } } elseif ($modulepart == 'livraison') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/livraison/modules_livraison.php'); $model=new ModelePDFDeliveryOrder(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'ficheinter') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/fichinter/modules_fichinter.php'); $model=new ModelePDFFicheinter(); $modellist=$model->liste_modeles($this->db); } } elseif ($modulepart == 'facture') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/facture/modules_facture.php'); $model=new ModelePDFFactures(); $modellist=$model->liste_modeles($this->db); // This is to allow to join external files to invoices if (! empty($conf->concatpdf->enabled)) { $filescgv=glob($conf->concatpdf->dir_output."/invoices/*.pdf"); if ($filescgv) { foreach ($filescgv as $cgvfilename) { $cgvlist[] = basename($cgvfilename, ".pdf"); } } } } } elseif ($modulepart == 'project') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/project/modules_project.php'); $model=new ModelePDFProjects(); $modellist=$model->liste_modeles($this->db); } } elseif ($modulepart == 'export') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/export/modules_export.php'); $model=new ModeleExports(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'commande_fournisseur') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier_order/modules_commandefournisseur.php'); $model=new ModelePDFSuppliersOrders(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'facture_fournisseur') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/supplier_invoice/modules_facturefournisseur.php'); $model=new ModelePDFSuppliersInvoices(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'remisecheque') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/cheque/pdf/modules_chequereceipts.php'); $model=new ModeleChequeReceipts(); $modellist=$model->liste_modeles($this->db); } } elseif ($modulepart == 'donation') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once(DOL_DOCUMENT_ROOT.'/includes/modules/dons/modules_don.php'); $model=new ModeleDon(); $modellist=$model->liste_modeles($this->db); } } else if ($modulepart == 'unpaid') { $modellist=''; } else { // Generic feature, for external modules $file=dol_buildpath('/includes/modules/'.$modulepart.'/modules_'.$modulepart.'.php',0); if (file_exists($file)) { $res=include_once($file); } $class='Modele'.ucfirst($modulepart); if (class_exists($class)) { $model=new $class(); $modellist=$model->liste_modeles($this->db); } else { dol_print_error($this->db,'Bad value for modulepart'); return -1; } } $headershown=1; $html = new Form($db); $buttonlabeltoshow=$buttonlabel; if (empty($buttonlabel)) $buttonlabel=$langs->trans('Generate'); if (empty($noform)) $out.= '
'; $out.= ''; $out.= ''; $out.= '
'.$titletoshow.'
'; $out.= ''; $out.= ''; // Model if (! empty($modellist)) { $out.= ''; } else { $out.= ''; } // Language code (if multilang) $out.= ''; // Button $out.= ''; $out.= ''; // Execute hooks if (! empty($hooks) && is_array($hooks)) { foreach($hooks as $hook) { if (! empty($hook['modules'])) { foreach($hook['modules'] as $module) { if (method_exists($module,'formBuilddocOptions')) $out.= $module->formBuilddocOptions(); } } } } } // Get list of files if ($filedir) { $png = ''; $filter = ''; if ($iconPDF==1) { $png = '\.png$'; $filter = $filename.'.pdf'; } $file_list=dol_dir_list($filedir,'files',0,$filter,'\.meta$'.($png?'|'.$png:''),'date',SORT_DESC); // Affiche en-tete tableau si non deja affiche if (sizeof($file_list) && ! $headershown && !$iconPDF) { $headershown=1; $out.= '
'.$titletoshow.'
'; $out.= '
'; $out.= $langs->trans('Model').' '; if (is_array($modellist) && sizeof($modellist) == 1) // If there is only one element { $arraykeys=array_keys($modellist); $modelselected=$arraykeys[0]; } $out.= $html->selectarray('model',$modellist,$modelselected,$showempty,0,0); if (sizeof($cgvlist) > 0) { $out.= $html->selectarray('cgv',$cgvlist,"-1",1,0,1); } $out.= ''; $out.= $langs->trans("Files"); $out.= ''; if (($allowgenifempty || (is_array($modellist) && sizeof($modellist) > 0)) && $conf->global->MAIN_MULTILANGS && ! $forcenomultilang) { include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'); $formadmin=new FormAdmin($this->db); $defaultlang=$codelang?$codelang:$langs->getDefaultLang(); $out.= $formadmin->select_language($defaultlang); } else { $out.= ' '; } $out.= ''; $out.= 'load("errors"); $out.= ' '.img_warning($langs->trans("WarningNoDocumentModelActivated")); } $out.= '
'; } // Loop on each file found foreach($file_list as $file) { $var=!$var; // Define relative path for download link (depends on module) $relativepath=$file["name"]; // Cas general if ($filename) $relativepath=$filename."/".$file["name"]; // Cas propal, facture... // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($filename,2).$file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } if (!$iconPDF) $out.= ""; // Show file name with link to download if (!$iconPDF) $out.= ''; // Affiche taille fichier if (!$iconPDF) $out.= ''; // Affiche date fichier if (!$iconPDF) $out.= ''; if ($delallowed) { $out.= ''; } if (!$iconPDF) $out.= ''; $this->numoffiles++; } } if ($headershown) { // Affiche pied du tableau $out.= "
'; $out.= 'trans("File").': '.$file["name"]).' '.dol_trunc($file["name"],$maxfilenamelength); } else { $out.= img_pdf($file["name"],2); } $out.= ''; if (!$iconPDF) $out.= ''.dol_print_size(dol_filesize($filedir."/".$file["name"])).''.dol_print_date(dol_filemtime($filedir."/".$file["name"]),'dayhour').''.img_delete().'
\n"; if ($genallowed) { if (empty($noform)) $out.= '
'."\n"; } } $out.= ''."\n"; //return ($i?$i:$headershown); return $out; } /** * Show list of documents in a directory * @param filearray Array of files loaded by dol_dir_list('files') function before calling this * @param object Object on which document is linked to * @param modulepart Value for modulepart used by download or viewimage wrapper * @param param Parameters on sort links * @param forcedownload Force to open dialog box "Save As" when clicking on file * @param relativepath Relative path of docs (autodefined if not provided) * @param permtodelete Permission to delete * @param useinecm Change output for use in ecm module * @param textifempty Text to show if filearray is empty * @param maxlength Maximum length of file name shown * @return int <0 if KO, nb of files shown if OK */ function list_of_documents($filearray,$object,$modulepart,$param,$forcedownload=0,$relativepath='',$permtodelete=1,$useinecm=0,$textifempty='',$maxlength=0) { global $user, $conf, $langs; global $bc; global $sortfield, $sortorder; // Show list of existing files if (empty($useinecm)) print_titre($langs->trans("AttachedFiles")); //else { $bc[true]=''; $bc[false]=''; }; $url=$_SERVER["PHP_SELF"]; print ''; print ''; print_liste_field_titre($langs->trans("Documents2"),$_SERVER["PHP_SELF"],"name","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Size"),$_SERVER["PHP_SELF"],"size","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),$_SERVER["PHP_SELF"],"date","",$param,'align="center"',$sortfield,$sortorder); if (empty($useinecm)) print_liste_field_titre('',$_SERVER["PHP_SELF"],"","",$param,'align="center"'); print_liste_field_titre('','',''); print ''; $nboffiles=sizeof($filearray); if ($nboffiles > 0) include_once(DOL_DOCUMENT_ROOT.'/lib/images.lib.php'); $var=true; foreach($filearray as $key => $file) // filearray must be only files here { if ($file['name'] != '.' && $file['name'] != '..' && $file['name'] != 'CVS' && ! preg_match('/\.meta$/i',$file['name'])) { // Define relative path used to store the file if (! $relativepath) $relativepath=dol_sanitizeFileName($object->ref).'/'; $var=!$var; print ''; print '\n"; print ''; print ''; // Preview if (empty($useinecm)) { print ''; } // Delete or view link print '"; print "\n"; } } if ($nboffiles == 0) { print ''; } print "
'; //print "XX".$file['name']; //$file['name'] must be utf8 print ''; print img_mime($file['name'],$file['name'].' ('.dol_print_size($file['size'],0,0).')').' '; print dol_trunc($file['name'],$maxlength,'middle'); print ''; print "'.dol_print_size($file['size'],1,1).''.dol_print_date($file['date'],"dayhour").''; $tmp=explode('.',$file['name']); $minifile=$tmp[0].'_mini.'.$tmp[1]; if (image_format_supported($file['name']) > 0) print ''; else print ' '; print ''; if (! empty($useinecm)) print ''.img_view().'   '; if ($permtodelete) print ''.img_delete().''; else print ' '; print "
'; if (empty($textifempty)) print $langs->trans("NoFileFound"); else print $textifempty; print '
"; // Fin de zone } /** * Show list of documents in a directory * @param upload_dir Directory that was scanned * @param filearray Array of files loaded by dol_dir_list function before calling this function * @param modulepart Value for modulepart used by download wrapper * @param param Parameters on sort links * @param forcedownload Force to open dialog box "Save As" when clicking on file * @param relativepath Relative path of docs (autodefined if not provided) * @param permtodelete Permission to delete * @param useinecm Change output for use in ecm module * @param textifempty Text to show if filearray is empty * @param maxlength Maximum length of file name shown * @return int <0 if KO, nb of files shown if OK */ function list_of_autoecmfiles($upload_dir,$filearray,$modulepart,$param,$forcedownload=0,$relativepath='',$permtodelete=1,$useinecm=0,$textifempty='',$maxlength=0) { global $user, $conf, $langs; global $bc; global $sortfield, $sortorder; // Affiche liste des documents existant if (empty($useinecm)) print_titre($langs->trans("AttachedFiles")); //else { $bc[true]=''; $bc[false]=''; }; $url=$_SERVER["PHP_SELF"]; print ''; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Documents2"),$_SERVER["PHP_SELF"],"name","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Size"),$_SERVER["PHP_SELF"],"size","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),$_SERVER["PHP_SELF"],"date","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre('','',''); print ''; if ($modulepart == 'invoice') { include_once(DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'); $object_static=new Facture($this->db); } if ($modulepart == 'invoice_supplier') { include_once(DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'); $object_static=new FactureFournisseur($this->db); } $var=true; foreach($filearray as $key => $file) { if (!is_dir($file['name']) && $file['name'] != '.' && $file['name'] != '..' && $file['name'] != 'CVS' && ! preg_match('/\.meta$/i',$file['name'])) { // Define relative path used to store the file $relativefile=preg_replace('/'.preg_quote($upload_dir.'/','/').'/','',$file['fullname']); //print 'eeee'.$relativefile; //var_dump($file); $var=!$var; print ''; print ''; print '\n"; print ''; print ''; print '\n"; } } if (sizeof($filearray) == 0) { print ''; } print "
'; $id='';$ref=''; if ($modulepart == 'invoice') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=$reg[1]; $object_static->fetch('',$ref); //print $relativefile.'rr'.$id; print $object_static->getNomUrl(1,'document'); } if ($modulepart == 'invoice_supplier') { preg_match('/(\d+)\/[^\/]+$/',$relativefile,$reg); $id=$reg[1]; $object_static->fetch($id); //print $relativefile.'rr'.$id; print $object_static->getNomUrl(1,'document'); } print ''; //print "XX".$file['name']; //$file['name'] must be utf8 print ''; print img_mime($file['name'],$file['name'].' ('.dol_print_size($file['size'],0,0).')').' '; print dol_trunc($file['name'],$maxlength,'middle'); print ''; print "'.dol_print_size($file['size'],1,1).''.dol_print_date($file['date'],"dayhour").''; if (! empty($useinecm)) print ''; print img_view().'   '; //if ($permtodelete) print ''.img_delete().''; //else print ' '; print "
'; if (empty($textifempty)) print $langs->trans("NoFileFound"); else print $textifempty; print '
"; // Fin de zone } /** * Show form to upload a new file with jquery fileupload */ function form_ajaxfileupload($object) { global $langs; // PHP post_max_size $post_max_size = ini_get('post_max_size'); $mul_post_max_size = substr($post_max_size, -1); $mul_post_max_size = ($mul_post_max_size == 'M' ? 1048576 : ($mul_post_max_size == 'K' ? 1024 : ($mul_post_max_size == 'G' ? 1073741824 : 1))); $post_max_size = $mul_post_max_size*(int)$post_max_size; // PHP upload_max_filesize $upload_max_filesize = ini_get('upload_max_filesize'); $mul_upload_max_filesize = substr($upload_max_filesize, -1); $mul_upload_max_filesize = ($mul_upload_max_filesize == 'M' ? 1048576 : ($mul_upload_max_filesize == 'K' ? 1024 : ($mul_upload_max_filesize == 'G' ? 1073741824 : 1))); $upload_max_filesize = $mul_upload_max_filesize*(int)$upload_max_filesize; // Max file size $max_file_size = (($post_max_size < $upload_max_filesize) ? $post_max_size : $upload_max_filesize); print ''; print '
'; print '
'; print ''; print ''; print '
'; print ''; print ''; print ''; print ''; print '
'; print '
'; print ''; /*print ''; print ''; print ''; print ''; print ''; print '';*/ print '
'.$langs->trans("Documents2").''.$langs->trans("Preview").''.$langs->trans("Size").'
'; // We remove this because there is already individual bars. //print '
'; print '
'; print '
'; // Include template include(DOL_DOCUMENT_ROOT.'/core/tpl/ajaxfileupload.tpl.php'); } } ?>