* Copyright (C) 2010-2014 Regis Houssin * Copyright (C) 2010 Juanjo Menent * Copyright (C) 2013 Charles-Fr BENKE * Copyright (C) 2013 Cédric Salvador * Copyright (C) 2014 Marcos García * * 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 3 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, see . */ /** * \file htdocs/core/class/html.formfile.class.php * \ingroup core * \brief File of class to offer components to list and upload files */ /** * Class to offer components to list and upload files */ class FormFile { var $db; var $error; var $numoffiles; /** * Constructor * * @param DoliDB $db Database handler */ function __construct($db) { $this->db = $db; $this->numoffiles=0; return 1; } /** * Show form to upload a new file * * @param string $url Url * @param string $title Title zone (Title or '' or 'none') * @param int $addcancel 1=Add 'Cancel' button * @param int $sectionid If upload must be done inside a particular ECM section * @param int $perm Value of permission to allow upload * @param int $size Length of input file area * @param Object $object Object to use (when attachment is done on an element) * @param string $options Add an option column * @param boolean $useajax Use fileupload ajax (0=never, 1=if enabled, 2=always whatever is option). 2 should never be used. * @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__' * @param string $linkfiles 1=Also add form to link files, 0=Do not show form to link files * @param string $htmlname Name and id of HTML form * @return int <0 if KO, >0 if OK */ function form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object='', $options='', $useajax=1, $savingdocmask='', $linkfiles=1, $htmlname='formuserfile') { global $conf,$langs, $hookmanager; $hookmanager->initHooks(array('formfile')); if (! empty($conf->browser->phone)) return 0; if ((! empty($conf->global->MAIN_USE_JQUERY_FILEUPLOAD) && $useajax) || ($useajax==2)) { // TODO: Cheeck this works with 2 forms on same page // TODO: Cheeck this works with GED module, otherwise, force useajax to 0 // TODO: This does not support option savingdocmask // TODO: This break feature to upload links too return $this->_formAjaxFileUpload($object); } else { $maxlength=$size; $out = "\n\n\n"; if (empty($title)) $title=$langs->trans("AttachANewFile"); if ($title != 'none') print_titre($title); $out .= '
'; $out .= ''; $out .= ''; $out .= ''; $out .= ''; $out .= ''; if (! empty($options)) $out .= ''; $out .= '"; if ($savingdocmask) { $out .= ''; if (! empty($options)) $out .= ''; $out .= ''; $out .= ''; } $out .= "
'.$options.''; $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; // Now $max and $maxphp are in Kb if ($maxphp > 0) $max=min($max,$maxphp); if ($max > 0) { $out .= ''; } $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); $out .= '>'; $out .= '   '; $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); $out .= '>'; if ($addcancel) { $out .= '   '; $out .= ''; } if (! empty($conf->global->MAIN_UPLOAD_DOC)) { if ($perm) { $langs->load('other'); $out .= ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb"); $out .= ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1); $out .= ')'; } } else { $out .= ' ('.$langs->trans("UploadDisabled").')'; } $out .= "
'.$options.''; $out .= ' '.$langs->trans("SaveUploadedFileWithMask", preg_replace('/__file__/',$langs->transnoentitiesnoconv("OriginFileName"),$savingdocmask), $langs->transnoentitiesnoconv("OriginFileName")); $out .= '
"; $out .= '
'; if (empty($sectionid)) $out .= '
'; $out .= "\n\n"; if ($linkfiles) { $out .= "\n\n"; $langs->load('link'); $title = $langs->trans("LinkANewFile"); $out .= load_fiche_titre($title, null, null); $out .= '
'; $parameters = array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''), 'url'=>$url, 'perm'=>$perm); $res = $hookmanager->executeHooks('formattachOptions',$parameters,$object); $out .= "\n\n"; } if (empty($res)) { print $out; } print $hookmanager->resPrint; return 1; } } /** * Show the box with list of available documents for object * * @param string $modulepart propal, facture, facture_fourn, ... * @param string $modulesubdir Sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into subdir of module. * @param string $filedir Directory to scan * @param string $urlsource Url of origin page (for return) * @param int $genallowed Generation is allowed (1/0 or array of formats) * @param int $delallowed Remove is allowed (1/0) * @param string $modelselected Model to preselect by default * @param string $allowgenifempty Show warning if no model activated * @param string $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param int $iconPDF Show only PDF icon with link (1/0) * @param int $maxfilenamelength Max length for filename shown * @param string $noform Do not output html form tags * @param string $param More param on http links * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button * @param string $codelang Default language code to use on lang combo box if multilang is enabled * @return int <0 if KO, number of shown files if OK */ function show_documents($modulepart,$modulesubdir,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='') { $this->numoffiles=0; print $this->showdocuments($modulepart,$modulesubdir,$filedir,$urlsource,$genallowed,$delallowed,$modelselected,$allowgenifempty,$forcenomultilang,$iconPDF,$maxfilenamelength,$noform,$param,$title,$buttonlabel,$codelang); 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 string $modulepart Module the files are related to ('propal', 'facture', 'facture_fourn', 'mymodule', 'mymodule_temp', ...) * @param string $modulesubdir Existing (so sanitized) sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into subdir of module. * @param string $filedir Directory to scan * @param string $urlsource Url of origin page (for return) * @param int $genallowed Generation is allowed (1/0 or array list of templates) * @param int $delallowed Remove is allowed (1/0) * @param string $modelselected Model to preselect by default * @param string $allowgenifempty Allow generation even if list of template ($genallowed) is empty (show however a warning) * @param string $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param int $iconPDF Obsolete, see getDocumentsLink * @param int $maxfilenamelength Max length for filename shown * @param string $noform Do not output html form tags * @param string $param More param on http links * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button * @param string $codelang Default language code to use on lang combo box if multilang is enabled * @param string $morepicto Add more HTML content into cell with picto * @return string Output string with HTML array of documents (might be empty string) */ function showdocuments($modulepart,$modulesubdir,$filedir,$urlsource,$genallowed,$delallowed=0,$modelselected='',$allowgenifempty=1,$forcenomultilang=0,$iconPDF=0,$maxfilenamelength=28,$noform=0,$param='',$title='',$buttonlabel='',$codelang='',$morepicto='') { global $langs, $conf, $user, $hookmanager; global $form, $bc; if (! is_object($form)) $form=new Form($this->db); // filedir = $conf->...->dir_ouput."/".get_exdir(id) include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; // For backward compatibility if (! empty($iconPDF)) { return $this->getDocumentsLink($modulepart, $modulesubdir, $filedir); } $printer = (!empty($user->rights->printipp->read) && !empty($conf->printipp->enabled))?true:false; $hookmanager->initHooks(array('formfile')); $forname='builddoc'; $out=''; $var=true; $headershown=0; $showempty=0; $i=0; $titletoshow=$langs->trans("Documents"); if (! empty($title)) $titletoshow=$title; $out.= "\n".''."\n"; //print 'filedir='.$filedir; // Show table if ($genallowed) { $modellist=array(); if ($modulepart == 'company') { $showempty=1; if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/societe/modules_societe.class.php'; $modellist=ModeleThirdPartyDoc::liste_modeles($this->db); } } else if ($modulepart == 'propal') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php'; $modellist=ModelePDFPropales::liste_modeles($this->db); } } else if ($modulepart == 'commande') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php'; $modellist=ModelePDFCommandes::liste_modeles($this->db); } } elseif ($modulepart == 'expedition') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/expedition/modules_expedition.php'; $modellist=ModelePDFExpedition::liste_modeles($this->db); } } elseif ($modulepart == 'livraison') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/livraison/modules_livraison.php'; $modellist=ModelePDFDeliveryOrder::liste_modeles($this->db); } } else if ($modulepart == 'ficheinter') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/fichinter/modules_fichinter.php'; $modellist=ModelePDFFicheinter::liste_modeles($this->db); } } elseif ($modulepart == 'facture') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php'; $modellist=ModelePDFFactures::liste_modeles($this->db); } } elseif ($modulepart == 'project') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/project/modules_project.php'; $modellist=ModelePDFProjects::liste_modeles($this->db); } } elseif ($modulepart == 'project_task') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php'; $modellist=ModelePDFTask::liste_modeles($this->db); } } elseif ($modulepart == 'export') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/export/modules_export.php'; $modellist=ModeleExports::liste_modeles($this->db); } } else if ($modulepart == 'commande_fournisseur') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefournisseur.php'; $modellist=ModelePDFSuppliersOrders::liste_modeles($this->db); } } else if ($modulepart == 'facture_fournisseur') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_invoice/modules_facturefournisseur.php'; $modellist=ModelePDFSuppliersInvoices::liste_modeles($this->db); } } else if ($modulepart == 'remisecheque') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/cheque/pdf/modules_chequereceipts.php'; $modellist=ModeleChequeReceipts::liste_modeles($this->db); } } elseif ($modulepart == 'donation') { if (is_array($genallowed)) $modellist=$genallowed; else { include_once DOL_DOCUMENT_ROOT.'/core/modules/dons/modules_don.php'; $modellist=ModeleDon::liste_modeles($this->db); } } else if ($modulepart == 'unpaid') { $modellist=''; } else { // For normalized standard modules $file=dol_buildpath('/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php',0); if (file_exists($file)) { $res=include_once $file; } // For normalized external modules else { $file=dol_buildpath('/'.$modulepart.'/core/modules/'.$modulepart.'/modules_'.$modulepart.'.php',0); $res=include_once $file; } $class='Modele'.ucfirst($modulepart); if (class_exists($class)) { $modellist=call_user_func($class.'::liste_modeles',$this->db); } else { dol_print_error($this->db,'Bad value for modulepart'); return -1; } } $headershown=1; $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 $addcolumforpicto=($delallowed || $printer || $morepicto); $out.= ''; if (!empty($hookmanager->hooks['formfile'])) { foreach($hookmanager->hooks['formfile'] as $module) { if (method_exists($module, 'formBuilddocLineOptions')) $out .= ''; } } $out.= ''; // Execute hooks $parameters=array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''),'modulepart'=>$modulepart); if (is_object($hookmanager)) $out.= $hookmanager->executeHooks('formBuilddocOptions',$parameters,$GLOBALS['object']); } // Get list of files if (! empty($filedir)) { $file_list=dol_dir_list($filedir,'files',0,'','(\.meta|_preview\.png)$','date',SORT_DESC); // Affiche en-tete tableau si non deja affiche if (! empty($file_list) && ! $headershown) { $headershown=1; $out.= '
'.$titletoshow.'
'; $out.= '
'; $out.= ''.$langs->trans('Model').' '; if (is_array($modellist) && count($modellist) == 1) // If there is only one element { $arraykeys=array_keys($modellist); $modelselected=$arraykeys[0]; } $out.= $form->selectarray('model',$modellist,$modelselected,$showempty,0,0); $out.= ''; $out.= $langs->trans("Files"); $out.= ''; if (($allowgenifempty || (is_array($modellist) && count($modellist) > 0)) && $conf->global->MAIN_MULTILANGS && ! $forcenomultilang && (! empty($modellist) || $showempty)) { 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.= ''; $genbutton = 'dol_no_mouse_hover) && $modulepart != 'unpaid') { $langs->load("errors"); $genbutton.= ' '.img_warning($langs->transnoentitiesnoconv("WarningNoDocumentModelActivated")); } if (! $allowgenifempty && ! is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') $genbutton=''; if (empty($modellist) && ! $showempty && $modulepart != 'unpaid') $genbutton=''; $out.= $genbutton; $out.= '
'; } // Loop on each file found if (is_array($file_list)) { foreach($file_list as $file) { $var=!$var; // Define relative path for download link (depends on module) $relativepath=$file["name"]; // Cas general if ($modulesubdir) $relativepath=$modulesubdir."/".$file["name"]; // Cas propal, facture... // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($modulesubdir,2).$file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } $out.= ""; $documenturl = DOL_URL_ROOT.'/document.php'; if (isset($conf->global->DOL_URL_ROOT_DOCUMENT_PHP)) $documenturl=$conf->global->DOL_URL_ROOT_DOCUMENT_PHP; // Show file name with link to download $out.= ''; // Show file size $size=(! empty($file['size'])?$file['size']:dol_filesize($filedir."/".$file["name"])); $out.= ''; // Show file date $date=(! empty($file['date'])?$file['date']:dol_filemtime($filedir."/".$file["name"])); $out.= ''; if ($delallowed || $printer || $morepicto) { $out.= ''; } if ($printer) { //$out.= ''; } if (is_object($hookmanager)) { $parameters=array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''),'modulepart'=>$modulepart,'relativepath'=>$relativepath); $res = $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); if (empty($res)) { $out .= $hookmanager->resPrint; // Complete line $out.= ''; } else $out = $hookmanager->resPrint; // Replace line } } if (count($file_list) == 0 && $headershown) { $out.=''; } $this->numoffiles++; } } if ($headershown) { // Affiche pied du tableau $out.= "
'; $out.= 'trans("File").': '.$file["name"]).' '.dol_trunc($file["name"],$maxfilenamelength); $out.= ''."\n"; $out.= ''.dol_print_size($size).''.dol_print_date($date, 'dayhour', 'tzuser').''; if ($delallowed) { $out.= ''.img_picto($langs->trans("Delete"), 'delete.png').''; //$out.=''; $out.= ' '.img_picto($langs->trans("Print"),'printer.png').''; } if ($morepicto) { $morepicto=preg_replace('/__FILENAMEURLENCODED__/',urlencode($relativepath),$morepicto); $out.=$morepicto; } $out.='
'.$langs->trans("None").'
\n"; if ($genallowed) { if (empty($noform)) $out.= '
'."\n"; } } $out.= ''."\n"; //return ($i?$i:$headershown); return $out; } /** * Show only Document icon with link * * @param string $modulepart propal, facture, facture_fourn, ... * @param string $modulesubdir Sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into subdir of module. * @param string $filedir Directory to scan * @return string Output string with HTML link of documents (might be empty string) */ function getDocumentsLink($modulepart, $modulesubdir, $filedir) { if (! function_exists('dol_dir_list')) include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $out=''; $this->numoffiles=0; $file_list=dol_dir_list($filedir, 'files', 0, preg_quote($modulesubdir.'.pdf','/'), '\.meta$|\.png$'); // For ajax treatment $out.= '
'.img_picto('', 'refresh').'
'."\n"; if (! empty($file_list)) { // Loop on each file found foreach($file_list as $file) { // Define relative path for download link (depends on module) $relativepath=$file["name"]; // Cas general if ($modulesubdir) $relativepath=$modulesubdir."/".$file["name"]; // Cas propal, facture... // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($modulesubdir,2).$file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } // Show file name with link to download $out.= 'numoffiles++; } } return $out; } /** * Show list of documents in a directory * * @param array $filearray Array of files loaded by dol_dir_list('files') function before calling this * @param Object $object Object on which document is linked to * @param string $modulepart Value for modulepart used by download or viewimage wrapper * @param string $param Parameters on sort links (param must start with &, example &aaa=bbb&ccc=ddd) * @param int $forcedownload Force to open dialog box "Save As" when clicking on file * @param string $relativepath Relative path of docs (autodefined if not provided) * @param int $permtodelete Permission to delete * @param int $useinecm Change output for use in ecm module * @param string $textifempty Text to show if filearray is empty ('NoFileFound' if not defined) * @param int $maxlength Maximum length of file name shown * @param string $title Title before list * @param string $url Full url to use for click links ('' = autodetect) * @param int $showrelpart 0=Show only filename (default), 1=Show first level 1 dir * @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,$title='',$url='', $showrelpart=0) { global $user, $conf, $langs, $hookmanager; global $bc; global $sortfield, $sortorder, $maxheightmini; $hookmanager->initHooks(array('formfile')); $parameters=array( 'filearray' => $filearray, 'modulepart'=> $modulepart, 'param' => $param, 'forcedownload' => $forcedownload, 'relativepath' => $relativepath, 'permtodelete' => $permtodelete, 'useinecm' => $useinecm, 'textifempty' => $textifempty, 'maxlength' => $maxlength, 'title' => $title, 'url' => $url ); $reshook=$hookmanager->executeHooks('showFilesList', $parameters, $object); if (isset($reshook) && $reshook != '') // null or '' for bypass { return $reshook; } else { $param = (isset($object->id)?'&id='.$object->id:'').$param; // Show list of existing files if (empty($useinecm)) print_titre($title?$title:$langs->trans("AttachedFiles")); if (empty($url)) $url=$_SERVER["PHP_SELF"]; print ''; print ''; print_liste_field_titre($langs->trans("Documents2"),$url,"name","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Size"),$url,"size","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),$url,"date","",$param,'align="center"',$sortfield,$sortorder); if (empty($useinecm)) print_liste_field_titre('',$url,"","",$param,'align="center"'); print_liste_field_titre('','',''); print ''; $nboffiles=count($filearray); if ($nboffiles > 0) include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; $var=false; foreach($filearray as $key => $file) // filearray must be only files here { if ($file['name'] != '.' && $file['name'] != '..' && ! preg_match('/\.meta$/i',$file['name'])) { // Define relative path used to store the file if (empty($relativepath)) { $relativepath=(! empty($object->ref)?dol_sanitizeFileName($object->ref):'').'/'; if ($object->element == 'invoice_supplier') $relativepath=get_exdir($object->id,2).$relativepath; // TODO Call using a defined value for $relativepath if ($object->element == 'member') $relativepath=get_exdir($object->id,2).$relativepath; // TODO Call using a defined value for $relativepath if ($object->element == 'project_task') $relativepath='Call_not_supported_._Call_function_using_a_defined_relative_path_.'; } $var=!$var; print ''; print '\n"; print ''; print ''; // Preview if (empty($useinecm)) { $fileinfo = pathinfo($file['name']); print ''; } // Delete or view link // ($param must start with &) 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).')').' '; if ($showrelpart == 1) print $relativepath; print dol_trunc($file['name'],$maxlength,'middle'); print ''; print "'.dol_print_size($file['size'],1,1).''.dol_print_date($file['date'],"dayhour","tzuser").''; $minifile=$fileinfo['filename'].'_mini.'.strtolower($fileinfo['extension']); // Thumbs are created with filename in lower case if (image_format_supported($file['name']) > 0) print ''; else print ' '; print ''; if ($useinecm) print ''.img_view().'   '; if ($permtodelete) { /* if ($file['level1name'] <> $object->id) $filepath=$file['level1name'].'/'.$file['name']; else $filepath=$file['name']; */ $useajax=1; if (! empty($conf->dol_use_jmobile)) $useajax=0; if (empty($conf->use_javascript_ajax)) $useajax=0; if (! empty($conf->global->MAIN_ECM_DISABLE_JS)) $useajax=0; print ''.img_delete().''; } else print ' '; print "
'; if (empty($textifempty)) print $langs->trans("NoFileFound"); else print $textifempty; print '
"; return $nboffiles; } } /** * Show list of documents in a directory * * @param string $upload_dir Directory that was scanned * @param array $filearray Array of files loaded by dol_dir_list function before calling this function * @param string $modulepart Value for modulepart used by download wrapper * @param string $param Parameters on sort links * @param int $forcedownload Force to open dialog box "Save As" when clicking on file * @param string $relativepath Relative path of docs (autodefined if not provided) * @param int $permtodelete Permission to delete * @param int $useinecm Change output for use in ecm module * @param int $textifempty Text to show if filearray is empty * @param int $maxlength Maximum length of file name shown * @param string $url Full url to use for click links ('' = autodetect) * @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,$url='') { global $user, $conf, $langs; global $bc; global $sortfield, $sortorder; dol_syslog(get_class($this).'::list_of_autoecmfiles upload_dir='.$upload_dir.' modulepart='.$modulepart); // Show list of documents if (empty($useinecm)) print_titre($langs->trans("AttachedFiles")); if (empty($url)) $url=$_SERVER["PHP_SELF"]; print ''; print ''; $sortref="fullname"; if ($modulepart == 'invoice_supplier') $sortref='level1name'; print_liste_field_titre($langs->trans("Ref"),$url,$sortref,"",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Documents2"),$url,"name","",$param,'align="left"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Size"),$url,"size","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),$url,"date","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre('','',''); print ''; // To show ref or specific information according to view to show (defined by $module) if ($modulepart == 'company') { include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; $object_instance=new Societe($this->db); } else if ($modulepart == 'invoice') { include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; $object_instance=new Facture($this->db); } else if ($modulepart == 'invoice_supplier') { include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; $object_instance=new FactureFournisseur($this->db); } else if ($modulepart == 'propal') { include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; $object_instance=new Propal($this->db); } else if ($modulepart == 'order') { include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; $object_instance=new Commande($this->db); } else if ($modulepart == 'order_supplier') { include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; $object_instance=new CommandeFournisseur($this->db); } else if ($modulepart == 'contract') { include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; $object_instance=new Contrat($this->db); } else if ($modulepart == 'product') { include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; $object_instance=new Product($this->db); } else if ($modulepart == 'tax') { include_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; $object_instance=new ChargeSociales($this->db); } else if ($modulepart == 'project') { include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; $object_instance=new Project($this->db); } else if ($modulepart == 'fichinter') { include_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php'; $object_instance=new Fichinter($this->db); } else if ($modulepart == 'user') { include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; $object_instance=new User($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']); //var_dump($file); $id=0; $ref=''; $label=''; // To show ref or specific information according to view to show (defined by $module) if ($modulepart == 'company') { preg_match('/(\d+)\/[^\/]+$/',$relativefile,$reg); $id=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'invoice') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'invoice_supplier') { preg_match('/([^\/]+)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); if (is_numeric($ref)) { $id=$ref; $ref=''; } } // $ref may be also id with old supplier invoices if ($modulepart == 'propal') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'order') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'order_supplier') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'contract') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'product') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'tax') { preg_match('/(\d+)\/[^\/]+$/',$relativefile,$reg); $id=(isset($reg[1])?$reg[1]:''); } if ($modulepart == 'project') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:'');} if ($modulepart == 'fichinter') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $ref=(isset($reg[1])?$reg[1]:'');} if ($modulepart == 'user') { preg_match('/(.*)\/[^\/]+$/',$relativefile,$reg); $id=(isset($reg[1])?$reg[1]:'');} if (! $id && ! $ref) continue; $found=0; if (! empty($this->cache_objects[$modulepart.'_'.$id.'_'.$ref])) { $found=1; } else { //print 'Fetch '.$id." - ".$ref.'
'; $result=$object_instance->fetch($id,$ref); if ($result > 0) { $found=1; $this->cache_objects[$modulepart.'_'.$id.'_'.$ref]=dol_clone($object_instance); } // Save object into a cache if ($result == 0) { $found=1; $this->cache_objects[$modulepart.'_'.$id.'_'.$ref]='notfound'; unset($filearray[$key]); } } if (! $found > 0 || ! is_object($this->cache_objects[$modulepart.'_'.$id.'_'.$ref])) continue; // We do not show orphelins files $var=!$var; print ''; print ''; print '\n"; print ''; print ''; print '\n"; } } if (count($filearray) == 0) { print ''; } print "
'; if ($found > 0 && is_object($this->cache_objects[$modulepart.'_'.$id.'_'.$ref])) print $this->cache_objects[$modulepart.'_'.$id.'_'.$ref]->getNomUrl(1,'document'); else print $langs->trans("ObjectDeleted",($id?$id:$ref)); 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. * This form use the fileupload.php file. * * @param Object $object Object to use * @return void */ private function _formAjaxFileUpload($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); // Include main include DOL_DOCUMENT_ROOT.'/core/tpl/ajax/fileupload_main.tpl.php'; // Include template include DOL_DOCUMENT_ROOT.'/core/tpl/ajax/fileupload_view.tpl.php'; } /** * Show array with linked files * * @param Object $object Object * @param int $permtodelete Deletion is allowed * @param string $action Action * @param string $selected ??? * @param string $param More param to add into URL * @return int Number of links */ public function listOfLinks($object, $permtodelete=1, $action=null, $selected=null, $param='') { global $user, $conf, $langs, $user; global $bc; global $sortfield, $sortorder; require_once DOL_DOCUMENT_ROOT . '/core/class/link.class.php'; $link = new Link($this->db); $links = array(); if ($sortfield == "name") { $sortfield = "label"; } elseif ($sortfield == "date") { $sortfield = "datea"; } else { $sortfield = null; } $res = $link->fetchAll($links, $object->element, $object->id, $sortfield, $sortorder); $param .= (isset($object->id)?'&id=' . $object->id : ''); // Show list of associated links print_titre($langs->trans("LinkedFiles")); print '
'; print ''; print ''; print_liste_field_titre( $langs->trans("Links"), $_SERVER['PHP_SELF'], "name", "", $param, 'align="left"', $sortfield, $sortorder ); print_liste_field_titre( "", "", "", "", "", 'align="right"' ); print_liste_field_titre( $langs->trans("Date"), $_SERVER['PHP_SELF'], "date", "", $param, 'align="center"', $sortfield, $sortorder ); print_liste_field_titre( '', $_SERVER['PHP_SELF'], "", "", $param, 'align="center"' ); print_liste_field_titre('','',''); print ''; $nboflinks = count($links); if ($nboflinks > 0) include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; $var = true; foreach ($links as $link) { $var =! $var; print ''; //edit mode if ($action == 'update' && $selected === $link->id) { print ''; print ''; print ''; print ''; print ''; } else { print ''."\n"; print ''; print ''; print ''; print ''; } print "\n"; } if ($nboflinks == 0) { print ''; } print "
'; print ''; print ''; print ''; print $langs->trans('Link') . ': '; print ''; print $langs->trans('Label') . ': '; print '' . dol_print_date(dol_now(), "dayhour", "tzuser") . ''; print ''; print ''; print ''; print ''; print $link->label; print ''; print '' . dol_print_date($link->datea, "dayhour", "tzuser") . ''; print '' . img_edit() . ''; // id= is included into $param if ($permtodelete) { print '   ' . img_delete() . ''; // id= is included into $param } else { print ' '; } print '
'; print $langs->trans("NoLinkFound"); print '
"; print '
'; return $nboflinks; } }