dolibarr  x.y.z
html.formfile.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2008-2013 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2010-2014 Regis Houssin <regis.houssin@inodbox.com>
4  * Copyright (C) 2010-2016 Juanjo Menent <jmenent@2byte.es>
5  * Copyright (C) 2013 Charles-Fr BENKE <charles.fr@benke.fr>
6  * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
7  * Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
8  * Copyright (C) 2015 Bahfir Abbes <bafbes@gmail.com>
9  * Copyright (C) 2016-2017 Ferran Marcet <fmarcet@2byte.es>
10  * Copyright (C) 2019-2022 Frédéric France <frederic.france@netlogic.fr>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 3 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program. If not, see <https://www.gnu.org/licenses/>.
24  */
25 
36 class FormFile
37 {
38  private $db;
39 
43  public $error;
44 
45  public $numoffiles;
46  public $infofiles; // Used to return informations by function getDocumentsLink
47 
48 
54  public function __construct($db)
55  {
56  $this->db = $db;
57  $this->numoffiles = 0;
58  }
59 
60 
61  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
86  public function form_attach_new_file($url, $title = '', $addcancel = 0, $sectionid = 0, $perm = 1, $size = 50, $object = '', $options = '', $useajax = 1, $savingdocmask = '', $linkfiles = 1, $htmlname = 'formuserfile', $accept = '', $sectiondir = '', $usewithoutform = 0, $capture = 0, $disablemulti = 0, $nooutput = 0)
87  {
88  // phpcs:enable
89  global $conf, $langs, $hookmanager;
90  $hookmanager->initHooks(array('formfile'));
91 
92  // Deprecation warning
93  if ($useajax == 2) {
94  dol_syslog(__METHOD__.": using 2 for useajax is deprecated and should be not used", LOG_WARNING);
95  }
96 
97  if (!empty($conf->browser->layout) && $conf->browser->layout != 'classic') {
98  $useajax = 0;
99  }
100 
101  if ((!empty($conf->global->MAIN_USE_JQUERY_FILEUPLOAD) && $useajax) || ($useajax == 2)) {
102  // TODO: Check this works with 2 forms on same page
103  // TODO: Check this works with GED module, otherwise, force useajax to 0
104  // TODO: This does not support option savingdocmask
105  // TODO: This break feature to upload links too
106  // TODO: Thisdoes not work when param nooutput=1
107  //return $this->_formAjaxFileUpload($object);
108  return 'Feature too bugged so removed';
109  } else {
110  //If there is no permission and the option to hide unauthorized actions is enabled, then nothing is printed
111  if (!$perm && !empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED)) {
112  if ($nooutput) {
113  return '';
114  } else {
115  return 1;
116  }
117  }
118 
119  $out = "\n\n".'<!-- Start form attach new file --><div class="formattachnewfile">'."\n";
120 
121  if (empty($title)) {
122  $title = $langs->trans("AttachANewFile");
123  }
124  if ($title != 'none') {
125  $out .= load_fiche_titre($title, null, null);
126  }
127 
128  if (empty($usewithoutform)) { // Try to avoid this and set instead the form by the caller.
129  // Add a param as GET parameter to detect when POST were cleaned by PHP because a file larger than post_max_size
130  $url .= (strpos($url, '?') === false ? '?' : '&').'uploadform=1';
131 
132  $out .= '<form name="'.$htmlname.'" id="'.$htmlname.'" action="'.$url.'" enctype="multipart/form-data" method="POST">'."\n";
133  }
134  if (empty($usewithoutform) || $usewithoutform == 2) {
135  $out .= '<input type="hidden" name="token" value="'.newToken().'">'."\n";
136  $out .= '<input type="hidden" id="'.$htmlname.'_section_dir" name="section_dir" value="'.$sectiondir.'">'."\n";
137  $out .= '<input type="hidden" id="'.$htmlname.'_section_id" name="section_id" value="'.$sectionid.'">'."\n";
138  $out .= '<input type="hidden" name="sortfield" value="'.GETPOST('sortfield', 'aZ09comma').'">'."\n";
139  $out .= '<input type="hidden" name="sortorder" value="'.GETPOST('sortorder', 'aZ09comma').'">'."\n";
140  $out .= '<input type="hidden" name="page_y" value="">'."\n";
141  }
142 
143  $out .= '<table class="nobordernopadding centpercent">';
144  $out .= '<tr>';
145 
146  if (!empty($options)) {
147  $out .= '<td>'.$options.'</td>';
148  }
149 
150  $out .= '<td class="valignmiddle nowrap">';
151 
152  $maxfilesizearray = getMaxFileSizeArray();
153  $max = $maxfilesizearray['max'];
154  $maxmin = $maxfilesizearray['maxmin'];
155  $maxphptoshow = $maxfilesizearray['maxphptoshow'];
156  $maxphptoshowparam = $maxfilesizearray['maxphptoshowparam'];
157  if ($maxmin > 0) {
158  $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
159  }
160  $out .= '<input class="flat minwidth400 maxwidth200onsmartphone" type="file"';
161  $out .= ((!empty($conf->global->MAIN_DISABLE_MULTIPLE_FILEUPLOAD) || $disablemulti) ? ' name="userfile"' : ' name="userfile[]" multiple');
162  $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ? ' disabled' : '');
163  $out .= (!empty($accept) ? ' accept="'.$accept.'"' : ' accept=""');
164  $out .= (!empty($capture) ? ' capture="capture"' : '');
165  $out .= '>';
166  $out .= ' ';
167  if ($sectionid) { // Show overwrite if exists for ECM module only
168  $langs->load('link');
169  $out .= '<span class="nowraponsmartphone"><input style="margin-right: 2px;" type="checkbox" id="overwritefile" name="overwritefile" value="1"><label for="overwritefile">'.$langs->trans("OverwriteIfExists").'</label></span>';
170  }
171  $out .= '<input type="submit" class="button small reposition" name="sendit" value="'.$langs->trans("Upload").'"';
172  $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ? ' disabled' : '');
173  $out .= '>';
174 
175  if ($addcancel) {
176  $out .= ' &nbsp; ';
177  $out .= '<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
178  }
179 
180  if (!empty($conf->global->MAIN_UPLOAD_DOC)) {
181  if ($perm) {
182  $menudolibarrsetupmax = $langs->transnoentitiesnoconv("Home").' - '.$langs->transnoentitiesnoconv("Setup").' - '.$langs->transnoentitiesnoconv("Security");
183  $langs->load('other');
184  $out .= ' ';
185  $out .= info_admin($langs->trans("ThisLimitIsDefinedInSetupAt", $menudolibarrsetupmax, $max, $maxphptoshowparam, $maxphptoshow), 1);
186  }
187  } else {
188  $out .= ' ('.$langs->trans("UploadDisabled").')';
189  }
190  $out .= "</td></tr>";
191 
192  if ($savingdocmask) {
193  //add a global variable for disable the auto renaming on upload
194  $rename = (empty($conf->global->MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT) ? 'checked' : '');
195 
196  $out .= '<tr>';
197  if (!empty($options)) {
198  $out .= '<td>'.$options.'</td>';
199  }
200  $out .= '<td valign="middle" class="nowrap">';
201  $out .= '<input type="checkbox" '.$rename.' class="savingdocmask" name="savingdocmask" id="savingdocmask" value="'.dol_escape_js($savingdocmask).'"> ';
202  $out .= '<label class="opacitymedium small" for="savingdocmask">';
203  $out .= $langs->trans("SaveUploadedFileWithMask", preg_replace('/__file__/', $langs->transnoentitiesnoconv("OriginFileName"), $savingdocmask), $langs->transnoentitiesnoconv("OriginFileName"));
204  $out .= '</label>';
205  $out .= '</td>';
206  $out .= '</tr>';
207  }
208 
209  $out .= "</table>";
210 
211  if (empty($usewithoutform)) {
212  $out .= '</form>';
213  if (empty($sectionid)) {
214  $out .= '<br>';
215  }
216  }
217 
218  $out .= "\n</div><!-- End form attach new file -->\n";
219 
220  if ($linkfiles) {
221  $out .= "\n".'<!-- Start form link new url --><div class="formlinknewurl">'."\n";
222  $langs->load('link');
223  $title = $langs->trans("LinkANewFile");
224  $out .= load_fiche_titre($title, null, null);
225 
226  if (empty($usewithoutform)) {
227  $out .= '<form name="'.$htmlname.'_link" id="'.$htmlname.'_link" action="'.$url.'" method="POST">'."\n";
228  $out .= '<input type="hidden" name="token" value="'.newToken().'">'."\n";
229  $out .= '<input type="hidden" id="'.$htmlname.'_link_section_dir" name="link_section_dir" value="">'."\n";
230  $out .= '<input type="hidden" id="'.$htmlname.'_link_section_id" name="link_section_id" value="'.$sectionid.'">'."\n";
231  $out .= '<input type="hidden" name="page_y" value="">'."\n";
232  }
233 
234  $out .= '<div class="valignmiddle">';
235  $out .= '<div class="inline-block" style="padding-right: 10px;">';
236  if (!empty($conf->global->OPTIMIZEFORTEXTBROWSER)) {
237  $out .= '<label for="link">'.$langs->trans("URLToLink").':</label> ';
238  }
239  $out .= '<input type="text" name="link" class="flat minwidth400imp" id="link" placeholder="'.dol_escape_htmltag($langs->trans("URLToLink")).'">';
240  $out .= '</div>';
241  $out .= '<div class="inline-block" style="padding-right: 10px;">';
242  if (!empty($conf->global->OPTIMIZEFORTEXTBROWSER)) {
243  $out .= '<label for="label">'.$langs->trans("Label").':</label> ';
244  }
245  $out .= '<input type="text" class="flat" name="label" id="label" placeholder="'.dol_escape_htmltag($langs->trans("Label")).'">';
246  $out .= '<input type="hidden" name="objecttype" value="'.$object->element.'">';
247  $out .= '<input type="hidden" name="objectid" value="'.$object->id.'">';
248  $out .= '</div>';
249  $out .= '<div class="inline-block" style="padding-right: 10px;">';
250  $out .= '<input type="submit" class="button small reposition" name="linkit" value="'.$langs->trans("ToLink").'"';
251  $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ? ' disabled' : '');
252  $out .= '>';
253  $out .= '</div>';
254  $out .= '</div>';
255  if (empty($usewithoutform)) {
256  $out .= '<div class="clearboth"></div>';
257  $out .= '</form><br>';
258  }
259 
260  $out .= "\n</div><!-- End form link new url -->\n";
261  }
262 
263  $parameters = array('socid'=>(isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id'=>(isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'url'=>$url, 'perm'=>$perm, 'options'=>$options);
264  $res = $hookmanager->executeHooks('formattachOptions', $parameters, $object);
265  if (empty($res)) {
266  $out = '<div class="'.($usewithoutform ? 'inline-block valignmiddle' : 'attacharea attacharea'.$htmlname).'">'.$out.'</div>';
267  }
268  $out .= $hookmanager->resPrint;
269 
270  if ($nooutput) {
271  return $out;
272  } else {
273  print $out;
274  return 1;
275  }
276  }
277  }
278 
279  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
302  public function show_documents($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed = 0, $modelselected = '', $allowgenifempty = 1, $forcenomultilang = 0, $iconPDF = 0, $notused = 0, $noform = 0, $param = '', $title = '', $buttonlabel = '', $codelang = '')
303  {
304  // phpcs:enable
305  $this->numoffiles = 0;
306  print $this->showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed, $modelselected, $allowgenifempty, $forcenomultilang, $iconPDF, $notused, $noform, $param, $title, $buttonlabel, $codelang);
307  return $this->numoffiles;
308  }
309 
337  public function showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed = 0, $modelselected = '', $allowgenifempty = 1, $forcenomultilang = 0, $iconPDF = 0, $notused = 0, $noform = 0, $param = '', $title = '', $buttonlabel = '', $codelang = '', $morepicto = '', $object = null, $hideifempty = 0, $removeaction = 'remove_file', $tooltipontemplatecombo = '')
338  {
339  global $dolibarr_main_url_root;
340 
341  // Deprecation warning
342  if (!empty($iconPDF)) {
343  dol_syslog(__METHOD__.": passing iconPDF parameter is deprecated", LOG_WARNING);
344  }
345 
346  global $langs, $conf, $user, $hookmanager;
347  global $form;
348 
349  $reshook = 0;
350  if (is_object($hookmanager)) {
351  $parameters = array(
352  'modulepart'=>&$modulepart,
353  'modulesubdir'=>&$modulesubdir,
354  'filedir'=>&$filedir,
355  'urlsource'=>&$urlsource,
356  'genallowed'=>&$genallowed,
357  'delallowed'=>&$delallowed,
358  'modelselected'=>&$modelselected,
359  'allowgenifempty'=>&$allowgenifempty,
360  'forcenomultilang'=>&$forcenomultilang,
361  'noform'=>&$noform,
362  'param'=>&$param,
363  'title'=>&$title,
364  'buttonlabel'=>&$buttonlabel,
365  'codelang'=>&$codelang,
366  'morepicto'=>&$morepicto,
367  'hideifempty'=>&$hideifempty,
368  'removeaction'=>&$removeaction
369  );
370  $reshook = $hookmanager->executeHooks('showDocuments', $parameters, $object); // Note that parameters may have been updated by hook
371  // May report error
372  if ($reshook < 0) {
373  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
374  }
375  }
376  // Remode default action if $reskook > 0
377  if ($reshook > 0) {
378  return $hookmanager->resPrint;
379  }
380 
381  if (!is_object($form)) {
382  $form = new Form($this->db);
383  }
384 
385  include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
386 
387  // For backward compatibility
388  if (!empty($iconPDF)) {
389  return $this->getDocumentsLink($modulepart, $modulesubdir, $filedir);
390  }
391 
392  // Add entity in $param if not already exists
393  if (!preg_match('/entity\=[0-9]+/', $param)) {
394  $param .= ($param ? '&' : '').'entity='.(!empty($object->entity) ? $object->entity : $conf->entity);
395  }
396 
397  $printer = 0;
398  // The direct print feature is implemented only for such elements
399  if (in_array($modulepart, array('contract', 'facture', 'supplier_proposal', 'propal', 'proposal', 'order', 'commande', 'expedition', 'commande_fournisseur', 'expensereport', 'delivery', 'ticket'))) {
400  $printer = (!empty($user->rights->printing->read) && !empty($conf->printing->enabled)) ?true:false;
401  }
402 
403  $hookmanager->initHooks(array('formfile'));
404 
405  // Get list of files
406  $file_list = null;
407  if (!empty($filedir)) {
408  $file_list = dol_dir_list($filedir, 'files', 0, '', '(\.meta|_preview.*.*\.png)$', 'date', SORT_DESC);
409  }
410  if ($hideifempty && empty($file_list)) {
411  return '';
412  }
413 
414  $out = '';
415  $forname = 'builddoc';
416  $headershown = 0;
417  $showempty = 0;
418  $i = 0;
419 
420  $out .= "\n".'<!-- Start show_document -->'."\n";
421  //print 'filedir='.$filedir;
422 
423  if (preg_match('/massfilesarea_/', $modulepart)) {
424  $out .= '<div id="show_files"><br></div>'."\n";
425  $title = $langs->trans("MassFilesArea").' <a href="" id="togglemassfilesarea" ref="shown">('.$langs->trans("Hide").')</a>';
426  $title .= '<script>
427  jQuery(document).ready(function() {
428  jQuery(\'#togglemassfilesarea\').click(function() {
429  if (jQuery(\'#togglemassfilesarea\').attr(\'ref\') == "shown")
430  {
431  jQuery(\'#'.$modulepart.'_table\').hide();
432  jQuery(\'#togglemassfilesarea\').attr("ref", "hidden");
433  jQuery(\'#togglemassfilesarea\').text("('.dol_escape_js($langs->trans("Show")).')");
434  }
435  else
436  {
437  jQuery(\'#'.$modulepart.'_table\').show();
438  jQuery(\'#togglemassfilesarea\').attr("ref","shown");
439  jQuery(\'#togglemassfilesarea\').text("('.dol_escape_js($langs->trans("Hide")).')");
440  }
441  return false;
442  });
443  });
444  </script>';
445  }
446 
447  $titletoshow = $langs->trans("Documents");
448  if (!empty($title)) {
449  $titletoshow = ($title == 'none' ? '' : $title);
450  }
451 
452  // Show table
453  if ($genallowed) {
454  $modellist = array();
455 
456  if ($modulepart == 'company') {
457  $showempty = 1; // can have no template active
458  if (is_array($genallowed)) {
459  $modellist = $genallowed;
460  } else {
461  include_once DOL_DOCUMENT_ROOT.'/core/modules/societe/modules_societe.class.php';
462  $modellist = ModeleThirdPartyDoc::liste_modeles($this->db);
463  }
464  } elseif ($modulepart == 'propal') {
465  if (is_array($genallowed)) {
466  $modellist = $genallowed;
467  } else {
468  include_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php';
469  $modellist = ModelePDFPropales::liste_modeles($this->db);
470  }
471  } elseif ($modulepart == 'supplier_proposal') {
472  if (is_array($genallowed)) {
473  $modellist = $genallowed;
474  } else {
475  include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_proposal/modules_supplier_proposal.php';
476  $modellist = ModelePDFSupplierProposal::liste_modeles($this->db);
477  }
478  } elseif ($modulepart == 'commande') {
479  if (is_array($genallowed)) {
480  $modellist = $genallowed;
481  } else {
482  include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
483  $modellist = ModelePDFCommandes::liste_modeles($this->db);
484  }
485  } elseif ($modulepart == 'expedition') {
486  if (is_array($genallowed)) {
487  $modellist = $genallowed;
488  } else {
489  include_once DOL_DOCUMENT_ROOT.'/core/modules/expedition/modules_expedition.php';
490  $modellist = ModelePDFExpedition::liste_modeles($this->db);
491  }
492  } elseif ($modulepart == 'reception') {
493  if (is_array($genallowed)) {
494  $modellist = $genallowed;
495  } else {
496  include_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php';
497  $modellist = ModelePdfReception::liste_modeles($this->db);
498  }
499  } elseif ($modulepart == 'delivery') {
500  if (is_array($genallowed)) {
501  $modellist = $genallowed;
502  } else {
503  include_once DOL_DOCUMENT_ROOT.'/core/modules/delivery/modules_delivery.php';
504  $modellist = ModelePDFDeliveryOrder::liste_modeles($this->db);
505  }
506  } elseif ($modulepart == 'ficheinter') {
507  if (is_array($genallowed)) {
508  $modellist = $genallowed;
509  } else {
510  include_once DOL_DOCUMENT_ROOT.'/core/modules/fichinter/modules_fichinter.php';
511  $modellist = ModelePDFFicheinter::liste_modeles($this->db);
512  }
513  } elseif ($modulepart == 'facture') {
514  if (is_array($genallowed)) {
515  $modellist = $genallowed;
516  } else {
517  include_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php';
518  $modellist = ModelePDFFactures::liste_modeles($this->db);
519  }
520  } elseif ($modulepart == 'contract') {
521  $showempty = 1; // can have no template active
522  if (is_array($genallowed)) {
523  $modellist = $genallowed;
524  } else {
525  include_once DOL_DOCUMENT_ROOT.'/core/modules/contract/modules_contract.php';
526  $modellist = ModelePDFContract::liste_modeles($this->db);
527  }
528  } elseif ($modulepart == 'project') {
529  if (is_array($genallowed)) {
530  $modellist = $genallowed;
531  } else {
532  include_once DOL_DOCUMENT_ROOT.'/core/modules/project/modules_project.php';
533  $modellist = ModelePDFProjects::liste_modeles($this->db);
534  }
535  } elseif ($modulepart == 'project_task') {
536  if (is_array($genallowed)) {
537  $modellist = $genallowed;
538  } else {
539  include_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php';
540  $modellist = ModelePDFTask::liste_modeles($this->db);
541  }
542  } elseif ($modulepart == 'product') {
543  if (is_array($genallowed)) {
544  $modellist = $genallowed;
545  } else {
546  include_once DOL_DOCUMENT_ROOT.'/core/modules/product/modules_product.class.php';
547  $modellist = ModelePDFProduct::liste_modeles($this->db);
548  }
549  } elseif ($modulepart == 'product_batch') {
550  if (is_array($genallowed)) {
551  $modellist = $genallowed;
552  } else {
553  include_once DOL_DOCUMENT_ROOT.'/core/modules/product_batch/modules_product_batch.class.php';
554  $modellist = ModelePDFProductBatch::liste_modeles($this->db);
555  }
556  } elseif ($modulepart == 'stock') {
557  if (is_array($genallowed)) {
558  $modellist = $genallowed;
559  } else {
560  include_once DOL_DOCUMENT_ROOT.'/core/modules/stock/modules_stock.php';
561  $modellist = ModelePDFStock::liste_modeles($this->db);
562  }
563  } elseif ($modulepart == 'movement') {
564  if (is_array($genallowed)) {
565  $modellist = $genallowed;
566  } else {
567  include_once DOL_DOCUMENT_ROOT.'/core/modules/stock/modules_movement.php';
568  $modellist = ModelePDFMovement::liste_modeles($this->db);
569  }
570  } elseif ($modulepart == 'export') {
571  if (is_array($genallowed)) {
572  $modellist = $genallowed;
573  } else {
574  include_once DOL_DOCUMENT_ROOT.'/core/modules/export/modules_export.php';
575  $modellist = ModeleExports::liste_modeles($this->db);
576  }
577  } elseif ($modulepart == 'commande_fournisseur' || $modulepart == 'supplier_order') {
578  if (is_array($genallowed)) {
579  $modellist = $genallowed;
580  } else {
581  include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefournisseur.php';
582  $modellist = ModelePDFSuppliersOrders::liste_modeles($this->db);
583  }
584  } elseif ($modulepart == 'facture_fournisseur' || $modulepart == 'supplier_invoice') {
585  $showempty = 1; // can have no template active
586  if (is_array($genallowed)) {
587  $modellist = $genallowed;
588  } else {
589  include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_invoice/modules_facturefournisseur.php';
590  $modellist = ModelePDFSuppliersInvoices::liste_modeles($this->db);
591  }
592  } elseif ($modulepart == 'supplier_payment') {
593  if (is_array($genallowed)) {
594  $modellist = $genallowed;
595  } else {
596  include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_payment/modules_supplier_payment.php';
597  $modellist = ModelePDFSuppliersPayments::liste_modeles($this->db);
598  }
599  } elseif ($modulepart == 'remisecheque') {
600  if (is_array($genallowed)) {
601  $modellist = $genallowed;
602  } else {
603  include_once DOL_DOCUMENT_ROOT.'/core/modules/cheque/modules_chequereceipts.php';
604  $modellist = ModeleChequeReceipts::liste_modeles($this->db);
605  }
606  } elseif ($modulepart == 'donation') {
607  if (is_array($genallowed)) {
608  $modellist = $genallowed;
609  } else {
610  include_once DOL_DOCUMENT_ROOT.'/core/modules/dons/modules_don.php';
611  $modellist = ModeleDon::liste_modeles($this->db);
612  }
613  } elseif ($modulepart == 'member') {
614  if (is_array($genallowed)) {
615  $modellist = $genallowed;
616  } else {
617  include_once DOL_DOCUMENT_ROOT.'/core/modules/member/modules_cards.php';
618  $modellist = ModelePDFCards::liste_modeles($this->db);
619  }
620  } elseif ($modulepart == 'agenda' || $modulepart == 'actions') {
621  if (is_array($genallowed)) {
622  $modellist = $genallowed;
623  } else {
624  include_once DOL_DOCUMENT_ROOT.'/core/modules/action/modules_action.php';
625  $modellist = ModeleAction::liste_modeles($this->db);
626  }
627  } elseif ($modulepart == 'expensereport') {
628  if (is_array($genallowed)) {
629  $modellist = $genallowed;
630  } else {
631  include_once DOL_DOCUMENT_ROOT.'/core/modules/expensereport/modules_expensereport.php';
632  $modellist = ModeleExpenseReport::liste_modeles($this->db);
633  }
634  } elseif ($modulepart == 'unpaid') {
635  $modellist = '';
636  } elseif ($modulepart == 'user') {
637  if (is_array($genallowed)) {
638  $modellist = $genallowed;
639  } else {
640  include_once DOL_DOCUMENT_ROOT.'/core/modules/user/modules_user.class.php';
641  $modellist = ModelePDFUser::liste_modeles($this->db);
642  }
643  } elseif ($modulepart == 'usergroup') {
644  if (is_array($genallowed)) {
645  $modellist = $genallowed;
646  } else {
647  include_once DOL_DOCUMENT_ROOT.'/core/modules/usergroup/modules_usergroup.class.php';
648  $modellist = ModelePDFUserGroup::liste_modeles($this->db);
649  }
650  } else {
651  $submodulepart = $modulepart;
652 
653  // modulepart = 'nameofmodule' or 'nameofmodule:NameOfObject'
654  $tmp = explode(':', $modulepart);
655  if (!empty($tmp[1])) {
656  $modulepart = $tmp[0];
657  $submodulepart = $tmp[1];
658  }
659 
660  // For normalized standard modules
661  $file = dol_buildpath('/core/modules/'.$modulepart.'/modules_'.strtolower($submodulepart).'.php', 0);
662  if (file_exists($file)) {
663  $res = include_once $file;
664  } else {
665  // For normalized external modules.
666  $file = dol_buildpath('/'.$modulepart.'/core/modules/'.$modulepart.'/modules_'.strtolower($submodulepart).'.php', 0);
667  $res = include_once $file;
668  }
669 
670  $class = 'ModelePDF'.ucfirst($submodulepart);
671 
672  if (class_exists($class)) {
673  $modellist = call_user_func($class.'::liste_modeles', $this->db);
674  } else {
675  dol_print_error($this->db, "Bad value for modulepart '".$modulepart."' in showdocuments (class ".$class." for Doc generation not found)");
676  return -1;
677  }
678  }
679 
680  // Set headershown to avoid to have table opened a second time later
681  $headershown = 1;
682 
683  if (empty($buttonlabel)) {
684  $buttonlabel = $langs->trans('Generate');
685  }
686 
687  if ($conf->browser->layout == 'phone') {
688  $urlsource .= '#'.$forname.'_form'; // So we switch to form after a generation
689  }
690  if (empty($noform)) {
691  $out .= '<form action="'.$urlsource.'" id="'.$forname.'_form" method="post">';
692  }
693  $out .= '<input type="hidden" name="action" value="builddoc">';
694  $out .= '<input type="hidden" name="page_y" value="">';
695  $out .= '<input type="hidden" name="token" value="'.newToken().'">';
696 
697  $out .= load_fiche_titre($titletoshow, '', '');
698  $out .= '<div class="div-table-responsive-no-min">';
699  $out .= '<table class="liste formdoc noborder centpercent">';
700 
701  $out .= '<tr class="liste_titre">';
702 
703  $addcolumforpicto = ($delallowed || $printer || $morepicto);
704  $colspan = (4 + ($addcolumforpicto ? 1 : 0));
705  $colspanmore = 0;
706 
707  $out .= '<th colspan="'.$colspan.'" class="formdoc liste_titre maxwidthonsmartphone center">';
708 
709  // Model
710  if (!empty($modellist)) {
711  asort($modellist);
712  $out .= '<span class="hideonsmartphone">'.$langs->trans('Model').' </span>';
713  if (is_array($modellist) && count($modellist) == 1) { // If there is only one element
714  $arraykeys = array_keys($modellist);
715  $modelselected = $arraykeys[0];
716  }
717  $morecss = 'minwidth75 maxwidth200';
718  if ($conf->browser->layout == 'phone') {
719  $morecss = 'maxwidth100';
720  }
721  $out .= $form->selectarray('model', $modellist, $modelselected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss);
722  if ($conf->use_javascript_ajax) {
723  $out .= ajax_combobox('model');
724  }
725  $out .= $form->textwithpicto('', $tooltipontemplatecombo, 1, 'help', 'marginrightonly', 0, 3, '', 0);
726  } else {
727  $out .= '<div class="float">'.$langs->trans("Files").'</div>';
728  }
729 
730  // Language code (if multilang)
731  if (($allowgenifempty || (is_array($modellist) && count($modellist) > 0)) && getDolGlobalInt('MAIN_MULTILANGS') && !$forcenomultilang && (!empty($modellist) || $showempty)) {
732  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
733  $formadmin = new FormAdmin($this->db);
734  $defaultlang = ($codelang && $codelang != 'auto') ? $codelang : $langs->getDefaultLang();
735  $morecss = 'maxwidth150';
736  if ($conf->browser->layout == 'phone') {
737  $morecss = 'maxwidth100';
738  }
739  $out .= $formadmin->select_language($defaultlang, 'lang_id', 0, null, 0, 0, 0, $morecss);
740  } else {
741  $out .= '&nbsp;';
742  }
743 
744  // Button
745  $genbutton = '<input class="button buttongen reposition nomargintop nomarginbottom" id="'.$forname.'_generatebutton" name="'.$forname.'_generatebutton"';
746  $genbutton .= ' type="submit" value="'.$buttonlabel.'"';
747  if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) {
748  $genbutton .= ' disabled';
749  }
750  $genbutton .= '>';
751  if ($allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') {
752  $langs->load("errors");
753  $genbutton .= ' '.img_warning($langs->transnoentitiesnoconv("WarningNoDocumentModelActivated"));
754  }
755  if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') {
756  $genbutton = '';
757  }
758  if (empty($modellist) && !$showempty && $modulepart != 'unpaid') {
759  $genbutton = '';
760  }
761  $out .= $genbutton;
762  $out .= '</th>';
763 
764  if (!empty($hookmanager->hooks['formfile'])) {
765  foreach ($hookmanager->hooks['formfile'] as $module) {
766  if (method_exists($module, 'formBuilddocLineOptions')) {
767  $colspanmore++;
768  $out .= '<th></th>';
769  }
770  }
771  }
772  $out .= '</tr>';
773 
774  // Execute hooks
775  $parameters = array('colspan'=>($colspan + $colspanmore), 'socid'=>(isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id'=>(isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'modulepart'=>$modulepart);
776  if (is_object($hookmanager)) {
777  $reshook = $hookmanager->executeHooks('formBuilddocOptions', $parameters, $GLOBALS['object']);
778  $out .= $hookmanager->resPrint;
779  }
780  }
781 
782  // Get list of files
783  if (!empty($filedir)) {
784  $link_list = array();
785  if (is_object($object)) {
786  require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
787  $link = new Link($this->db);
788  $sortfield = $sortorder = null;
789  $res = $link->fetchAll($link_list, $object->element, $object->id, $sortfield, $sortorder);
790  }
791 
792  $out .= '<!-- html.formfile::showdocuments -->'."\n";
793 
794  // Show title of array if not already shown
795  if ((!empty($file_list) || !empty($link_list) || preg_match('/^massfilesarea/', $modulepart))
796  && !$headershown) {
797  $headershown = 1;
798  $out .= '<div class="titre">'.$titletoshow.'</div>'."\n";
799  $out .= '<div class="div-table-responsive-no-min">';
800  $out .= '<table class="noborder centpercent" id="'.$modulepart.'_table">'."\n";
801  }
802 
803  // Loop on each file found
804  if (is_array($file_list)) {
805  // Defined relative dir to DOL_DATA_ROOT
806  $relativedir = '';
807  if ($filedir) {
808  $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $filedir);
809  $relativedir = preg_replace('/^[\\/]/', '', $relativedir);
810  }
811 
812  // Get list of files stored into database for same relative directory
813  if ($relativedir) {
814  completeFileArrayWithDatabaseInfo($file_list, $relativedir);
815 
816  //var_dump($sortfield.' - '.$sortorder);
817  if (!empty($sortfield) && !empty($sortorder)) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
818  $file_list = dol_sort_array($file_list, $sortfield, $sortorder);
819  }
820  }
821 
822  foreach ($file_list as $file) {
823  // Define relative path for download link (depends on module)
824  $relativepath = $file["name"]; // Cas general
825  if ($modulesubdir) {
826  $relativepath = $modulesubdir."/".$file["name"]; // Cas propal, facture...
827  }
828  if ($modulepart == 'export') {
829  $relativepath = $file["name"]; // Other case
830  }
831 
832  $out .= '<tr class="oddeven">';
833 
834  $documenturl = DOL_URL_ROOT.'/document.php';
835  if (isset($conf->global->DOL_URL_ROOT_DOCUMENT_PHP)) {
836  $documenturl = $conf->global->DOL_URL_ROOT_DOCUMENT_PHP; // To use another wrapper
837  }
838 
839  // Show file name with link to download
840  $imgpreview = $this->showPreview($file, $modulepart, $relativepath, 0, $param);
841 
842  $out .= '<td class="minwidth200 tdoverflowmax300">';
843  if ($imgpreview) {
844  $out .= '<span class="spanoverflow widthcentpercentminusx valignmiddle">';
845  } else {
846  $out .= '<span class="spanoverflow">';
847  }
848  $out .= '<a class="documentdownload paddingright" href="'.$documenturl.'?modulepart='.$modulepart.'&file='.urlencode($relativepath).($param ? '&'.$param : '').'"';
849 
850  $mime = dol_mimetype($relativepath, '', 0);
851  if (preg_match('/text/', $mime)) {
852  $out .= ' target="_blank" rel="noopener noreferrer"';
853  }
854  $out .= ' title="'.dol_escape_htmltag($file["name"]).'"';
855  $out .= '>';
856  $out .= img_mime($file["name"], $langs->trans("File").': '.$file["name"]);
857  $out .= dol_trunc($file["name"], 150);
858  $out .= '</a>';
859  $out .= '</span>'."\n";
860  $out .= $imgpreview;
861  $out .= '</td>';
862 
863  // Show file size
864  $size = (!empty($file['size']) ? $file['size'] : dol_filesize($filedir."/".$file["name"]));
865  $out .= '<td class="nowraponall right">'.dol_print_size($size, 1, 1).'</td>';
866 
867  // Show file date
868  $date = (!empty($file['date']) ? $file['date'] : dol_filemtime($filedir."/".$file["name"]));
869  $out .= '<td class="nowrap right">'.dol_print_date($date, 'dayhour', 'tzuser').'</td>';
870 
871  // Show share link
872  $out .= '<td class="nowraponall">';
873  if (!empty($file['share'])) {
874  // Define $urlwithroot
875  $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
876  $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
877  //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
878 
879  //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
880  $forcedownload = 0;
881  $paramlink = '';
882  if (!empty($file['share'])) {
883  $paramlink .= ($paramlink ? '&' : '').'hashp='.$file['share']; // Hash for public share
884  }
885  if ($forcedownload) {
886  $paramlink .= ($paramlink ? '&' : '').'attachment=1';
887  }
888 
889  $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
890 
891  $out .= '<a href="'.$fulllink.'" target="_blank" rel="noopener">'.img_picto($langs->trans("FileSharedViaALink"), 'globe').'</a> ';
892  $out .= '<input type="text" class="quatrevingtpercentminusx width75 nopadding small" id="downloadlink'.$file['rowid'].'" name="downloadexternallink" title="'.dol_escape_htmltag($langs->trans("FileSharedViaALink")).'" value="'.dol_escape_htmltag($fulllink).'">';
893  $out .= ajax_autoselect('downloadlink'.$file['rowid']);
894  } else {
895  //print '<span class="opacitymedium">'.$langs->trans("FileNotShared").'</span>';
896  }
897  $out .= '</td>';
898 
899  // Show picto delete, print...
900  if ($delallowed || $printer || $morepicto) {
901  $out .= '<td class="right nowraponall">';
902  if ($delallowed) {
903  $tmpurlsource = preg_replace('/#[a-zA-Z0-9_]*$/', '', $urlsource);
904  $out .= '<a class="reposition" href="'.$tmpurlsource.((strpos($tmpurlsource, '?') === false) ? '?' : '&').'action='.urlencode($removeaction).'&token='.newToken().'&file='.urlencode($relativepath);
905  $out .= ($param ? '&'.$param : '');
906  //$out.= '&modulepart='.$modulepart; // TODO obsolete ?
907  //$out.= '&urlsource='.urlencode($urlsource); // TODO obsolete ?
908  $out .= '">'.img_picto($langs->trans("Delete"), 'delete').'</a>';
909  }
910  if ($printer) {
911  $out .= '<a class="marginleftonly reposition" href="'.$urlsource.(strpos($urlsource, '?') ? '&' : '?').'action=print_file&token='.newToken().'&printer='.urlencode($modulepart).'&file='.urlencode($relativepath);
912  $out .= ($param ? '&'.$param : '');
913  $out .= '">'.img_picto($langs->trans("PrintFile", $relativepath), 'printer.png').'</a>';
914  }
915  if ($morepicto) {
916  $morepicto = preg_replace('/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto);
917  $out .= $morepicto;
918  }
919  $out .= '</td>';
920  }
921 
922  if (is_object($hookmanager)) {
923  $parameters = array('colspan'=>($colspan + $colspanmore), 'socid'=>(isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id'=>(isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'modulepart'=>$modulepart, 'relativepath'=>$relativepath);
924  $res = $hookmanager->executeHooks('formBuilddocLineOptions', $parameters, $file);
925  if (empty($res)) {
926  $out .= $hookmanager->resPrint; // Complete line
927  $out .= '</tr>';
928  } else {
929  $out = $hookmanager->resPrint; // Replace all $out
930  }
931  }
932  }
933 
934  $this->numoffiles++;
935  }
936  // Loop on each link found
937  if (is_array($link_list)) {
938  $colspan = 2;
939 
940  foreach ($link_list as $file) {
941  $out .= '<tr class="oddeven">';
942  $out .= '<td colspan="'.$colspan.'" class="maxwidhtonsmartphone">';
943  $out .= '<a data-ajax="false" href="'.$file->url.'" target="_blank" rel="noopener noreferrer">';
944  $out .= $file->label;
945  $out .= '</a>';
946  $out .= '</td>';
947  $out .= '<td class="right">';
948  $out .= dol_print_date($file->datea, 'dayhour');
949  $out .= '</td>';
950  // for share link of files
951  $out .= '<td></td>';
952  if ($delallowed || $printer || $morepicto) {
953  $out .= '<td></td>';
954  }
955  $out .= '</tr>'."\n";
956  }
957  $this->numoffiles++;
958  }
959 
960  if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
961  $out .= '<tr><td colspan="'.(3 + ($addcolumforpicto ? 1 : 0)).'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>'."\n";
962  }
963  }
964 
965  if ($headershown) {
966  // Affiche pied du tableau
967  $out .= "</table>\n";
968  $out .= "</div>\n";
969  if ($genallowed) {
970  if (empty($noform)) {
971  $out .= '</form>'."\n";
972  }
973  }
974  }
975  $out .= '<!-- End show_document -->'."\n";
976  //return ($i?$i:$headershown);
977  return $out;
978  }
979 
993  public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter = '', $morecss = 'valignmiddle', $allfiles = 0)
994  {
995  global $conf, $langs;
996 
997  include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
998 
999  $out = '';
1000  $this->infofiles = array('nboffiles'=>0, 'extensions'=>array(), 'files'=>array());
1001 
1002  $entity = 1; // Without multicompany
1003 
1004  // Get object entity
1005  if (isModEnabled('multicompany')) {
1006  $regs = array();
1007  preg_match('/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir, '/').'$/', $filedir, $regs);
1008  $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1); // If entity id not found in $filedir this is entity 1 by default
1009  }
1010 
1011  // Get list of files starting with name of ref (Note: files with '^ref\.extension' are generated files, files with '^ref-...' are uploaded files)
1012  if ($allfiles || !empty($conf->global->MAIN_SHOW_ALL_FILES_ON_DOCUMENT_TOOLTIP)) {
1013  $filterforfilesearch = '^'.preg_quote(basename($modulesubdir), '/');
1014  } else {
1015  $filterforfilesearch = '^'.preg_quote(basename($modulesubdir), '/').'\.';
1016  }
1017  $file_list = dol_dir_list($filedir, 'files', 0, $filterforfilesearch, '\.meta$|\.png$'); // We also discard .meta and .png preview
1018 
1019  //var_dump($file_list);
1020  // For ajax treatment
1021  $out .= '<!-- html.formfile::getDocumentsLink -->'."\n";
1022  if (!empty($file_list)) {
1023  $out = '<dl class="dropdown inline-block">
1024  <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto('', 'listlight', '', 0, 0, 0, '', $morecss).'</a></dt>
1025  <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1026  $tmpout = '';
1027 
1028  // Loop on each file found
1029  $found = 0;
1030  $i = 0;
1031  foreach ($file_list as $file) {
1032  $i++;
1033  if ($filter && !preg_match('/'.$filter.'/i', $file["name"])) {
1034  continue; // Discard this. It does not match provided filter.
1035  }
1036 
1037  $found++;
1038  // Define relative path for download link (depends on module)
1039  $relativepath = $file["name"]; // Cas general
1040  if ($modulesubdir) {
1041  $relativepath = $modulesubdir."/".$file["name"]; // Cas propal, facture...
1042  }
1043  // Autre cas
1044  if ($modulepart == 'donation') {
1045  $relativepath = get_exdir($modulesubdir, 2, 0, 0, null, 'donation').$file["name"];
1046  }
1047  if ($modulepart == 'export') {
1048  $relativepath = $file["name"];
1049  }
1050 
1051  $this->infofiles['nboffiles']++;
1052  $this->infofiles['files'][] = $file['fullname'];
1053  $ext = pathinfo($file["name"], PATHINFO_EXTENSION);
1054  if (empty($this->infofiles[$ext])) {
1055  $this->infofiles['extensions'][$ext] = 1;
1056  } else {
1057  $this->infofiles['extensions'][$ext]++;
1058  }
1059 
1060  // Preview
1061  if (!empty($conf->use_javascript_ajax) && ($conf->browser->layout != 'phone')) {
1062  $tmparray = getAdvancedPreviewUrl($modulepart, $relativepath, 1, '&entity='.$entity);
1063  if ($tmparray && $tmparray['url']) {
1064  $tmpout .= '<li><a href="'.$tmparray['url'].'"'.($tmparray['css'] ? ' class="'.$tmparray['css'].'"' : '').($tmparray['mime'] ? ' mime="'.$tmparray['mime'].'"' : '').($tmparray['target'] ? ' target="'.$tmparray['target'].'"' : '').'>';
1065  //$tmpout.= img_picto('','detail');
1066  $tmpout .= '<i class="fa fa-search-plus paddingright" style="color: gray"></i>';
1067  $tmpout .= $langs->trans("Preview").' '.$ext.'</a></li>';
1068  }
1069  }
1070 
1071  // Download
1072  $tmpout .= '<li class="nowrap"><a class="pictopreview nowrap" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&amp;entity='.$entity.'&amp;file='.urlencode($relativepath).'"';
1073  $mime = dol_mimetype($relativepath, '', 0);
1074  if (preg_match('/text/', $mime)) {
1075  $tmpout .= ' target="_blank" rel="noopener noreferrer"';
1076  }
1077  $tmpout .= '>';
1078  $tmpout .= img_mime($relativepath, $file["name"]);
1079  $tmpout .= $langs->trans("Download").' '.$ext;
1080  $tmpout .= '</a></li>'."\n";
1081  }
1082  $out .= $tmpout;
1083  $out .= '</ul></div></dd>
1084  </dl>';
1085 
1086  if (!$found) {
1087  $out = '';
1088  }
1089  } else {
1090  // TODO Add link to regenerate doc ?
1091  //$out.= '<div id="gen_pdf_'.$modulesubdir.'" class="linkobject hideobject">'.img_picto('', 'refresh').'</div>'."\n";
1092  }
1093 
1094  return $out;
1095  }
1096 
1097 
1098  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1132  public function list_of_documents($filearray, $object, $modulepart, $param = '', $forcedownload = 0, $relativepath = '', $permonobject = 1, $useinecm = 0, $textifempty = '', $maxlength = 0, $title = '', $url = '', $showrelpart = 0, $permtoeditline = -1, $upload_dir = '', $sortfield = '', $sortorder = 'ASC', $disablemove = 1, $addfilterfields = 0, $disablecrop = -1, $moreattrondiv = '')
1133  {
1134  // phpcs:enable
1135  global $user, $conf, $langs, $hookmanager, $form;
1136  global $sortfield, $sortorder, $maxheightmini;
1137  global $dolibarr_main_url_root;
1138 
1139  if ($disablecrop == -1) {
1140  $disablecrop = 1;
1141  // Values here must be supported by the photos_resize.php page.
1142  if (in_array($modulepart, array('bank', 'bom', 'expensereport', 'facture', 'facture_fournisseur', 'holiday', 'medias', 'member', 'mrp', 'project', 'product', 'produit', 'propal', 'service', 'societe', 'tax', 'tax-vat', 'ticket', 'user'))) {
1143  $disablecrop = 0;
1144  }
1145  }
1146 
1147  // Define relative path used to store the file
1148  if (empty($relativepath)) {
1149  $relativepath = (!empty($object->ref) ?dol_sanitizeFileName($object->ref) : '').'/';
1150  if (!empty($object->element) && $object->element == 'invoice_supplier') {
1151  $relativepath = get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier').$relativepath; // TODO Call using a defined value for $relativepath
1152  }
1153  if (!empty($object->element) && $object->element == 'project_task') {
1154  $relativepath = 'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1155  }
1156  }
1157  // For backward compatiblity, we detect file stored into an old path
1158  if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO') && $filearray[0]['level1name'] == 'photos') {
1159  $relativepath = preg_replace('/^.*\/produit\//', '', $filearray[0]['path']).'/';
1160  }
1161 
1162  // Defined relative dir to DOL_DATA_ROOT
1163  $relativedir = '';
1164  if ($upload_dir) {
1165  $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $upload_dir);
1166  $relativedir = preg_replace('/^[\\/]/', '', $relativedir);
1167  }
1168  // For example here $upload_dir = '/pathtodocuments/commande/SO2001-123/'
1169  // For example here $upload_dir = '/pathtodocuments/tax/vat/1'
1170 
1171  $hookmanager->initHooks(array('formfile'));
1172  $parameters = array(
1173  'filearray' => $filearray,
1174  'modulepart'=> $modulepart,
1175  'param' => $param,
1176  'forcedownload' => $forcedownload,
1177  'relativepath' => $relativepath, // relative filename to module dir
1178  'relativedir' => $relativedir, // relative dirname to DOL_DATA_ROOT
1179  'permtodelete' => $permonobject,
1180  'useinecm' => $useinecm,
1181  'textifempty' => $textifempty,
1182  'maxlength' => $maxlength,
1183  'title' => $title,
1184  'url' => $url
1185  );
1186  $reshook = $hookmanager->executeHooks('showFilesList', $parameters, $object);
1187 
1188  if (!empty($reshook)) { // null or '' for bypass
1189  return $reshook;
1190  } else {
1191  if (!is_object($form)) {
1192  include_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; // The compoent may be included into ajax page that does not include the Form class
1193  $form = new Form($this->db);
1194  }
1195 
1196  if (!preg_match('/&id=/', $param) && isset($object->id)) {
1197  $param .= '&id='.$object->id;
1198  }
1199  $relativepathwihtoutslashend = preg_replace('/\/$/', '', $relativepath);
1200  if ($relativepathwihtoutslashend) {
1201  $param .= '&file='.urlencode($relativepathwihtoutslashend);
1202  }
1203 
1204  if ($permtoeditline < 0) { // Old behaviour for backward compatibility. New feature should call method with value 0 or 1
1205  $permtoeditline = 0;
1206  if (in_array($modulepart, array('product', 'produit', 'service'))) {
1207  if ($user->rights->produit->creer && $object->type == Product::TYPE_PRODUCT) {
1208  $permtoeditline = 1;
1209  }
1210  if ($user->rights->service->creer && $object->type == Product::TYPE_SERVICE) {
1211  $permtoeditline = 1;
1212  }
1213  }
1214  }
1215  if (empty($conf->global->MAIN_UPLOAD_DOC)) {
1216  $permtoeditline = 0;
1217  $permonobject = 0;
1218  }
1219 
1220  // Show list of existing files
1221  if ((empty($useinecm) || $useinecm == 6) && $title != 'none') {
1222  print load_fiche_titre($title ? $title : $langs->trans("AttachedFiles"), '', 'file-upload', 0, '', 'table-list-of-attached-files');
1223  }
1224  if (empty($url)) {
1225  $url = $_SERVER["PHP_SELF"];
1226  }
1227 
1228  print '<!-- html.formfile::list_of_documents -->'."\n";
1229  if (GETPOST('action', 'aZ09') == 'editfile' && $permtoeditline) {
1230  print '<form action="'.$_SERVER["PHP_SELF"].'?'.$param.'" method="POST">';
1231  print '<input type="hidden" name="token" value="'.newToken().'">';
1232  print '<input type="hidden" name="action" value="renamefile">';
1233  print '<input type="hidden" name="id" value="'.$object->id.'">';
1234  print '<input type="hidden" name="modulepart" value="'.$modulepart.'">';
1235  }
1236 
1237  print '<div class="div-table-responsive-no-min"'.($moreattrondiv ? ' '.$moreattrondiv : '').'>';
1238  print '<table id="tablelines" class="centpercent liste noborder nobottom">'."\n";
1239 
1240  if (!empty($addfilterfields)) {
1241  print '<tr class="liste_titre nodrag nodrop">';
1242  print '<td><input type="search_doc_ref" value="'.dol_escape_htmltag(GETPOST('search_doc_ref', 'alpha')).'"></td>';
1243  print '<td></td>';
1244  print '<td></td>';
1245  if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1246  print '<td></td>';
1247  }
1248  print '<td></td>';
1249  print '<td></td>';
1250  if (empty($disablemove) && count($filearray) > 1) {
1251  print '<td></td>';
1252  }
1253  print "</tr>\n";
1254  }
1255 
1256  // Get list of files stored into database for same relative directory
1257  if ($relativedir) {
1258  completeFileArrayWithDatabaseInfo($filearray, $relativedir);
1259 
1260  //var_dump($sortfield.' - '.$sortorder);
1261  if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
1262  $filearray = dol_sort_array($filearray, $sortfield, $sortorder);
1263  }
1264  }
1265 
1266  print '<tr class="liste_titre nodrag nodrop">';
1267  //print $url.' sortfield='.$sortfield.' sortorder='.$sortorder;
1268  print_liste_field_titre('Documents2', $url, "name", "", $param, '', $sortfield, $sortorder, 'left ');
1269  print_liste_field_titre('Size', $url, "size", "", $param, '', $sortfield, $sortorder, 'right ');
1270  print_liste_field_titre('Date', $url, "date", "", $param, '', $sortfield, $sortorder, 'center ');
1271  if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1272  print_liste_field_titre('', $url, "", "", $param, '', $sortfield, $sortorder, 'center '); // Preview
1273  }
1274  // Shared or not - Hash of file
1276  // Action button
1278  if (empty($disablemove) && count($filearray) > 1) {
1280  }
1281  print "</tr>\n";
1282 
1283  $nboffiles = count($filearray);
1284  if ($nboffiles > 0) {
1285  include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
1286  }
1287 
1288  $i = 0;
1289  $nboflines = 0;
1290  $lastrowid = 0;
1291  foreach ($filearray as $key => $file) { // filearray must be only files here
1292  if ($file['name'] != '.'
1293  && $file['name'] != '..'
1294  && !preg_match('/\.meta$/i', $file['name'])) {
1295  if (array_key_exists('rowid', $filearray[$key]) && $filearray[$key]['rowid'] > 0) {
1296  $lastrowid = $filearray[$key]['rowid'];
1297  }
1298  $filepath = $relativepath.$file['name'];
1299 
1300  $editline = 0;
1301  $nboflines++;
1302  print '<!-- Line list_of_documents '.$key.' relativepath = '.$relativepath.' -->'."\n";
1303  // Do we have entry into database ?
1304 
1305  print '<!-- In database: position='.(array_key_exists('position', $filearray[$key]) ? $filearray[$key]['position'] : 0).' -->'."\n";
1306  print '<tr class="oddeven" id="row-'.((array_key_exists('rowid', $filearray[$key]) && $filearray[$key]['rowid'] > 0) ? $filearray[$key]['rowid'] : 'AFTER'.$lastrowid.'POS'.($i + 1)).'">';
1307 
1308 
1309  // File name
1310  print '<td class="minwith200 tdoverflowmax500">';
1311 
1312  // Show file name with link to download
1313  //print "XX".$file['name']; //$file['name'] must be utf8
1314  print '<a class="paddingright valignmiddle" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart;
1315  if ($forcedownload) {
1316  print '&attachment=1';
1317  }
1318  if (!empty($object->entity)) {
1319  print '&entity='.$object->entity;
1320  }
1321  print '&file='.urlencode($filepath);
1322  print '">';
1323  print img_mime($file['name'], $file['name'].' ('.dol_print_size($file['size'], 0, 0).')', 'inline-block valignmiddle paddingright');
1324  if ($showrelpart == 1) {
1325  print $relativepath;
1326  }
1327  //print dol_trunc($file['name'],$maxlength,'middle');
1328  if (GETPOST('action', 'aZ09') == 'editfile' && $file['name'] == basename(GETPOST('urlfile', 'alpha'))) {
1329  print '</a>';
1330  $section_dir = dirname(GETPOST('urlfile', 'alpha'));
1331  if (!preg_match('/\/$/', $section_dir)) {
1332  $section_dir .= '/';
1333  }
1334  print '<input type="hidden" name="section_dir" value="'.$section_dir.'">';
1335  print '<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file['name']).'">';
1336  print '<input type="text" name="renamefileto" class="quatrevingtpercent" value="'.dol_escape_htmltag($file['name']).'">';
1337  $editline = 1;
1338  } else {
1339  $filenametoshow = preg_replace('/\.noexe$/', '', $file['name']);
1340  print dol_escape_htmltag(dol_trunc($filenametoshow, 200));
1341  print '</a>';
1342  }
1343  // Preview link
1344  if (!$editline) {
1345  print $this->showPreview($file, $modulepart, $filepath, 0, '&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
1346  }
1347 
1348  print "</td>\n";
1349 
1350  // Size
1351  $sizetoshow = dol_print_size($file['size'], 1, 1);
1352  $sizetoshowbytes = dol_print_size($file['size'], 0, 1);
1353  print '<td class="right nowraponall">';
1354  if ($sizetoshow == $sizetoshowbytes) {
1355  print $sizetoshow;
1356  } else {
1357  print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1358  }
1359  print '</td>';
1360 
1361  // Date
1362  print '<td class="center nowraponall">'.dol_print_date($file['date'], "dayhour", "tzuser").'</td>';
1363 
1364  // Preview
1365  if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1366  $fileinfo = pathinfo($file['name']);
1367  print '<td class="center">';
1368  if (image_format_supported($file['name']) >= 0) {
1369  if ($useinecm == 5 || $useinecm == 6) {
1370  $smallfile = getImageFileNameForSize($file['name'], ''); // There is no thumb for ECM module and Media filemanager, so we use true image. TODO Change this it is slow on image dir.
1371  } else {
1372  $smallfile = getImageFileNameForSize($file['name'], '_small'); // For new thumbs using same ext (in lower case however) than original
1373  }
1374  if (!dol_is_file($file['path'].'/'.$smallfile)) {
1375  $smallfile = getImageFileNameForSize($file['name'], '_small', '.png'); // For backward compatibility of old thumbs that were created with filename in lower case and with .png extension
1376  }
1377  //print $file['path'].'/'.$smallfile.'<br>';
1378 
1379  $urlforhref = getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']), 1, '&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
1380  if (empty($urlforhref)) {
1381  $urlforhref = DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).'&file='.urlencode($relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']));
1382  print '<a href="'.$urlforhref.'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1383  } else {
1384  print '<a href="'.$urlforhref['url'].'" class="'.$urlforhref['css'].'" target="'.$urlforhref['target'].'" mime="'.$urlforhref['mime'].'">';
1385  }
1386  print '<img class="photo maxwidth200 shadow valignmiddle" height="'.(($useinecm == 4 || $useinecm == 5 || $useinecm == 6) ? '20' : $maxheightmini).'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).'&file='.urlencode($relativepath.$smallfile).'" title="">';
1387  print '</a>';
1388  } else {
1389  print '&nbsp;';
1390  }
1391  print '</td>';
1392  }
1393 
1394  // Shared or not - Hash of file
1395  print '<td class="center">';
1396  if ($relativedir && $filearray[$key]['rowid'] > 0) { // only if we are in a mode where a scan of dir were done and we have id of file in ECM table
1397  if ($editline) {
1398  print '<label for="idshareenabled'.$key.'">'.$langs->trans("FileSharedViaALink").'</label> ';
1399  print '<input class="inline-block" type="checkbox" id="idshareenabled'.$key.'" name="shareenabled"'.($file['share'] ? ' checked="checked"' : '').' /> ';
1400  } else {
1401  if ($file['share']) {
1402  // Define $urlwithroot
1403  $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
1404  $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
1405  //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
1406 
1407  //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
1408  $forcedownload = 0;
1409  $paramlink = '';
1410  if (!empty($file['share'])) {
1411  $paramlink .= ($paramlink ? '&' : '').'hashp='.$file['share']; // Hash for public share
1412  }
1413  if ($forcedownload) {
1414  $paramlink .= ($paramlink ? '&' : '').'attachment=1';
1415  }
1416 
1417  $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
1418 
1419  print '<a href="'.$fulllink.'" target="_blank" rel="noopener">'.img_picto($langs->trans("FileSharedViaALink"), 'globe').'</a> ';
1420  print '<input type="text" class="quatrevingtpercent minwidth200imp nopadding small" id="downloadlink'.$filearray[$key]['rowid'].'" name="downloadexternallink" title="'.dol_escape_htmltag($langs->trans("FileSharedViaALink")).'" value="'.dol_escape_htmltag($fulllink).'">';
1421  } else {
1422  //print '<span class="opacitymedium">'.$langs->trans("FileNotShared").'</span>';
1423  }
1424  }
1425  }
1426  print '</td>';
1427 
1428  // Actions buttons (1 column or 2 if !disablemove)
1429  if (!$editline) {
1430  // Delete or view link
1431  // ($param must start with &)
1432  print '<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1433  if ($useinecm == 1 || $useinecm == 5) { // ECM manual tree only
1434  // $section is inside $param
1435  $newparam = preg_replace('/&file=.*$/', '', $param); // We don't need param file=
1436  $backtopage = DOL_URL_ROOT.'/ecm/index.php?&section_dir='.urlencode($relativepath).$newparam;
1437  print '<a class="editfielda editfilelink" href="'.DOL_URL_ROOT.'/ecm/file_card.php?urlfile='.urlencode($file['name']).$param.'&backtopage='.urlencode($backtopage).'" rel="'.urlencode($file['name']).'">'.img_edit('default', 0, 'class="paddingrightonly"').'</a>';
1438  }
1439 
1440  if (empty($useinecm) || $useinecm == 2 || $useinecm == 6) { // 6=Media file manager
1441  $newmodulepart = $modulepart;
1442  if (in_array($modulepart, array('product', 'produit', 'service'))) {
1443  $newmodulepart = 'produit|service';
1444  }
1445 
1446  if (!$disablecrop && image_format_supported($file['name']) > 0) {
1447  if ($permtoeditline) {
1448  // Link to resize
1449  $moreparaminurl = '';
1450  if (!empty($object->id) && $object->id > 0) {
1451  $moreparaminurl .= '&id='.$object->id;
1452  } elseif (GETPOST('website', 'alpha')) {
1453  $moreparaminurl .= '&website='.GETPOST('website', 'alpha');
1454  }
1455  // Set the backtourl
1456  if ($modulepart == 'medias' && !GETPOST('website')) {
1457  $moreparaminurl .= '&backtourl='.urlencode(DOL_URL_ROOT.'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.'&section_dir='.$relativepath);
1458  }
1459  //var_dump($moreparaminurl);
1460  print '<a class="editfielda" href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode($newmodulepart).$moreparaminurl.'&file='.urlencode($relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension'])).'" title="'.dol_escape_htmltag($langs->trans("ResizeOrCrop")).'">'.img_picto($langs->trans("ResizeOrCrop"), 'resize', 'class="paddingrightonly"').'</a>';
1461  }
1462  }
1463 
1464  if ($permtoeditline) {
1465  $paramsectiondir = (in_array($modulepart, array('medias', 'ecm')) ? '&section_dir='.urlencode($relativepath) : '');
1466  print '<a class="editfielda reposition editfilelink" href="'.(($useinecm == 1 || $useinecm == 5) ? '#' : ($url.'?action=editfile&token='.newToken().'&urlfile='.urlencode($filepath).$paramsectiondir.$param)).'" rel="'.$filepath.'">'.img_edit('default', 0, 'class="paddingrightonly"').'</a>';
1467  }
1468  }
1469  // Output link to delete file
1470  if ($permonobject) {
1471  $useajax = 1;
1472  if (!empty($conf->dol_use_jmobile)) {
1473  $useajax = 0;
1474  }
1475  if (empty($conf->use_javascript_ajax)) {
1476  $useajax = 0;
1477  }
1478  if (!empty($conf->global->MAIN_ECM_DISABLE_JS)) {
1479  $useajax = 0;
1480  }
1481  print '<a href="'.((($useinecm && $useinecm != 6) && $useajax) ? '#' : ($url.'?action=deletefile&token='.newToken().'&urlfile='.urlencode($filepath).$param)).'" class="reposition deletefilelink" rel="'.$filepath.'">'.img_delete().'</a>';
1482  }
1483  print "</td>";
1484 
1485  if (empty($disablemove) && count($filearray) > 1) {
1486  if ($nboffiles > 1 && $conf->browser->layout != 'phone') {
1487  print '<td class="linecolmove tdlineupdown center">';
1488  if ($i > 0) {
1489  print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=up&rowid='.$object->id.'">'.img_up('default', 0, 'imgupforline').'</a>';
1490  }
1491  if ($i < ($nboffiles - 1)) {
1492  print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=down&rowid='.$object->id.'">'.img_down('default', 0, 'imgdownforline').'</a>';
1493  }
1494  print '</td>';
1495  } else {
1496  print '<td'.(($conf->browser->layout != 'phone') ? ' class="linecolmove tdlineupdown center"' : ' class="linecolmove center"').'>';
1497  print '</td>';
1498  }
1499  }
1500  } else {
1501  print '<td class="right">';
1502  print '<input type="hidden" name="ecmfileid" value="'.$filearray[$key]['rowid'].'">';
1503  print '<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
1504  print '<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
1505  print '</td>';
1506  if (empty($disablemove) && count($filearray) > 1) {
1507  print '<td class="right"></td>';
1508  }
1509  }
1510  print "</tr>\n";
1511 
1512  $i++;
1513  }
1514  }
1515  if ($nboffiles == 0) {
1516  $colspan = '6';
1517  if (empty($disablemove) && count($filearray) > 1) {
1518  $colspan++; // 6 columns or 7
1519  }
1520  print '<tr class="oddeven"><td colspan="'.$colspan.'">';
1521  if (empty($textifempty)) {
1522  print '<span class="opacitymedium">'.$langs->trans("NoFileFound").'</span>';
1523  } else {
1524  print '<span class="opacitymedium">'.$textifempty.'</span>';
1525  }
1526  print '</td></tr>';
1527  }
1528 
1529  print "</table>";
1530  print '</div>';
1531 
1532  if ($nboflines > 1 && is_object($object)) {
1533  if (!empty($conf->use_javascript_ajax) && $permtoeditline) {
1534  $table_element_line = 'ecm_files';
1535  include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
1536  }
1537  }
1538 
1539  print ajax_autoselect('downloadlink');
1540 
1541  if (GETPOST('action', 'aZ09') == 'editfile' && $permtoeditline) {
1542  print '</form>';
1543  }
1544 
1545  return $nboffiles;
1546  }
1547  }
1548 
1549 
1550  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1569  public function list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload = 0, $relativepath = '', $permissiontodelete = 1, $useinecm = 0, $textifempty = '', $maxlength = 0, $url = '', $addfilterfields = 0)
1570  {
1571  // phpcs:enable
1572  global $user, $conf, $langs, $hookmanager, $form;
1573  global $sortfield, $sortorder;
1574  global $search_doc_ref;
1575  global $dolibarr_main_url_root;
1576 
1577  dol_syslog(get_class($this).'::list_of_autoecmfiles upload_dir='.$upload_dir.' modulepart='.$modulepart);
1578 
1579  // Show list of documents
1580  if (empty($useinecm) || $useinecm == 6) {
1581  print load_fiche_titre($langs->trans("AttachedFiles"));
1582  }
1583  if (empty($url)) {
1584  $url = $_SERVER["PHP_SELF"];
1585  }
1586 
1587  if (!empty($addfilterfields)) {
1588  print '<form action="'.$_SERVER['PHP_SELF'].'">';
1589  print '<input type="hidden" name="token" value="'.newToken().'">';
1590  print '<input type="hidden" name="module" value="'.$modulepart.'">';
1591  }
1592 
1593  print '<div class="div-table-responsive-no-min">';
1594  print '<table width="100%" class="noborder">'."\n";
1595 
1596  if (!empty($addfilterfields)) {
1597  print '<tr class="liste_titre nodrag nodrop">';
1598  print '<td class="liste_titre"></td>';
1599  print '<td class="liste_titre"><input type="text" class="maxwidth100onsmartphone" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
1600  print '<td class="liste_titre"></td>';
1601  print '<td class="liste_titre"></td>';
1602  // Action column
1603  print '<td class="liste_titre right">';
1604  $searchpicto = $form->showFilterButtons();
1605  print $searchpicto;
1606  print '</td>';
1607  print "</tr>\n";
1608  }
1609 
1610  print '<tr class="liste_titre">';
1611  $sortref = "fullname";
1612  if ($modulepart == 'invoice_supplier') {
1613  $sortref = 'level1name';
1614  }
1615  print_liste_field_titre("Ref", $url, $sortref, "", $param, '', $sortfield, $sortorder);
1616  print_liste_field_titre("Documents2", $url, "name", "", $param, '', $sortfield, $sortorder);
1617  print_liste_field_titre("Size", $url, "size", "", $param, '', $sortfield, $sortorder, 'right ');
1618  print_liste_field_titre("Date", $url, "date", "", $param, '', $sortfield, $sortorder, 'center ');
1619  print_liste_field_titre("Shared", $url, 'share', '', $param, '', $sortfield, $sortorder, 'right ');
1620  print '</tr>'."\n";
1621 
1622  // To show ref or specific information according to view to show (defined by $module)
1623  $object_instance = null;
1624  if ($modulepart == 'company') {
1625  include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1626  $object_instance = new Societe($this->db);
1627  } elseif ($modulepart == 'invoice') {
1628  include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1629  $object_instance = new Facture($this->db);
1630  } elseif ($modulepart == 'invoice_supplier') {
1631  include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1632  $object_instance = new FactureFournisseur($this->db);
1633  } elseif ($modulepart == 'propal') {
1634  include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
1635  $object_instance = new Propal($this->db);
1636  } elseif ($modulepart == 'supplier_proposal') {
1637  include_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
1638  $object_instance = new SupplierProposal($this->db);
1639  } elseif ($modulepart == 'order') {
1640  include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
1641  $object_instance = new Commande($this->db);
1642  } elseif ($modulepart == 'order_supplier') {
1643  include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
1644  $object_instance = new CommandeFournisseur($this->db);
1645  } elseif ($modulepart == 'contract') {
1646  include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
1647  $object_instance = new Contrat($this->db);
1648  } elseif ($modulepart == 'product') {
1649  include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
1650  $object_instance = new Product($this->db);
1651  } elseif ($modulepart == 'tax') {
1652  include_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
1653  $object_instance = new ChargeSociales($this->db);
1654  } elseif ($modulepart == 'tax-vat') {
1655  include_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
1656  $object_instance = new Tva($this->db);
1657  } elseif ($modulepart == 'salaries') {
1658  include_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
1659  $object_instance = new Salary($this->db);
1660  } elseif ($modulepart == 'project') {
1661  include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
1662  $object_instance = new Project($this->db);
1663  } elseif ($modulepart == 'project_task') {
1664  include_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
1665  $object_instance = new Task($this->db);
1666  } elseif ($modulepart == 'fichinter') {
1667  include_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
1668  $object_instance = new Fichinter($this->db);
1669  } elseif ($modulepart == 'user') {
1670  include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
1671  $object_instance = new User($this->db);
1672  } elseif ($modulepart == 'expensereport') {
1673  include_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1674  $object_instance = new ExpenseReport($this->db);
1675  } elseif ($modulepart == 'holiday') {
1676  include_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
1677  $object_instance = new Holiday($this->db);
1678  } elseif ($modulepart == 'recruitment-recruitmentcandidature') {
1679  include_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentcandidature.class.php';
1680  $object_instance = new RecruitmentCandidature($this->db);
1681  } elseif ($modulepart == 'banque') {
1682  include_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1683  $object_instance = new Account($this->db);
1684  } elseif ($modulepart == 'chequereceipt') {
1685  include_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
1686  $object_instance = new RemiseCheque($this->db);
1687  } elseif ($modulepart == 'mrp-mo') {
1688  include_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
1689  $object_instance = new Mo($this->db);
1690  } else {
1691  $parameters = array('modulepart'=>$modulepart);
1692  $reshook = $hookmanager->executeHooks('addSectionECMAuto', $parameters);
1693  if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
1694  if (array_key_exists('classpath', $hookmanager->resArray) && !empty($hookmanager->resArray['classpath'])) {
1695  dol_include_once($hookmanager->resArray['classpath']);
1696  if (array_key_exists('classname', $hookmanager->resArray) && !empty($hookmanager->resArray['classname'])) {
1697  if (class_exists($hookmanager->resArray['classname'])) {
1698  $tmpclassname = $hookmanager->resArray['classname'];
1699  $object_instance = new $tmpclassname($this->db);
1700  }
1701  }
1702  }
1703  }
1704  }
1705 
1706  //var_dump($filearray);
1707  //var_dump($object_instance);
1708 
1709  // Get list of files stored into database for same relative directory
1710  $relativepathfromroot = preg_replace('/'.preg_quote(DOL_DATA_ROOT.'/', '/').'/', '', $upload_dir);
1711  if ($relativepathfromroot) {
1712  completeFileArrayWithDatabaseInfo($filearray, $relativepathfromroot.'/%');
1713 
1714  //var_dump($sortfield.' - '.$sortorder);
1715  if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
1716  $filearray = dol_sort_array($filearray, $sortfield, $sortorder, 1);
1717  }
1718  }
1719 
1720  //var_dump($filearray);
1721 
1722  foreach ($filearray as $key => $file) {
1723  if (!is_dir($file['name'])
1724  && $file['name'] != '.'
1725  && $file['name'] != '..'
1726  && $file['name'] != 'CVS'
1727  && !preg_match('/\.meta$/i', $file['name'])) {
1728  // Define relative path used to store the file
1729  $relativefile = preg_replace('/'.preg_quote($upload_dir.'/', '/').'/', '', $file['fullname']);
1730 
1731  $id = 0;
1732  $ref = '';
1733 
1734  // To show ref or specific information according to view to show (defined by $modulepart)
1735  // $modulepart can be $object->table_name (that is 'mymodule_myobject') or $object->element.'-'.$module (for compatibility purpose)
1736  $reg = array();
1737  if ($modulepart == 'company' || $modulepart == 'tax' || $modulepart == 'tax-vat' || $modulepart == 'salaries') {
1738  preg_match('/(\d+)\/[^\/]+$/', $relativefile, $reg);
1739  $id = (isset($reg[1]) ? $reg[1] : '');
1740  } elseif ($modulepart == 'invoice_supplier') {
1741  preg_match('/([^\/]+)\/[^\/]+$/', $relativefile, $reg);
1742  $ref = (isset($reg[1]) ? $reg[1] : '');
1743  if (is_numeric($ref)) {
1744  $id = $ref;
1745  $ref = '';
1746  }
1747  } elseif ($modulepart == 'user') {
1748  // $ref may be also id with old supplier invoices
1749  preg_match('/(.*)\/[^\/]+$/', $relativefile, $reg);
1750  $id = (isset($reg[1]) ? $reg[1] : '');
1751  } elseif ($modulepart == 'project_task') {
1752  // $ref of task is the sub-directory of the project
1753  $reg = explode("/", $relativefile);
1754  $ref = (isset($reg[1]) ? $reg[1] : '');
1755  } elseif (in_array($modulepart, array(
1756  'invoice',
1757  'propal',
1758  'supplier_proposal',
1759  'order',
1760  'order_supplier',
1761  'contract',
1762  'product',
1763  'project',
1764  'project_task',
1765  'fichinter',
1766  'expensereport',
1767  'recruitment-recruitmentcandidature',
1768  'mrp-mo',
1769  'banque',
1770  'chequereceipt',
1771  'holiday'))) {
1772  preg_match('/(.*)\/[^\/]+$/', $relativefile, $reg);
1773  $ref = (isset($reg[1]) ? $reg[1] : '');
1774  } else {
1775  $parameters = array('modulepart'=>$modulepart, 'fileinfo'=>$file);
1776  $reshook = $hookmanager->executeHooks('addSectionECMAuto', $parameters);
1777  if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
1778  if (array_key_exists('ref', $hookmanager->resArray) && !empty($hookmanager->resArray['ref'])) {
1779  $ref = $hookmanager->resArray['ref'];
1780  }
1781  if (array_key_exists('id', $hookmanager->resArray) && !empty($hookmanager->resArray['id'])) {
1782  $id = $hookmanager->resArray['id'];
1783  }
1784  }
1785  //print 'Error: Value for modulepart = '.$modulepart.' is not yet implemented in function list_of_autoecmfiles'."\n";
1786  }
1787 
1788  if (!$id && !$ref) {
1789  continue;
1790  }
1791 
1792  $found = 0;
1793  if (!empty($this->cache_objects[$modulepart.'_'.$id.'_'.$ref])) {
1794  $found = 1;
1795  } else {
1796  //print 'Fetch '.$id." - ".$ref.' class='.get_class($object_instance).'<br>';
1797 
1798  $result = 0;
1799  if (is_object($object_instance)) {
1800  $object_instance->id = 0;
1801  $object_instance->ref = '';
1802  if ($id) {
1803  $result = $object_instance->fetch($id);
1804  } else {
1805  if (!($result = $object_instance->fetch('', $ref))) {
1806  //fetchOneLike looks for objects with wildcards in its reference.
1807  //It is useful for those masks who get underscores instead of their actual symbols (because the _ had replaced a forbiddn char)
1808  //fetchOneLike requires some info in the object. If it doesn't have it, then 0 is returned
1809  //that's why we look only into fetchOneLike when fetch returns 0
1810  // TODO Remove this part ?
1811  $result = $object_instance->fetchOneLike($ref);
1812  }
1813  }
1814  }
1815 
1816  if ($result > 0) { // Save object loaded into a cache
1817  $found = 1;
1818  $this->cache_objects[$modulepart.'_'.$id.'_'.$ref] = clone $object_instance;
1819  }
1820  if ($result == 0) {
1821  $found = 1;
1822  $this->cache_objects[$modulepart.'_'.$id.'_'.$ref] = 'notfound';
1823  unset($filearray[$key]);
1824  }
1825  }
1826 
1827  if ($found <= 0 || !is_object($this->cache_objects[$modulepart.'_'.$id.'_'.$ref])) {
1828  continue; // We do not show orphelins files
1829  }
1830 
1831  print '<!-- Line list_of_autoecmfiles key='.$key.' -->'."\n";
1832  print '<tr class="oddeven">';
1833  print '<td>';
1834  if ($found > 0 && is_object($this->cache_objects[$modulepart.'_'.$id.'_'.$ref])) {
1835  $tmpobject = $this->cache_objects[$modulepart.'_'.$id.'_'.$ref];
1836  //if (! in_array($tmpobject->element, array('expensereport'))) {
1837  print $tmpobject->getNomUrl(1, 'document');
1838  //} else {
1839  // print $tmpobject->getNomUrl(1);
1840  //}
1841  } else {
1842  print $langs->trans("ObjectDeleted", ($id ? $id : $ref));
1843  }
1844 
1845  //$modulesubdir=dol_sanitizeFileName($ref);
1846  //$modulesubdir = dirname($relativefile);
1847 
1848  //$filedir=$conf->$modulepart->dir_output . '/' . dol_sanitizeFileName($obj->ref);
1849  //$filedir = $file['path'];
1850  //$urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid;
1851  //print $formfile->getDocumentsLink($modulepart, $filename, $filedir);
1852  print '</td>';
1853 
1854  // File
1855  // Check if document source has external module part, if it the case use it for module part on document.php
1856  print '<td>';
1857  //print "XX".$file['name']; //$file['name'] must be utf8
1858  print '<a href="'.DOL_URL_ROOT.'/document.php?modulepart='.urlencode($modulepart);
1859  if ($forcedownload) {
1860  print '&attachment=1';
1861  }
1862  print '&file='.urlencode($relativefile).'">';
1863  print img_mime($file['name'], $file['name'].' ('.dol_print_size($file['size'], 0, 0).')');
1864  print dol_trunc($file['name'], $maxlength, 'middle');
1865  print '</a>';
1866 
1867  //print $this->getDocumentsLink($modulepart, $modulesubdir, $filedir, '^'.preg_quote($file['name'],'/').'$');
1868 
1869  print $this->showPreview($file, $modulepart, $file['relativename']);
1870 
1871  print "</td>\n";
1872 
1873  // Size
1874  $sizetoshow = dol_print_size($file['size'], 1, 1);
1875  $sizetoshowbytes = dol_print_size($file['size'], 0, 1);
1876  print '<td class="right nowraponall">';
1877  if ($sizetoshow == $sizetoshowbytes) {
1878  print $sizetoshow;
1879  } else {
1880  print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1881  }
1882  print '</td>';
1883 
1884  // Date
1885  print '<td class="center">'.dol_print_date($file['date'], "dayhour").'</td>';
1886 
1887  // Share link
1888  print '<td class="right">';
1889  if (!empty($file['share'])) {
1890  // Define $urlwithroot
1891  $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
1892  $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
1893  //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
1894 
1895  //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
1896  $forcedownload = 0;
1897  $paramlink = '';
1898  if (!empty($file['share'])) {
1899  $paramlink .= ($paramlink ? '&' : '').'hashp='.$file['share']; // Hash for public share
1900  }
1901  if ($forcedownload) {
1902  $paramlink .= ($paramlink ? '&' : '').'attachment=1';
1903  }
1904 
1905  $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
1906 
1907  print img_picto($langs->trans("FileSharedViaALink"), 'globe').' ';
1908  print '<input type="text" class="quatrevingtpercent width100 nopadding nopadding small" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).'">';
1909  }
1910  //if (!empty($useinecm) && $useinecm != 6) print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart;
1911  //if ($forcedownload) print '&attachment=1';
1912  //print '&file='.urlencode($relativefile).'">';
1913  //print img_view().'</a> &nbsp; ';
1914  //if ($permissiontodelete) print '<a href="'.$url.'?id='.$object->id.'&section='.$_REQUEST["section"].'&action=delete&token='.newToken().'&urlfile='.urlencode($file['name']).'">'.img_delete().'</a>';
1915  //else print '&nbsp;';
1916  print "</td>";
1917 
1918  print "</tr>\n";
1919  }
1920  }
1921 
1922  if (count($filearray) == 0) {
1923  print '<tr class="oddeven"><td colspan="5">';
1924  if (empty($textifempty)) {
1925  print '<span class="opacitymedium">'.$langs->trans("NoFileFound").'</span>';
1926  } else {
1927  print '<span class="opacitymedium">'.$textifempty.'</span>';
1928  }
1929  print '</td></tr>';
1930  }
1931  print "</table>";
1932  print '</div>';
1933 
1934  if (!empty($addfilterfields)) {
1935  print '</form>';
1936  }
1937  // Fin de zone
1938  }
1939 
1950  public function listOfLinks($object, $permissiontodelete = 1, $action = null, $selected = null, $param = '')
1951  {
1952  global $user, $conf, $langs, $user;
1953  global $sortfield, $sortorder;
1954 
1955  $langs->load("link");
1956 
1957  require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
1958  $link = new Link($this->db);
1959  $links = array();
1960  if ($sortfield == "name") {
1961  $sortfield = "label";
1962  } elseif ($sortfield == "date") {
1963  $sortfield = "datea";
1964  } else {
1965  $sortfield = null;
1966  }
1967  $res = $link->fetchAll($links, $object->element, $object->id, $sortfield, $sortorder);
1968  $param .= (isset($object->id) ? '&id='.$object->id : '');
1969 
1970  print '<!-- listOfLinks -->'."\n";
1971 
1972  // Show list of associated links
1973  print load_fiche_titre($langs->trans("LinkedFiles"), '', 'link', 0, '', 'table-list-of-links');
1974 
1975  print '<form action="'.$_SERVER['PHP_SELF'].($param ? '?'.$param : '').'" method="POST">';
1976  print '<input type="hidden" name="token" value="'.newToken().'">';
1977 
1978  print '<table class="liste noborder nobottom centpercent">';
1979  print '<tr class="liste_titre">';
1981  $langs->trans("Links"),
1982  $_SERVER['PHP_SELF'],
1983  "name",
1984  "",
1985  $param,
1986  '',
1987  $sortfield,
1988  $sortorder,
1989  ''
1990  );
1992  "",
1993  "",
1994  "",
1995  "",
1996  "",
1997  '',
1998  '',
1999  '',
2000  'right '
2001  );
2003  $langs->trans("Date"),
2004  $_SERVER['PHP_SELF'],
2005  "date",
2006  "",
2007  $param,
2008  '',
2009  $sortfield,
2010  $sortorder,
2011  'center '
2012  );
2014  '',
2015  $_SERVER['PHP_SELF'],
2016  "",
2017  "",
2018  $param,
2019  '',
2020  '',
2021  '',
2022  'center '
2023  );
2024  print_liste_field_titre('', '', '');
2025  print '</tr>';
2026  $nboflinks = count($links);
2027  if ($nboflinks > 0) {
2028  include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
2029  }
2030 
2031  foreach ($links as $link) {
2032  print '<tr class="oddeven">';
2033  //edit mode
2034  if ($action == 'update' && $selected === $link->id) {
2035  print '<td>';
2036  print '<input type="hidden" name="id" value="'.$object->id.'">';
2037  print '<input type="hidden" name="linkid" value="'.$link->id.'">';
2038  print '<input type="hidden" name="action" value="confirm_updateline">';
2039  print $langs->trans('Link').': <input type="text" name="link" value="'.$link->url.'">';
2040  print '</td>';
2041  print '<td>';
2042  print $langs->trans('Label').': <input type="text" name="label" value="'.dol_escape_htmltag($link->label).'">';
2043  print '</td>';
2044  print '<td class="center">'.dol_print_date(dol_now(), "dayhour", "tzuser").'</td>';
2045  print '<td class="right"></td>';
2046  print '<td class="right">';
2047  print '<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
2048  print '<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
2049  print '</td>';
2050  } else {
2051  print '<td>';
2052  print img_picto('', 'globe').' ';
2053  print '<a data-ajax="false" href="'.$link->url.'" target="_blank" rel="noopener noreferrer">';
2054  print dol_escape_htmltag($link->label);
2055  print '</a>';
2056  print '</td>'."\n";
2057  print '<td class="right"></td>';
2058  print '<td class="center">'.dol_print_date($link->datea, "dayhour", "tzuser").'</td>';
2059  print '<td class="center"></td>';
2060  print '<td class="right">';
2061  print '<a href="'.$_SERVER['PHP_SELF'].'?action=update&linkid='.$link->id.$param.'&token='.newToken().'" class="editfilelink editfielda reposition" >'.img_edit().'</a>'; // id= is included into $param
2062  if ($permissiontodelete) {
2063  print ' &nbsp; <a class="deletefilelink reposition" href="'.$_SERVER['PHP_SELF'].'?action=deletelink&token='.newToken().'&linkid='.((int) $link->id).$param.'">'.img_delete().'</a>'; // id= is included into $param
2064  } else {
2065  print '&nbsp;';
2066  }
2067  print '</td>';
2068  }
2069  print "</tr>\n";
2070  }
2071  if ($nboflinks == 0) {
2072  print '<tr class="oddeven"><td colspan="5">';
2073  print '<span class="opacitymedium">'.$langs->trans("NoLinkFound").'</span>';
2074  print '</td></tr>';
2075  }
2076  print "</table>";
2077 
2078  print '</form>';
2079 
2080  return $nboflinks;
2081  }
2082 
2083 
2094  public function showPreview($file, $modulepart, $relativepath, $ruleforpicto = 0, $param = '')
2095  {
2096  global $langs, $conf;
2097 
2098  $out = '';
2099  if ($conf->browser->layout != 'phone' && !empty($conf->use_javascript_ajax)) {
2100  $urladvancedpreview = getAdvancedPreviewUrl($modulepart, $relativepath, 1, $param); // Return if a file is qualified for preview.
2101  if (count($urladvancedpreview)) {
2102  $out .= '<a class="pictopreview '.$urladvancedpreview['css'].'" href="'.$urladvancedpreview['url'].'"'.(empty($urladvancedpreview['mime']) ? '' : ' mime="'.$urladvancedpreview['mime'].'"').' '.(empty($urladvancedpreview['target']) ? '' : ' target="'.$urladvancedpreview['target'].'"').'>';
2103  //$out.= '<a class="pictopreview">';
2104  if (empty($ruleforpicto)) {
2105  //$out.= img_picto($langs->trans('Preview').' '.$file['name'], 'detail');
2106  $out .= '<span class="fa fa-search-plus pictofixedwidth" style="color: gray"></span>';
2107  } else {
2108  $out .= img_mime($relativepath, $langs->trans('Preview').' '.$file['name'], 'pictofixedwidth');
2109  }
2110  $out .= '</a>';
2111  } else {
2112  if ($ruleforpicto < 0) {
2113  $out .= img_picto('', 'generic', '', false, 0, 0, '', 'paddingright pictofixedwidth');
2114  }
2115  }
2116  }
2117  return $out;
2118  }
2119 }
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition: ajax.lib.php:449
Class to manage bank accounts.
Classe permettant la gestion des paiements des charges La tva collectee n'est calculee que sur les fa...
Class to manage predefined suppliers products.
Class to manage customers orders.
Class to manage contracts.
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class to manage interventions.
Class to generate html code for admin pages.
Class to offer components to list and upload files.
form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object='', $options='', $useajax=1, $savingdocmask='', $linkfiles=1, $htmlname='formuserfile', $accept='', $sectiondir='', $usewithoutform=0, $capture=0, $disablemulti=0, $nooutput=0)
Show form to upload a new file.
list_of_documents($filearray, $object, $modulepart, $param='', $forcedownload=0, $relativepath='', $permonobject=1, $useinecm=0, $textifempty='', $maxlength=0, $title='', $url='', $showrelpart=0, $permtoeditline=-1, $upload_dir='', $sortfield='', $sortorder='ASC', $disablemove=1, $addfilterfields=0, $disablecrop=-1, $moreattrondiv='')
Show list of documents in $filearray (may be they are all in same directory but may not) This also sy...
showPreview($file, $modulepart, $relativepath, $ruleforpicto=0, $param='')
Show detail icon with link for preview.
list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload=0, $relativepath='', $permissiontodelete=1, $useinecm=0, $textifempty='', $maxlength=0, $url='', $addfilterfields=0)
Show list of documents in a directory of ECM module.
showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed=0, $modelselected='', $allowgenifempty=1, $forcenomultilang=0, $iconPDF=0, $notused=0, $noform=0, $param='', $title='', $buttonlabel='', $codelang='', $morepicto='', $object=null, $hideifempty=0, $removeaction='remove_file', $tooltipontemplatecombo='')
Return a string to show the box with list of available documents for object.
listOfLinks($object, $permissiontodelete=1, $action=null, $selected=null, $param='')
Show array with linked files.
show_documents($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed=0, $modelselected='', $allowgenifempty=1, $forcenomultilang=0, $iconPDF=0, $notused=0, $noform=0, $param='', $title='', $buttonlabel='', $codelang='')
Show the box with list of available documents for object.
getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter='', $morecss='valignmiddle', $allfiles=0)
Show a Document icon with link(s) You may want to call this into a div like this: print '.
__construct($db)
Constructor.
Class to manage generation of HTML components Only common components must be here.
Class of the module paid holiday.
Class for Mo.
Definition: mo.class.php:36
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Definition: modules_don.php:50
static liste_modeles($db, $maxfilenamelength=0)
Return list of active models generation.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($dbs, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation models.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation models.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation models.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
static liste_modeles($dbs, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class to manage projects.
Class to manage proposals.
Class for RecruitmentCandidature.
Class to manage cheque delivery receipts.
Class to manage salary payments.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage price ask supplier.
Class to manage tasks.
Definition: task.class.php:38
Put here description of your class.
Definition: tva.class.php:36
Class to manage Dolibarr users.
Definition: user.class.php:45
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_filemtime($pathoffile)
Return time of a file.
Definition: files.lib.php:596
dol_filesize($pathoffile)
Return size of a file.
Definition: files.lib.php:584
dol_is_file($pathoffile)
Return if path is a file.
Definition: files.lib.php:480
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:61
completeFileArrayWithDatabaseInfo(&$filearray, $relativedir)
Complete $filearray with data from database.
Definition: files.lib.php:314
dol_print_size($size, $shortvalue=0, $shortunit=0)
Return string with formated size.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_now($mode='auto')
Return date for now.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
Definition: images.lib.php:58
getMaxFileSizeArray()
Return the max allowed for file upload.
$conf db
API class for accounts.
Definition: inc.php:41