dolibarr 23.0.3
html.formfile.class.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (C) 2008-2013 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2010-2014 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2010-2016 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2013 Charles-Fr BENKE <charles.fr@benke.fr>
7 * Copyright (C) 2013 Cédric Salvador <csalvador@gpcsolutions.fr>
8 * Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
9 * Copyright (C) 2015 Bahfir Abbes <bafbes@gmail.com>
10 * Copyright (C) 2016-2017 Ferran Marcet <fmarcet@2byte.es>
11 * Copyright (C) 2019-2025 Frédéric France <frederic.france@free.fr>
12 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
39{
43 private $db;
44
48 public $error;
49
53 public $numoffiles;
57 public $infofiles;
58
59
65 public function __construct($db)
66 {
67 $this->db = $db;
68 $this->numoffiles = 0;
69 }
70
81 public function showImageToEdit(string $htmlname, string $modulepart, string $dirformainimage, string $subdirformainimage, string $fileformainimage)
82 {
83 global $langs;
84
85 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
86 include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
87 include_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
88
89 $tmparraysize = getDefaultImageSizes();
90 $maxwidthsmall = $tmparraysize['maxwidthsmall'];
91 $maxheightsmall = $tmparraysize['maxheightsmall'];
92 $maxwidthmini = $tmparraysize['maxwidthmini'];
93 $maxheightmini = $tmparraysize['maxheightmini'];
94 $quality = $tmparraysize['quality'];
95
96 $imgheight = 80;
97 $imgwidth = 200;
98 $max = 'max-';
99 if ($htmlname == 'logo_squarred') {
100 $imgheight = 80;
101 $imgwidth = 80;
102 $max = '';
103 }
104
105 $maxfilesizearray = getMaxFileSizeArray();
106 $maxmin = $maxfilesizearray['maxmin'];
107 $fileformainimagesmall = getImageFileNameForSize($fileformainimage, '_small'); // This include the "thumbs/..." in path
108 $fileformainimagemini = getImageFileNameForSize($fileformainimage, '_mini'); // This include the "thumbs/..." in path
109
110 $out = '';
111
112 $out .= '<div class="centpercent nobordernopadding valignmiddle"><div class="inline-block marginrightonly">';
113 if ($maxmin > 0) {
114 $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
115 }
116 $out .= '<input type="file" class="flat minwidth100 maxwidthinputfileonsmartphone" name="'.$htmlname.'" id="'.$htmlname.'" accept="image/*">';
117 $out .= '</div>';
118 if (!empty($fileformainimagesmall)) {
119 $out .= '<div class="inline-block valignmiddle marginrightonly">';
120 $out .= '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=remove'.$htmlname.'&token='.newToken().'">'.img_delete($langs->trans("Delete"), '', 'marginleftonly').'</a>';
121 $out .= '</div>';
122 if (file_exists($dirformainimage.'/'.$subdirformainimage.$fileformainimagesmall)) {
123 $out .= '<div class="inline-block valignmiddle marginrightonly">';
124 $out .= '<img id="'.$htmlname.'" style="'.$max.'height: '.$imgheight.'px; '.$max.'width: '.$imgwidth.'px;" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&file='.urlencode($subdirformainimage.$fileformainimagesmall).'">';
125 $out .= '</div>';
126 } elseif (!empty($fileformainimage)) {
127 // Regenerate the thumbs
128 if (!file_exists($dirformainimage.'/'.$subdirformainimage.$fileformainimagemini)) {
129 $imgThumbMini = vignette($dirformainimage.'/'.$subdirformainimage.$fileformainimage, $maxwidthmini, $maxheightmini, '_mini', $quality);
130 }
131 $imgThumbSmall = vignette($dirformainimage.'/'.$subdirformainimage.$fileformainimage, $maxwidthsmall, $maxheightsmall, '_small', $quality);
132 $out .= '<div class="inline-block valignmiddle">';
133 $out .= '<img id="'.$htmlname.'" style="'.$max.'height: '.$imgheight.'px; '.$max.'width: '.$imgwidth.'px;" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&file='.urlencode($subdirformainimage.'thumbs/'.basename($imgThumbSmall)).'">';
134 $out .= '</div>';
135 }
136 } elseif (!empty($fileformainimage)) {
137 if (file_exists($dirformainimage.'/'.$subdirformainimage.$fileformainimage)) {
138 $out .= '<div class="inline-block valignmiddle">';
139 $out .= '<img id="'.$htmlname.'" style="'.$max.'height: '.$imgheight.'px; '.$max.'width: '.$imgwidth.'px;" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&file='.urlencode($subdirformainimage.$fileformainimage).'">';
140 $out .= '</div>';
141 $out .= '<div class="inline-block valignmiddle marginrightonly"><a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=remove'.$htmlname.'&token='.newToken().'">'.img_delete($langs->trans("Delete"), '', 'marginleftonly').'</a></div>';
142 } else {
143 $out .= '<div class="inline-block valignmiddle">';
144 $out .= '<img id="'.$htmlname.'" height="'.$imgheight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="File has been removed from disk">';
145 $out .= '</div>';
146 }
147 }
148 $out .= '</div>';
149
150 return $out;
151 }
152
153 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
178 public function form_attach_new_file($url, $title = '', $addcancel = 0, $sectionid = 0, $perm = 1, $size = 50, $object = null, $options = '', $useajax = 1, $savingdocmask = '', $linkfiles = 1, $htmlname = 'formuserfile', $accept = '', $sectiondir = '', $usewithoutform = 0, $capture = 0, $disablemulti = 0, $nooutput = 0)
179 {
180 // phpcs:enable
181 global $conf, $langs, $hookmanager;
182 $hookmanager->initHooks(array('formfile'));
183
184 // Deprecation warning
185 if ($useajax == 2) {
186 dol_syslog(__METHOD__.": using 2 for useajax is deprecated and should be not used", LOG_WARNING);
187 }
188
189 if (!empty($conf->browser->layout) && $conf->browser->layout != 'classic') {
190 $useajax = 0;
191 }
192
193 //If there is no permission and the option to hide unauthorized actions is enabled, then nothing is printed
194 if (!$perm && getDolGlobalString('MAIN_BUTTON_HIDE_UNAUTHORIZED')) {
195 if ($nooutput) {
196 return '';
197 } else {
198 return 1;
199 }
200 }
201
202 // Section to generate the form to upload a new file
203 $out = "\n".'<!-- Start form attach new file --><div class="formattachnewfile">'."\n";
204
205 if ($nooutput != 2) {
206 if (empty($title)) {
207 $title = $langs->trans("AttachANewFile");
208 }
209 if ($title != 'none') {
210 $out .= load_fiche_titre($title, '', '');
211 }
212 }
213
214 if (empty($usewithoutform)) { // Try to avoid this and set instead the form by the caller.
215 // Add a param as GET parameter to detect when POST were cleaned by PHP because a file larger than post_max_size
216 $url .= (strpos($url, '?') === false ? '?' : '&').'uploadform=1';
217
218 $out .= '<form name="'.$htmlname.'" id="'.$htmlname.'" action="'.$url.'" enctype="multipart/form-data" method="POST">'."\n";
219 }
220 if (empty($usewithoutform) || $usewithoutform == 2) {
221 $out .= '<input type="hidden" name="token" value="'.newToken().'">'."\n";
222 $out .= '<input type="hidden" id="'.$htmlname.'_section_dir" name="section_dir" value="'.$sectiondir.'">'."\n";
223 $out .= '<input type="hidden" id="'.$htmlname.'_section_id" name="section_id" value="'.$sectionid.'">'."\n";
224 $out .= '<input type="hidden" name="sortfield" value="'.GETPOST('sortfield', 'aZ09comma').'">'."\n";
225 $out .= '<input type="hidden" name="sortorder" value="'.GETPOST('sortorder', 'aZ09comma').'">'."\n";
226 $out .= '<input type="hidden" name="page_y" value="">'."\n";
227 }
228
229 $out .= '<table class="nobordernopadding centpercent">';
230 $out .= '<tr>';
231
232 if (!empty($options)) {
233 $out .= '<td>'.$options.'</td>';
234 }
235
236 $out .= '<td class="valignmiddle nowrap">';
237
238 $maxfilesizearray = getMaxFileSizeArray();
239 $max = $maxfilesizearray['max'];
240 $maxmin = $maxfilesizearray['maxmin'];
241 $maxphptoshow = $maxfilesizearray['maxphptoshow'];
242 $maxphptoshowparam = $maxfilesizearray['maxphptoshowparam'];
243 if ($maxmin > 0) {
244 $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
245 }
246 $out .= '<input class="flat minwidth400 maxwidth200onsmartphone" type="file"';
247 $out .= ((getDolGlobalString('MAIN_DISABLE_MULTIPLE_FILEUPLOAD') || $disablemulti) ? ' name="userfile"' : ' name="userfile[]" multiple');
248 $out .= (!getDolGlobalString('MAIN_UPLOAD_DOC') || empty($perm) ? ' disabled' : '');
249 $out .= (!empty($accept) ? ' accept="'.$accept.'"' : ' accept=""');
250 $out .= (!empty($capture) ? ' capture="capture"' : '');
251 $out .= '>';
252 $out .= ' ';
253 if ($sectionid) { // Show overwrite if exists for ECM module only
254 $langs->load('link');
255 $out .= '<span class="nowraponsmartphone"><input style="margin-right: 2px;" type="checkbox" id="overwritefile" name="overwritefile" value="1">';
256 $out .= '<label for="overwritefile" class="opacitylow paddingleft paddingright">'.$langs->trans("OverwriteIfExists").'</label>';
257 $out .= '</span>';
258 }
259 $out .= '<input type="submit" class="button smallpaddingimp reposition" name="sendit" value="'.$langs->trans("Upload").'"';
260 $out .= (!getDolGlobalString('MAIN_UPLOAD_DOC') || empty($perm) ? ' disabled' : '');
261 $out .= '>';
262
263 if ($addcancel) {
264 $out .= ' &nbsp; ';
265 $out .= '<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans("Cancel").'">';
266 }
267
268 if (getDolGlobalString('MAIN_UPLOAD_DOC')) {
269 if ($perm && empty($conf->dol_optimize_smallscreen)) {
270 $langs->load('other');
271
272 $menudolibarrsetupmax = $langs->transnoentitiesnoconv("Home").' - '.$langs->transnoentitiesnoconv("Setup").' - '.$langs->transnoentitiesnoconv("Security");
273
274 $tooltiptext = $langs->trans("ThisLimitIsDefinedInSetupAt", $menudolibarrsetupmax, $max, $maxphptoshowparam, $maxphptoshow);
275 if (getDolGlobalString('MAIN_SAVE_FILE_CONTENT_AS_TEXT')) {
276 $tooltiptext .= '<br><br>Option to extract the file content in text to save it in database is ON <span class="opacitymedium">('.getDolGlobalString('MAIN_SAVE_FILE_CONTENT_AS_TEXT').')</span>';
277 }
278
279 $out .= ' ';
280 $out .= info_admin($tooltiptext, 1, 0, '1', 'classfortooltip');
281 }
282 } else {
283 $out .= ' ('.$langs->trans("UploadDisabled").')';
284 }
285 $out .= "</td></tr>";
286
287 if ($savingdocmask) {
288 //add a global variable for disable the auto renaming on upload
289 $rename = getDolGlobalString('MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT') ? '' : 'checked';
290
291 $out .= '<tr>';
292 if (!empty($options)) {
293 $out .= '<td>'.$options.'</td>';
294 }
295 $out .= '<td valign="middle" class="nowrap">';
296 $out .= '<input type="checkbox" '.$rename.' class="savingdocmask" name="savingdocmask" id="savingdocmask" value="'.dol_escape_js($savingdocmask).'"> ';
297 $out .= '<label class="opacitymedium small" for="savingdocmask">';
298 $out .= $langs->trans("SaveUploadedFileWithMask", preg_replace('/__file__/', $langs->transnoentitiesnoconv("OriginFileName"), $savingdocmask), $langs->transnoentitiesnoconv("OriginFileName"));
299 $out .= '</label>';
300 $out .= '</td>';
301 $out .= '</tr>';
302 }
303
304 $out .= "</table>";
305
306 if (empty($usewithoutform)) {
307 $out .= '</form>';
308 if (empty($sectionid)) {
309 $out .= '<br>';
310 }
311 }
312
313 $parameters = array('socid' => (isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id' => (isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'url' => $url, 'perm' => $perm, 'options' => $options);
314 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable
315 $res = $hookmanager->executeHooks('formattachOptionsUpload', $parameters, $object);
316 if (empty($res)) {
317 $out = '<div class="'.($usewithoutform ? 'inline-block valignmiddle' : (($nooutput == 2 ? '' : 'attacharea ').'attacharea'.$htmlname)).'">'.$out.'</div>';
318 }
319 $out .= $hookmanager->resPrint;
320
321 $out .= "\n</div><!-- End form class=formattachnewfile -->\n";
322
323
324 $out2 = "";
325
326 // Section to generate the form to upload a new file
327 if ($linkfiles) {
328 $out2 .= "\n".'<!-- Start form link new url --><div class="formlinknewurl">'."\n";
329 $langs->load('link');
330
331 if ($nooutput != 2) {
332 $title = $langs->trans("LinkANewFile");
333 $out2 .= load_fiche_titre($title, '', '');
334 }
335
336 if (empty($usewithoutform)) {
337 $out2 .= '<form name="'.$htmlname.'_link" id="'.$htmlname.'_link" action="'.$url.'" method="POST">'."\n";
338 $out2 .= '<input type="hidden" name="token" value="'.newToken().'">'."\n";
339 $out2 .= '<input type="hidden" id="'.$htmlname.'_link_section_dir" name="link_section_dir" value="">'."\n";
340 $out2 .= '<input type="hidden" id="'.$htmlname.'_link_section_id" name="link_section_id" value="'.$sectionid.'">'."\n";
341 $out2 .= '<input type="hidden" name="page_y" value="">'."\n";
342 }
343
344 $out2 .= '<div class="valignmiddle">';
345 $out2 .= '<div class="inline-block" style="padding-right: 10px;">';
346 if (getDolGlobalString('OPTIMIZEFORTEXTBROWSER')) {
347 $out2 .= '<label for="link">'.$langs->trans("URLToLink").':</label> ';
348 }
349 $out2 .= '<input type="text" name="link" class="flat minwidth400imp" id="link" placeholder="'.dol_escape_htmltag($langs->trans("URLToLink")).'">';
350 $out2 .= '</div>';
351 $out2 .= '<div class="inline-block" style="padding-right: 10px;">';
352 if (getDolGlobalString('OPTIMIZEFORTEXTBROWSER')) {
353 $out2 .= '<label for="label">'.$langs->trans("Label").':</label> ';
354 }
355 $out2 .= '<input type="text" class="flat" name="label" id="label" placeholder="'.dol_escape_htmltag($langs->trans("Label")).'">';
356 $out2 .= '<input type="hidden" name="objecttype" value="'.$object->element.'">';
357 $out2 .= '<input type="hidden" name="objectid" value="'.$object->id.'">';
358 $out2 .= '</div>';
359 $out2 .= '<div class="inline-block" style="padding-right: 10px;">';
360 $out2 .= '<input type="submit" class="button smallpaddingimp reposition" name="linkit" value="'.$langs->trans("ToLink").'"';
361 $out2 .= (!getDolGlobalString('MAIN_UPLOAD_DOC') || empty($perm) ? ' disabled' : '');
362 $out2 .= '>';
363 $out2 .= '</div>';
364 $out2 .= '</div>';
365 if (empty($usewithoutform)) {
366 $out2 .= '<div class="clearboth"></div>';
367 $out2 .= '</form><br>';
368 }
369
370 $parameters = array('socid' => (isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id' => (isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'url' => $url, 'perm' => $perm, 'options' => $options);
371 $res = $hookmanager->executeHooks('formattachOptions', $parameters, $object);
372 if (empty($res)) {
373 $out2 = '<div class="'.($usewithoutform ? 'inline-block valignmiddle' : (($nooutput == 2 ? '' : 'attacharea ').$htmlname)).'">'.$out2.'</div>';
374 }
375 $out2 .= $hookmanager->resPrint;
376
377 $out2 .= "\n</div><!-- End form class=formlinknewurl -->\n";
378 }
379
380
381 if ($nooutput == 2) {
382 return array('formToUploadAFile' => $out, 'formToAddALink' => $out2);
383 } elseif ($nooutput) {
384 return $out.$out2;
385 } else {
386 print $out.$out2;
387 return 1;
388 }
389 }
390
391 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
414 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 = '')
415 {
416 // phpcs:enable
417 $this->numoffiles = 0;
418 print $this->showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed, $modelselected, $allowgenifempty, $forcenomultilang, $iconPDF, $notused, $noform, $param, $title, $buttonlabel, $codelang);
419 return $this->numoffiles;
420 }
421
449 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 = '')
450 {
452
453 // Deprecation warning
454 if (!empty($iconPDF)) {
455 dol_syslog(__METHOD__.": passing iconPDF parameter is deprecated", LOG_WARNING);
456 }
457
458 global $langs, $conf, $user, $hookmanager;
459 global $form;
460
461 $reshook = 0;
462 if (is_object($hookmanager)) {
463 $parameters = array(
464 'modulepart' => &$modulepart,
465 'modulesubdir' => &$modulesubdir,
466 'filedir' => &$filedir,
467 'urlsource' => &$urlsource,
468 'genallowed' => &$genallowed,
469 'delallowed' => &$delallowed,
470 'modelselected' => &$modelselected,
471 'allowgenifempty' => &$allowgenifempty,
472 'forcenomultilang' => &$forcenomultilang,
473 'noform' => &$noform,
474 'param' => &$param,
475 'title' => &$title,
476 'buttonlabel' => &$buttonlabel,
477 'codelang' => &$codelang,
478 'morepicto' => &$morepicto,
479 'hideifempty' => &$hideifempty,
480 'removeaction' => &$removeaction
481 );
482 $reshook = $hookmanager->executeHooks('showDocuments', $parameters, $object); // Note that parameters may have been updated by hook
483 // May report error
484 if ($reshook < 0) {
485 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
486 }
487 }
488 // Remode default action if $reskook > 0
489 if ($reshook > 0) {
490 return $hookmanager->resPrint;
491 }
492
493 if (!is_object($form)) {
494 $form = new Form($this->db);
495 }
496
497 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
498
499 // For backward compatibility
500 if (!empty($iconPDF)) {
501 return $this->getDocumentsLink($modulepart, $modulesubdir, $filedir);
502 }
503
504 // Add entity in $param if not already exists
505 if (!preg_match('/entity\=[0-9]+/', $param)) {
506 $param .= ($param ? '&' : '').'entity='.(empty($object->entity) ? $conf->entity : $object->entity);
507 }
508
509 $printer = 0;
510 $supportedmoduleparts = [
511 'company',
512 'member',
513 'product',
514 'stock',
515 'ficheinter',
516 'user',
517 'project',
518 'contract',
519 'facture',
520 'supplier_proposal',
521 'propal',
522 'proposal',
523 'order',
524 'commande',
525 'expedition',
526 'commande_fournisseur',
527 'facture_fournisseur',
528 'expensereport',
529 'delivery',
530 'ticket',
531 'bom',
532 'mrp:mo',
533 ];
534 // The direct print feature is implemented only for such elements
535 if (in_array($modulepart, $supportedmoduleparts)) {
536 $printer = ($user->hasRight('printing', 'read') && isModEnabled('printing'));
537 }
538
539 $hookmanager->initHooks(array('formfile'));
540
541 // Get list of files
542 $file_list = array();
543 if (!empty($filedir)) {
544 $file_list = dol_dir_list($filedir, 'files', 0, '', '(\.meta|_preview.*.*\.png)$', 'date', SORT_DESC);
545 }
546 if ($hideifempty && empty($file_list)) {
547 return '';
548 }
549
550 $out = '';
551 $forname = 'builddoc';
552 $headershown = 0;
553 $showempty = 0;
554 $i = 0;
555
556 $out .= "\n".'<!-- Start show_document -->'."\n";
557
558 if (preg_match('/massfilesarea_/', $modulepart)) {
559 $out .= '<div id="show_files"><br></div>'."\n";
560 $title = $langs->trans("MassFilesArea").' <a href="" id="togglemassfilesarea" ref="shown">('.$langs->trans("Hide").')</a>';
561 $title .= '<script nonce="'.getNonce().'">
562 jQuery(document).ready(function() {
563 jQuery(\'#togglemassfilesarea\').click(function() {
564 if (jQuery(\'#togglemassfilesarea\').attr(\'ref\') == "shown")
565 {
566 jQuery(\'#'.$modulepart.'_table\').hide();
567 jQuery(\'#togglemassfilesarea\').attr("ref", "hidden");
568 jQuery(\'#togglemassfilesarea\').text("('.dol_escape_js($langs->trans("Show")).')");
569 }
570 else
571 {
572 jQuery(\'#'.$modulepart.'_table\').show();
573 jQuery(\'#togglemassfilesarea\').attr("ref","shown");
574 jQuery(\'#togglemassfilesarea\').text("('.dol_escape_js($langs->trans("Hide")).')");
575 }
576 return false;
577 });
578 });
579 </script>';
580 }
581
582 $titletoshow = $langs->trans("Documents");
583 if (!empty($title)) {
584 $titletoshow = ($title == 'none' ? '' : $title);
585 }
586
587 $submodulepart = $modulepart;
588
589 // modulepart = 'nameofmodule' or 'nameofmodule:NameOfObject'
590 $tmp = explode(':', $modulepart);
591 if (!empty($tmp[1])) {
592 $modulepart = $tmp[0];
593 $submodulepart = $tmp[1];
594 }
595
596 $addcolumforpicto = ($delallowed || $printer || $morepicto);
597 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
598 $colspanmore = 0;
599
600 // Show table
601 if ($genallowed) {
602 $modellist = array();
603
604 if ($modulepart == 'company') {
605 $showempty = 1; // can have no template active
606 if (is_array($genallowed)) {
607 $modellist = $genallowed;
608 } else {
609 include_once DOL_DOCUMENT_ROOT.'/core/modules/societe/modules_societe.class.php';
610 $modellist = ModeleThirdPartyDoc::liste_modeles($this->db);
611 }
612 } elseif ($modulepart == 'propal') {
613 if (is_array($genallowed)) {
614 $modellist = $genallowed;
615 } else {
616 include_once DOL_DOCUMENT_ROOT.'/core/modules/propale/modules_propale.php';
617 $modellist = ModelePDFPropales::liste_modeles($this->db);
618 }
619 } elseif ($modulepart == 'supplier_proposal') {
620 if (is_array($genallowed)) {
621 $modellist = $genallowed;
622 } else {
623 include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_proposal/modules_supplier_proposal.php';
624 $modellist = ModelePDFSupplierProposal::liste_modeles($this->db);
625 }
626 } elseif ($modulepart == 'commande') {
627 if (is_array($genallowed)) {
628 $modellist = $genallowed;
629 } else {
630 include_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
631 $modellist = ModelePDFCommandes::liste_modeles($this->db);
632 }
633 } elseif ($modulepart == 'expedition') {
634 if (is_array($genallowed)) {
635 $modellist = $genallowed;
636 } else {
637 include_once DOL_DOCUMENT_ROOT.'/core/modules/expedition/modules_expedition.php';
638 $modellist = ModelePdfExpedition::liste_modeles($this->db);
639 }
640 } elseif ($modulepart == 'reception') {
641 if (is_array($genallowed)) {
642 $modellist = $genallowed;
643 } else {
644 include_once DOL_DOCUMENT_ROOT.'/core/modules/reception/modules_reception.php';
645 $modellist = ModelePdfReception::liste_modeles($this->db);
646 }
647 } elseif ($modulepart == 'delivery') {
648 if (is_array($genallowed)) {
649 $modellist = $genallowed;
650 } else {
651 include_once DOL_DOCUMENT_ROOT.'/core/modules/delivery/modules_delivery.php';
652 $modellist = ModelePDFDeliveryOrder::liste_modeles($this->db);
653 }
654 } elseif ($modulepart == 'ficheinter') {
655 if (is_array($genallowed)) {
656 $modellist = $genallowed;
657 } else {
658 include_once DOL_DOCUMENT_ROOT.'/core/modules/fichinter/modules_fichinter.php';
659 $modellist = ModelePDFFicheinter::liste_modeles($this->db);
660 }
661 } elseif ($modulepart == 'facture') {
662 if (is_array($genallowed)) {
663 $modellist = $genallowed;
664 } else {
665 include_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php';
666 $modellist = ModelePDFFactures::liste_modeles($this->db);
667 }
668 } elseif ($modulepart == 'contract') {
669 $showempty = 1; // can have no template active
670 if (is_array($genallowed)) {
671 $modellist = $genallowed;
672 } else {
673 include_once DOL_DOCUMENT_ROOT.'/core/modules/contract/modules_contract.php';
674 $modellist = ModelePDFContract::liste_modeles($this->db);
675 }
676 } elseif ($modulepart == 'project') {
677 if (is_array($genallowed)) {
678 $modellist = $genallowed;
679 } else {
680 include_once DOL_DOCUMENT_ROOT.'/core/modules/project/modules_project.php';
681 $modellist = ModelePDFProjects::liste_modeles($this->db);
682 }
683 } elseif ($modulepart == 'project_task') {
684 if (is_array($genallowed)) {
685 $modellist = $genallowed;
686 } else {
687 include_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php';
688 $modellist = ModelePDFTask::liste_modeles($this->db);
689 }
690 } elseif ($modulepart == 'product') {
691 if (is_array($genallowed)) {
692 $modellist = $genallowed;
693 } else {
694 include_once DOL_DOCUMENT_ROOT.'/core/modules/product/modules_product.class.php';
695 $modellist = ModelePDFProduct::liste_modeles($this->db);
696 }
697 } elseif ($modulepart == 'product_batch') {
698 if (is_array($genallowed)) {
699 $modellist = $genallowed;
700 } else {
701 include_once DOL_DOCUMENT_ROOT.'/core/modules/product_batch/modules_product_batch.class.php';
702 $modellist = ModelePDFProductBatch::liste_modeles($this->db);
703 }
704 } elseif ($modulepart == 'stock') {
705 if (is_array($genallowed)) {
706 $modellist = $genallowed;
707 } else {
708 include_once DOL_DOCUMENT_ROOT.'/core/modules/stock/modules_stock.php';
709 $modellist = ModelePDFStock::liste_modeles($this->db);
710 }
711 } elseif ($modulepart == 'hrm') {
712 if (is_array($genallowed)) {
713 $modellist = $genallowed;
714 } else {
715 include_once DOL_DOCUMENT_ROOT.'/core/modules/hrm/modules_evaluation.php';
716 $modellist = ModelePDFEvaluation::liste_modeles($this->db);
717 }
718 } elseif ($modulepart == 'movement') {
719 if (is_array($genallowed)) {
720 $modellist = $genallowed;
721 } else {
722 include_once DOL_DOCUMENT_ROOT.'/core/modules/movement/modules_movement.php';
723 $modellist = ModelePDFMovement::liste_modeles($this->db);
724 }
725 } elseif ($modulepart == 'export') {
726 if (is_array($genallowed)) {
727 $modellist = $genallowed;
728 } else {
729 include_once DOL_DOCUMENT_ROOT.'/core/modules/export/modules_export.php';
730 //$modellist = ModeleExports::liste_modeles($this->db); // liste_modeles() does not exists. We are using listOfAvailableExportFormat() method instead that return a different array format.
731 $modellist = array();
732 }
733 } elseif ($modulepart == 'commande_fournisseur' || $modulepart == 'supplier_order') {
734 if (is_array($genallowed)) {
735 $modellist = $genallowed;
736 } else {
737 include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_order/modules_commandefournisseur.php';
738 $modellist = ModelePDFSuppliersOrders::liste_modeles($this->db);
739 }
740 } elseif ($modulepart == 'facture_fournisseur' || $modulepart == 'supplier_invoice') {
741 $showempty = 1; // can have no template active
742 if (is_array($genallowed)) {
743 $modellist = $genallowed;
744 } else {
745 include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_invoice/modules_facturefournisseur.php';
746 $modellist = ModelePDFSuppliersInvoices::liste_modeles($this->db);
747 }
748 } elseif ($modulepart == 'supplier_payment') {
749 if (is_array($genallowed)) {
750 $modellist = $genallowed;
751 } else {
752 include_once DOL_DOCUMENT_ROOT.'/core/modules/supplier_payment/modules_supplier_payment.php';
753 $modellist = ModelePDFSuppliersPayments::liste_modeles($this->db);
754 }
755 } elseif ($modulepart == 'remisecheque') {
756 if (is_array($genallowed)) {
757 $modellist = $genallowed;
758 } else {
759 include_once DOL_DOCUMENT_ROOT.'/core/modules/cheque/modules_chequereceipts.php';
760 $modellist = ModeleChequeReceipts::liste_modeles($this->db);
761 }
762 } elseif ($modulepart == 'donation') {
763 if (is_array($genallowed)) {
764 $modellist = $genallowed;
765 } else {
766 include_once DOL_DOCUMENT_ROOT.'/core/modules/dons/modules_don.php';
767 $modellist = ModeleDon::liste_modeles($this->db);
768 }
769 } elseif ($modulepart == 'member') {
770 if (is_array($genallowed)) {
771 $modellist = $genallowed;
772 } else {
773 include_once DOL_DOCUMENT_ROOT.'/core/modules/member/modules_cards.php';
774 $modellist = ModelePDFCards::liste_modeles($this->db);
775 }
776 } elseif ($modulepart == 'agenda' || $modulepart == 'actions') {
777 if (is_array($genallowed)) {
778 $modellist = $genallowed;
779 } else {
780 include_once DOL_DOCUMENT_ROOT.'/core/modules/action/modules_action.php';
781 $modellist = ModeleAction::liste_modeles($this->db);
782 }
783 } elseif ($modulepart == 'expensereport') {
784 if (is_array($genallowed)) {
785 $modellist = $genallowed;
786 } else {
787 include_once DOL_DOCUMENT_ROOT.'/core/modules/expensereport/modules_expensereport.php';
788 $modellist = ModeleExpenseReport::liste_modeles($this->db);
789 }
790 } elseif ($modulepart == 'unpaid') {
791 $modellist = '';
792 } elseif ($modulepart == 'user') {
793 if (is_array($genallowed)) {
794 $modellist = $genallowed;
795 } else {
796 include_once DOL_DOCUMENT_ROOT.'/core/modules/user/modules_user.class.php';
797 $modellist = ModelePDFUser::liste_modeles($this->db);
798 }
799 } elseif ($modulepart == 'usergroup') {
800 if (is_array($genallowed)) {
801 $modellist = $genallowed;
802 } else {
803 include_once DOL_DOCUMENT_ROOT.'/core/modules/usergroup/modules_usergroup.class.php';
804 $modellist = ModelePDFUserGroup::liste_modeles($this->db);
805 }
806 } else {
807 // For normalized standard modules
808 $file = dol_buildpath('/core/modules/'.$modulepart.'/modules_'.strtolower($submodulepart).'.php', 0);
809
810 if (file_exists($file)) {
811 $res = include_once $file;
812 } else {
813 // For normalized external modules.
814 $file = dol_buildpath('/'.$modulepart.'/core/modules/'.$modulepart.'/modules_'.strtolower($submodulepart).'.php', 0);
815 $res = include_once $file;
816 }
817
818 $class = 'ModelePDF'.ucfirst($submodulepart);
819
820 if (class_exists($class)) {
821 $modellist = call_user_func($class.'::liste_modeles', $this->db);
822 } else {
823 dol_print_error($this->db, "Bad value for modulepart '".$modulepart."' in showdocuments (class ".$class." for Doc generation not found)");
824 return -1;
825 }
826 }
827
828 // Set headershown to avoid to have table opened a second time later
829 $headershown = 1;
830
831 if (empty($buttonlabel)) {
832 $buttonlabel = $langs->trans('Generate');
833 }
834
835 if ($conf->browser->layout == 'phone') {
836 $urlsource .= '#'.$forname.'_form'; // So we switch to form after a generation
837 }
838 if (empty($noform)) {
839 $out .= '<form action="'.$urlsource.'" id="'.$forname.'_form" method="post">';
840 }
841 $out .= '<input type="hidden" name="action" value="builddoc">';
842 $out .= '<input type="hidden" name="page_y" value="">';
843 $out .= '<input type="hidden" name="token" value="'.newToken().'">';
844
845 if ($titletoshow) {
846 $out .= load_fiche_titre($titletoshow, '', '');
847 }
848 $out .= '<div class="div-table-responsive-no-min">';
849 $out .= '<table class="liste formdoc noborder centpercent">';
850
851 $out .= '<tr class="liste_titre">';
852 $addcolumforpicto = ($delallowed || $printer || $morepicto);
853 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
854 $colspanmore = 0;
855
856 $out .= '<th colspan="'.$colspan.'" class="formdoc liste_titre maxwidthonsmartphone center">';
857
858 // Model
859 if (!empty($modellist)) {
860 asort($modellist);
861 $out .= '<span class="hideonsmartphone">'.$langs->trans('Model').' </span>';
862 if (is_array($modellist) && count($modellist) == 1) { // If there is only one element
863 $arraykeys = array_keys($modellist);
864 $modelselected = $arraykeys[0];
865 }
866 $morecss = 'minwidth75 maxwidth200';
867 if ($conf->browser->layout == 'phone') {
868 $morecss = 'maxwidth100';
869 }
870 $out .= $form->selectarray('model', $modellist, $modelselected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1, '', 0, 0);
871 if ($conf->use_javascript_ajax) {
872 $out .= ajax_combobox('model');
873 }
874 $out .= $form->textwithpicto('', $tooltipontemplatecombo, 1, 'help', 'marginrightonly', 0, 3, '', 0);
875 } else {
876 $out .= '<div class="float">'.$langs->trans("Files").'</div>';
877 }
878
879 // Language code (if multilang)
880 if (($allowgenifempty || (is_array($modellist) && count($modellist) > 0)) && getDolGlobalInt('MAIN_MULTILANGS') && !$forcenomultilang && (!empty($modellist) || $showempty)) {
881 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
882 $formadmin = new FormAdmin($this->db);
883 $defaultlang = ($codelang && $codelang != 'auto') ? $codelang : $langs->getDefaultLang();
884 $morecss = 'maxwidth150';
885 if ($conf->browser->layout == 'phone') {
886 $morecss = 'maxwidth100';
887 }
888 $out .= $formadmin->select_language($defaultlang, 'lang_id', 0, array(), 0, 0, 0, $morecss);
889 } else {
890 $out .= '&nbsp;';
891 }
892
893 // Button to generate document
894 $genbutton = '<input class="button buttongen reposition nomargintop nomarginbottom" id="'.$forname.'_generatebutton" name="'.$forname.'_generatebutton"';
895 $genbutton .= ' type="submit" value="'.$buttonlabel.'"';
896 if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) {
897 $genbutton .= ' disabled';
898 }
899 $genbutton .= '>';
900 if ($allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') {
901 $langs->load("errors");
902 $genbutton .= ' '.img_warning($langs->transnoentitiesnoconv("WarningNoDocumentModelActivated"));
903 /*if (empty($modellist)) {
904 $genbutton .= '<input type="hidden" name="model" value="auto">';
905 }*/
906 }
907 if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') {
908 $genbutton = '';
909 }
910 if (empty($modellist) && !$showempty && $modulepart != 'unpaid') {
911 $genbutton = '';
912 }
913 $out .= $genbutton;
914 $out .= '</th>';
915
916 if (!empty($hookmanager->hooks['formfile'])) {
917 foreach ($hookmanager->hooks['formfile'] as $module) {
918 if (method_exists($module, 'formBuilddocLineOptions')) {
919 $colspanmore++;
920 $out .= '<th></th>';
921 }
922 }
923 }
924 $out .= '</tr>';
925
926 // Execute hooks
927 $parameters = array('colspan' => ($colspan + $colspanmore), 'socid' => (isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id' => (isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'modulepart' => $modulepart);
928 if (is_object($hookmanager)) {
929 $reshook = $hookmanager->executeHooks('formBuilddocOptions', $parameters, $GLOBALS['object']);
930 $out .= $hookmanager->resPrint;
931 }
932 }
933
934 // Get list of files
935 if (!empty($filedir)) {
936 $link_list = array();
937 if (is_object($object)) {
938 require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
939 $link = new Link($this->db);
940 $sortfield = $sortorder = '';
941 $res = $link->fetchAll($link_list, $object->element, $object->id, $sortfield, $sortorder);
942 }
943
944 $out .= '<!-- html.formfile::showdocuments -->'."\n";
945
946 // Show title of array if not already shown
947 if ((!empty($file_list) || !empty($link_list) || preg_match('/^massfilesarea/', $modulepart))
948 && !$headershown) {
949 $headershown = 1;
950 $out .= '<div class="titre paddingbottom">'.$titletoshow.'</div>'."\n";
951 $out .= '<div class="div-table-responsive-no-min">';
952 $out .= '<table class="noborder centpercent" id="'.$modulepart.'_table">'."\n";
953 }
954
955 // Loop on each file found
956 if (is_array($file_list)) {
957 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string}> $file_list'; // phan limitations loose typing information with empty() tests, etc. Force again.
958 // Defined relative dir to DOL_DATA_ROOT
959 $relativedir = '';
960 if ($filedir) {
961 $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $filedir);
962 $relativedir = preg_replace('/^[\\/]/', '', $relativedir);
963 }
964
965 // Get list of files stored into database for same relative directory
966 if ($relativedir) {
967 completeFileArrayWithDatabaseInfo($file_list, $relativedir, $object);
968 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $file_list';
969
970 //var_dump($sortfield.' - '.$sortorder);
971 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)
972 $file_list = dol_sort_array($file_list, $sortfield, $sortorder);
973 }
974 }
975
976 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $file_list';
977
978 require_once DOL_DOCUMENT_ROOT . '/ecm/class/ecmfiles.class.php';
979
980 $i = 0;
981 foreach ($file_list as $file) {
982 $i++;
983
984 if (!empty($file['rowid']) && $user->hasRight('ecm', 'read')) {
985 // If we have permission to read ECM files, we can use link for ECM file (not blocked by security test),
986 // so it will show the expended information found into ECM table
987 $ecmfile = new EcmFiles($this->db);
988 $ecmfile->fetch($file['rowid']);
989 } else {
990 // If no permission to read ECM files, popup for ECM extended information will not work so we show a simple link with no popup.
991 $ecmfile = null;
992 }
993
994 // Define relative path for download link (depends on module)
995 $relativepath = (string) $file["name"]; // Cas general
996 if ($modulesubdir) {
997 $relativepath = (string) $modulesubdir."/".$file["name"]; // Cas propal, facture...
998 }
999 if ($modulepart == 'export') {
1000 $relativepath = (string) $file["name"]; // Other case
1001 }
1002
1003 $out .= '<tr class="oddeven'.((!$genallowed && $i == 1) ? ' trfirstline' : '').'">';
1004
1005 $documenturl = getDolGlobalString('DOL_URL_ROOT_DOCUMENT_PHP', DOL_URL_ROOT.'/document.php'); // DOL_URL_ROOT_DOCUMENT_PHP can be used to set another wrapper
1006
1007 // Show file name with link to download
1008 $imgpreview = $this->showPreview($file, $modulepart, $relativepath, 0, $param);
1009 $out .= '<td class="minwidth200 tdoverflowmax300">';
1010 if ($imgpreview) {
1011 $out .= '<span class="spanoverflow widthcentpercentminusx valignmiddle">';
1012 } else {
1013 $out .= '<span class="spanoverflow">';
1014 }
1015 if (getDolGlobalInt('PREVIEW_PICTO_ON_LEFT_OF_NAME')) {
1016 $out .= $imgpreview;
1017 }
1018
1019 if (is_object($ecmfile)) {
1020 $out .= $ecmfile->getNomUrl(1, $modulepart, 0, 0, ' documentdownload'); // We show property in ECM
1021 //$out .= $ecmfile->getNomUrl(1, $modulepart, 0, 0, ' documentdownload', $object); // We show property on object
1022 } else {
1023 $out .= '<a class="documentdownload paddingright" ';
1024 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
1025 $out .= 'target="_blank" ';
1026 }
1027 $out .= 'href="'.$documenturl.'?modulepart='.$modulepart.'&file='.urlencode($relativepath).($param ? '&'.$param : '').'"';
1028 $mime = dol_mimetype($relativepath, '', 0);
1029 if (preg_match('/text/', $mime)) {
1030 $out .= ' target="_blank" rel="noopener noreferrer"';
1031 }
1032 $out .= ' title="'.dol_escape_htmltag($file["name"]).'"';
1033 $out .= '>';
1034 $out .= img_mime($file["name"], $langs->trans("File").': '.$file["name"]);
1035 $out .= dol_trunc($file["name"], 150);
1036 $out .= '</a>';
1037 }
1038
1039 $out .= '</span>'."\n";
1040 if (!getDolGlobalInt('PREVIEW_PICTO_ON_LEFT_OF_NAME')) {
1041 $out .= $imgpreview;
1042 }
1043 $out .= '</td>';
1044
1045
1046 // Show file size
1047 $size = (!empty($file['size']) ? $file['size'] : dol_filesize($filedir."/".$file["name"]));
1048 $out .= '<td class="nowraponall right" title="'.dolPrintHTML($size.' '.$langs->trans("Bytes")).'">'.dol_print_size($size, 1, 1).'</td>';
1049
1050 // Show file date
1051 $date = (!empty($file['date']) ? $file['date'] : dol_filemtime($filedir."/".$file["name"]));
1052 $out .= '<td class="nowrap right">'.dol_print_date($date, 'dayhour', 'tzuser').'</td>';
1053
1054 // Show share link
1055 $out .= '<td class="nowraponall">';
1056 if (!empty($file['share'])) {
1057 // Define $urlwithroot
1058 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
1059 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
1060 //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
1061
1062 //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
1063 $forcedownload = getDolGlobalInt('MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1064 $paramlink = '';
1065 if (!empty($file['share'])) {
1066 $paramlink .= /* ($paramlink ? '&' : ''). */'hashp='.$file['share']; // Hash for public share
1067 }
1068 if ($forcedownload) {
1069 $paramlink .= ($paramlink ? '&' : '').'attachment=1';
1070 }
1071
1072 $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
1073
1074 $out .= '<a href="'.$fulllink.'" target="_blank" rel="noopener">'.img_picto($langs->trans("FileSharedViaALink"), 'globe').'</a> ';
1075 $out .= '<input type="text" class="quatrevingtpercentminusx width75 nopadding small downloadexternallink" id="downloadlink'.$file['rowid'].'" name="downloadexternallink" title="'.dol_escape_htmltag($langs->trans("FileSharedViaALink")).'" value="'.dol_escape_htmltag($fulllink).'" spellcheck="false">';
1076 $out .= ajax_autoselect('downloadlink'.$file['rowid']);
1077 } else {
1078 //print '<span class="opacitymedium">'.$langs->trans("FileNotShared").'</span>';
1079 }
1080 $out .= '</td>';
1081
1082 // Show picto delete, print...
1083 if ($delallowed || $printer || $morepicto) {
1084 $out .= '<td class="right nowraponall">';
1085 if ($delallowed) {
1086 $tmpurlsource = preg_replace('/#[a-zA-Z0-9_]*$/', '', $urlsource);
1087 $out .= '<a class="reposition" href="'.$tmpurlsource.((strpos($tmpurlsource, '?') === false) ? '?' : '&').'action='.urlencode($removeaction).'&token='.newToken().'&file='.urlencode($relativepath);
1088 $out .= ($param ? '&'.$param : '');
1089 //$out.= '&modulepart='.$modulepart; // TODO obsolete ?
1090 //$out.= '&urlsource='.urlencode($urlsource); // TODO obsolete ?
1091 $out .= '">'.img_picto($langs->trans("Delete"), 'delete').'</a>';
1092 }
1093 if ($printer) {
1094 $out .= '<a class="marginleftonly reposition" href="'.$urlsource.(strpos($urlsource, '?') ? '&' : '?').'action=print_file&token='.newToken().'&printer='.urlencode($modulepart).'&file='.urlencode($relativepath);
1095 $out .= ($param ? '&'.$param : '');
1096 $out .= '">'.img_picto($langs->trans("PrintFile", $relativepath), 'printer').'</a>';
1097 }
1098 if ($morepicto) {
1099 $morepicto = preg_replace('/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto);
1100 $out .= $morepicto;
1101 }
1102 $out .= '</td>';
1103 }
1104
1105 if (is_object($hookmanager)) {
1106 $addcolumforpicto = ($delallowed || $printer || $morepicto);
1107 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
1108 $colspanmore = 0;
1109 $parameters = array('colspan' => ($colspan + $colspanmore), 'socid' => (isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id' => (isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'modulepart' => $modulepart, 'relativepath' => $relativepath);
1110 $res = $hookmanager->executeHooks('formBuilddocLineOptions', $parameters, $file);
1111 if (empty($res)) {
1112 $out .= $hookmanager->resPrint; // Complete line
1113 $out .= '</tr>';
1114 } else {
1115 $out = $hookmanager->resPrint; // Replace all $out
1116 }
1117 }
1118 }
1119
1120 $this->numoffiles++;
1121 }
1122 // Loop on each link found
1123 if (is_array($link_list)) {
1124 $colspan = 2;
1125
1126 foreach ($link_list as $file) {
1127 $out .= '<tr class="oddeven">';
1128 $out .= '<td colspan="'.$colspan.'" class="maxwidhtonsmartphone">';
1129 $out .= '<a data-ajax="false" href="'.$file->url.'" target="_blank" rel="noopener noreferrer">';
1130 $out .= $file->label;
1131 $out .= '</a>';
1132 $out .= '</td>';
1133 $out .= '<td class="right">';
1134 $out .= dol_print_date($file->datea, 'dayhour');
1135 $out .= '</td>';
1136 // for share link of files
1137 $out .= '<td></td>';
1138 if ($delallowed || $printer || $morepicto) {
1139 $out .= '<td></td>';
1140 }
1141 $out .= '</tr>'."\n";
1142 }
1143 $this->numoffiles++;
1144 }
1145
1146 if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
1147 $out .= '<tr><td colspan="'.(3 + ($addcolumforpicto ? 1 : 0)).'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>'."\n";
1148 }
1149 }
1150
1151 if ($headershown) {
1152 // Affiche pied du tableau
1153 $out .= "</table>\n";
1154 $out .= "</div>\n";
1155 if ($genallowed) {
1156 if (empty($noform)) {
1157 $out .= '</form>'."\n";
1158 }
1159 }
1160 }
1161 $out .= '<!-- End show_document -->'."\n";
1162
1163 $out .= '<script>
1164 jQuery(document).ready(function() {
1165 var selectedValue = $(".selectformat").val();
1166
1167 if (selectedValue === "excel2007" || selectedValue === "tsv") {
1168 $(".forhide").prop("disabled", true).hide();
1169 } else {
1170 $(".forhide").prop("disabled", false).show();
1171 }
1172 });
1173 </script>';
1174 //return ($i?$i:$headershown);
1175 return $out;
1176 }
1177
1191 public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter = '', $morecss = 'valignmiddle', $allfiles = 0)
1192 {
1193 global $conf, $langs;
1194
1195 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1196
1197 $out = '';
1198 $this->infofiles = array('nboffiles' => 0, 'extensions' => array(), 'files' => array());
1199
1200 $entity = 1; // Without multicompany
1201
1202 // Get object entity
1203 if (isModEnabled('multicompany')) {
1204 $regs = array();
1205 preg_match('/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir, '/').'$/', $filedir, $regs);
1206 $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1); // If entity id not found in $filedir this is entity 1 by default
1207 }
1208
1209 // Get list of files starting with name of ref (Note: files with '^ref\.extension' are generated files, files with '^ref-...' are uploaded files)
1210 if ($allfiles || getDolGlobalString('MAIN_SHOW_ALL_FILES_ON_DOCUMENT_TOOLTIP')) {
1211 $filterforfilesearch = '^'.preg_quote(basename($modulesubdir), '/');
1212 } else {
1213 $filterforfilesearch = '^'.preg_quote(basename($modulesubdir), '/').'\.';
1214 }
1215 $file_list = dol_dir_list($filedir, 'files', 0, $filterforfilesearch, '\.meta$|\.png$'); // We also discard .meta and .png preview
1216
1217 //var_dump($file_list);
1218 // For ajax treatment
1219 $out .= '<!-- html.formfile::getDocumentsLink -->'."\n";
1220 if (!empty($file_list)) {
1221 $out = '<dl class="dropdown inline-block">
1222 <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto('', 'listlight', '', 0, 0, 0, '', $morecss).'</a></dt>
1223 <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1224 $tmpout = '';
1225
1226 // Loop on each file found
1227 $found = 0;
1228 $i = 0;
1229 foreach ($file_list as $file) {
1230 $i++;
1231 if ($filter && !preg_match('/'.$filter.'/i', $file["name"])) {
1232 continue; // Discard this. It does not match provided filter.
1233 }
1234
1235 $found++;
1236 // Define relative path for download link (depends on module)
1237 $relativepath = $file["name"]; // Cas general
1238 if ($modulesubdir) {
1239 $relativepath = (string) $modulesubdir."/".$file["name"]; // Cas propal, facture...
1240 }
1241 // Autre cas
1242 if ($modulepart == 'donation') {
1243 $relativepath = (string) get_exdir($modulesubdir, 2, 0, 0, null, 'donation').$file["name"];
1244 }
1245 if ($modulepart == 'export') {
1246 $relativepath = (string) $file["name"];
1247 }
1248
1249 $this->infofiles['nboffiles']++;
1250 $this->infofiles['files'][] = $file['fullname'];
1251 $ext = (string) pathinfo($file['name'], PATHINFO_EXTENSION); // pathinfo returns a string here (cast for static analysis)
1252 if (!array_key_exists($ext, $this->infofiles['extensions'])) {
1253 $this->infofiles['extensions'][$ext] = 1;
1254 } else {
1255 $this->infofiles['extensions'][$ext]++;
1256 }
1257
1258 // Preview
1259 if (!empty($conf->use_javascript_ajax) && ($conf->browser->layout != 'phone')) {
1260 $tmparray = getAdvancedPreviewUrl($modulepart, $relativepath, 1, '&entity='.$entity);
1261 if ($tmparray && $tmparray['url']) {
1262 $tmpout .= '<li><a href="'.$tmparray['url'].'"'.($tmparray['css'] ? ' class="'.$tmparray['css'].'"' : '').($tmparray['mime'] ? ' mime="'.$tmparray['mime'].'"' : '').($tmparray['target'] ? ' target="'.$tmparray['target'].'"' : '').'>';
1263 //$tmpout.= img_picto('','detail');
1264 $tmpout .= img_picto('', 'search-plus', 'class="paddingright"');
1265 $tmpout .= $langs->trans("Preview").' '.$ext.'</a></li>';
1266 }
1267 }
1268
1269 // Download
1270 $tmpout .= '<li class="nowrap"><a class="pictopreview nowrap" ';
1271 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
1272 $tmpout .= 'target="_blank" ';
1273 }
1274 $tmpout .= 'href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&amp;entity='.$entity.'&amp;file='.urlencode($relativepath).'"';
1275 $mime = dol_mimetype($relativepath, '', 0);
1276 if (preg_match('/text/', $mime)) {
1277 $tmpout .= ' target="_blank" rel="noopener noreferrer"';
1278 }
1279 $tmpout .= '>';
1280 $tmpout .= img_mime($relativepath, $file["name"]);
1281 $tmpout .= $langs->trans("Download").' '.$ext;
1282 $tmpout .= '</a></li>'."\n";
1283 }
1284 $out .= $tmpout;
1285 $out .= '</ul></div></dd>
1286 </dl>';
1287
1288 if (!$found) {
1289 $out = '';
1290 }
1291 } else {
1292 // TODO Add link to regenerate doc ?
1293 //$out.= '<div id="gen_pdf_'.$modulesubdir.'" class="linkobject hideobject">'.img_picto('', 'refresh').'</div>'."\n";
1294 }
1295
1296 return $out;
1297 }
1298
1299
1300 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1334 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 = '', $moreoptions = array())
1335 {
1336 // phpcs:enable
1337 global $user, $conf, $langs, $hookmanager, $form;
1338 global $sortfield, $sortorder;
1340
1341 if ($disablecrop == -1) {
1342 $disablecrop = 1;
1343 // Values here must be supported by the photos_resize.php page.
1344 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'))) {
1345 $disablecrop = 0;
1346 }
1347 }
1348
1349 // Define relative path used to store the file
1350 if (empty($relativepath)) {
1351 $relativepath = (!empty($object->ref) ? dol_sanitizeFileName($object->ref) : '').'/';
1352 if (!empty($object->element) && $object->element == "societe" && !empty($object->id)) {
1353 $relativepath = ($object->id).'/';
1354 } elseif (!empty($object->element) && $object->element == 'invoice_supplier') {
1355 $relativepath = get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier').$relativepath; // TODO Call using a defined value for $relativepath
1356 } elseif (!empty($object->element) && $object->element == 'project_task') {
1357 $relativepath = 'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1358 }
1359 }
1360 // For backward compatibility, we detect file stored into an old path
1361 if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO') && isset($filearray[0]) && $filearray[0]['level1name'] == 'photos') {
1362 $relativepath = preg_replace('/^.*\/produit\//', '', $filearray[0]['path']).'/';
1363 }
1364
1365 // Defined relative dir to DOL_DATA_ROOT
1366 $relativedir = '';
1367 if ($upload_dir) {
1368 $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $upload_dir);
1369 $relativedir = preg_replace('/^[\\/]/', '', $relativedir);
1370 }
1371
1372 // For example here $upload_dir = '/pathtodocuments/commande/SO2001-123/'
1373 // For example here $upload_dir = '/pathtodocuments/tax/vat/1'
1374 // For example here $upload_dir = '/home/ldestailleur/git/dolibarr_dev/documents/fournisseur/facture/6/1/SI2210-0013' and relativedir='fournisseur/facture/6/1/SI2210-0013'
1375
1376 $hookmanager->initHooks(array('formfile'));
1377 $parameters = array(
1378 'filearray' => $filearray,
1379 'modulepart' => $modulepart,
1380 'param' => $param,
1381 'forcedownload' => $forcedownload,
1382 'relativepath' => $relativepath, // relative filename to module dir
1383 'relativedir' => $relativedir, // relative dirname to DOL_DATA_ROOT
1384 'permtodelete' => $permonobject,
1385 'useinecm' => $useinecm,
1386 'textifempty' => $textifempty,
1387 'maxlength' => $maxlength,
1388 'title' => $title,
1389 'url' => $url
1390 );
1391 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable
1392 $reshook = $hookmanager->executeHooks('showFilesList', $parameters, $object);
1393
1394 if (!empty($reshook)) { // null or '' for bypass
1395 return $reshook;
1396 } else {
1397 if (!is_object($form)) {
1398 include_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php'; // The component may be included into ajax page that does not include the Form class
1399 $form = new Form($this->db);
1400 }
1401
1402 if (!preg_match('/&id=/', $param) && isset($object->id)) {
1403 $param .= '&id='.$object->id;
1404 }
1405 $relativepathwihtoutslashend = preg_replace('/\/$/', '', $relativepath);
1406 if ($relativepathwihtoutslashend) {
1407 $param .= '&file='.urlencode($relativepathwihtoutslashend);
1408 }
1409
1410 if ($permtoeditline < 0) { // Old behaviour for backward compatibility. New feature should call method with value 0 or 1
1411 $permtoeditline = 0;
1412 if (in_array($modulepart, array('product', 'produit', 'service'))) {
1413 '@phan-var-force Product $object';
1414 if ($user->hasRight('produit', 'creer') && $object->type == Product::TYPE_PRODUCT) {
1415 $permtoeditline = 1;
1416 }
1417 if ($user->hasRight('service', 'creer') && $object->type == Product::TYPE_SERVICE) {
1418 $permtoeditline = 1;
1419 }
1420 }
1421 }
1422 if (!getDolGlobalString('MAIN_UPLOAD_DOC')) {
1423 $permtoeditline = 0;
1424 $permonobject = 0;
1425 }
1426 if (empty($url)) {
1427 $url = $_SERVER["PHP_SELF"];
1428 }
1429
1430
1431 // Show title of list of existing files
1432 $morehtmlright = '';
1433 if (!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) {
1434 $tmpurlforbutton = 'javascript:console.log("open add file form");jQuery(".divattachnewfile").toggle(); if (!jQuery(".divattachnewfile").is(":hidden")) { jQuery(".divattachnewfile input[type=\'file\']").first().click();} void(0);'; // scope file picker click to the just-shown form to avoid triggering native file dialog twice when other input[type=file] exist on the page
1435 $morehtmlright .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', $tmpurlforbutton, '', $permtoeditline);
1436 }
1437
1438 if ((empty($useinecm) || $useinecm == 3 || $useinecm == 6) && $title != 'none') {
1439 print load_fiche_titre($title ? $title : $langs->trans("AttachedFiles"), $morehtmlright, 'file-upload', 0, '', 'table-list-of-attached-files');
1440 }
1441 if (!empty($moreoptions) && $moreoptions['afteruploadtitle']) {
1442 print '<!-- Add form from $moreoptions[\'afteruploadtitle\'] -->';
1443 print '<div class="divattachnewfile'.((!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) ? ' hidden' : '').'">'.$moreoptions['afteruploadtitle'].'</div>';
1444 }
1445
1446 // Show the table
1447 print '<!-- html.formfile::list_of_documents -->'."\n";
1448 if (GETPOST('action', 'aZ09') == 'editfile' && $permtoeditline) {
1449 print '<form action="'.$_SERVER["PHP_SELF"].'?'.$param.'" method="POST">';
1450 print '<input type="hidden" name="token" value="'.newToken().'">';
1451 print '<input type="hidden" name="action" value="renamefile">';
1452 print '<input type="hidden" name="id" value="'.(is_object($object) ? $object->id : '').'">';
1453 print '<input type="hidden" name="modulepart" value="'.$modulepart.'">';
1454 }
1455
1456 print '<div class="div-table-responsive-no-min"'.($moreattrondiv ? ' '.$moreattrondiv : '').'>';
1457 print '<table id="tablelines" class="centpercent liste noborder nobottom">'."\n";
1458
1459 if (!empty($addfilterfields)) {
1460 print '<tr class="liste_titre nodrag nodrop">';
1461 print '<td><input type="search_doc_ref" value="'.dol_escape_htmltag(GETPOST('search_doc_ref', 'alpha')).'"></td>';
1462 print '<td></td>';
1463 print '<td></td>';
1464 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1465 print '<td></td>';
1466 }
1467 print '<td></td>';
1468 print '<td></td>';
1469 if (empty($disablemove) && count($filearray) > 1) {
1470 print '<td></td>';
1471 }
1472 print "</tr>\n";
1473 }
1474
1475 // Get list of files stored into database for the same relative directory
1476 if ($relativedir) {
1477 completeFileArrayWithDatabaseInfo($filearray, $relativedir, $object);
1478 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $filearray';
1479
1480 //var_dump($sortfield.' - '.$sortorder);
1481 if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
1482 $filearray = dol_sort_array($filearray, $sortfield, $sortorder, 1);
1483 }
1484 }
1485
1486 print '<tr class="liste_titre nodrag nodrop">';
1487 // Name
1488 print_liste_field_titre('Documents2', $url, "name", "", $param, '', $sortfield, $sortorder, 'left ');
1489 // Size
1490 print_liste_field_titre('Size', $url, "size", "", $param, '', $sortfield, $sortorder, 'right ');
1491 // Date
1492 print_liste_field_titre('Date', $url, "date", "", $param, '', $sortfield, $sortorder, 'center ');
1493 // Preview
1494 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1495 print_liste_field_titre('', $url, "", "", $param, '', $sortfield, $sortorder, 'center '); // Preview
1496 }
1497 // Shared or not - Hash of file
1498 print_liste_field_titre('Shared');
1499 // Action button
1501 if (empty($disablemove) && count($filearray) > 1) {
1502 // Move
1504 }
1505 print "</tr>\n";
1506
1507 $nboffiles = count($filearray);
1508 if ($nboffiles > 0) {
1509 include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
1510 }
1511
1512 $i = 0;
1513 $nboflines = 0;
1514 $lastrowid = 0;
1515 $parametersByDefault = array(
1516 'modulepart' => $modulepart,
1517 'relativepath' => $relativepath,
1518 'permtoedit' => $permtoeditline,
1519 'permonobject' => $permonobject,
1520 );
1521 foreach ($filearray as $key => $file) { // filearray must be only files here
1522 if ($file['name'] != '.' && $file['name'] != '..' && !preg_match('/\.meta$/i', $file['name'])) {
1523 if (array_key_exists('rowid', $filearray[$key]) && $filearray[$key]['rowid'] > 0) {
1524 $lastrowid = $filearray[$key]['rowid'];
1525 }
1526 //var_dump($filearray[$key]);
1527
1528 // get specific parameters from file attributes if set or get default ones
1529 $modulepart = ($file['modulepart'] ?? $parametersByDefault['modulepart']);
1530 $relativepath = ($file['relativepath'] ?? $parametersByDefault['relativepath']);
1531 $permtoeditline = ($file['permtoedit'] ?? $parametersByDefault['permtoedit']);
1532 $permonobject = ($file['permonobject'] ?? $parametersByDefault['permonobject']);
1533
1534 // Note: for supplier invoice, $modulepart may be already 'facture_fournisseur' and $relativepath may be already '6/1/SI2210-0013/'
1535 if (empty($relativepath) || empty($modulepart)) {
1536 $filepath = $file['level1name'].'/'.$file['name'];
1537 } else {
1538 $filepath = $relativepath.$file['name'];
1539 }
1540 if (empty($modulepart)) {
1541 $modulepart = basename(dirname($file['path']));
1542 }
1543 if (empty($relativepath)) {
1544 $relativepath = preg_replace('/\/(.+)/', '', $filepath) . '/';
1545 }
1546
1547 $editline = 0;
1548 $nboflines++;
1549 print '<!-- Line list_of_documents '.$key.' relativepath = '.$relativepath.' -->'."\n";
1550 // Do we have entry into database ?
1551
1552 print '<!-- In database: position='.(array_key_exists('position', $filearray[$key]) ? $filearray[$key]['position'] : 0).' -->'."\n";
1553 print '<tr class="oddeven" id="row-'.((array_key_exists('rowid', $filearray[$key]) && $filearray[$key]['rowid'] > 0) ? $filearray[$key]['rowid'] : 'AFTER'.$lastrowid.'POS'.($i + 1)).'">';
1554
1555
1556 // File name
1557 print '<td class="minwidth200imp tdoverflowmax500" title="'.dolPrintHTMLForAttribute($file['name']).'">';
1558
1559 // Show file name with link to download
1560 //print "XX".$file['name']; //$file['name'] must be utf8
1561 print '<a class="paddingright valignmiddle" ';
1562 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
1563 print 'target="_blank" ';
1564 }
1565 print 'href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart;
1566 if ($forcedownload) {
1567 print '&attachment=1';
1568 }
1569 if (!empty($object->entity)) {
1570 print '&entity='.$object->entity;
1571 }
1572 print '&file='.urlencode($filepath);
1573 print '">';
1574 print img_mime($file['name'], $file['name'].' ('.dol_print_size($file['size'], 0, 0).')', 'inline-block valignmiddle paddingright');
1575 if ($showrelpart == 1) {
1576 print $relativepath;
1577 }
1578 //print dol_trunc($file['name'],$maxlength,'middle');
1579
1580 //var_dump(dirname($filepath).' - '.dirname(GETPOST('urlfile', 'alpha')));
1581
1582 if (GETPOST('action', 'aZ09') == 'editfile' && $file['name'] == basename(GETPOST('urlfile', 'alpha')) && dirname($filepath) == dirname(GETPOST('urlfile', 'alpha'))) {
1583 print '</a>';
1584 $section_dir = dirname(GETPOST('urlfile', 'alpha'));
1585 if (!preg_match('/\/$/', $section_dir)) {
1586 $section_dir .= '/';
1587 }
1588 print '<input type="hidden" name="section_dir" value="'.$section_dir.'">';
1589 print '<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file['name']).'">';
1590 print '<input type="text" name="renamefileto" class="centpercentminusx" value="'.dol_escape_htmltag($file['name']).'">';
1591 $editline = 1;
1592 } else {
1593 $filenametoshow = preg_replace('/\.noexe$/', '', $file['name']);
1594 print dolPrintHTML(dol_trunc($filenametoshow, 200));
1595 print '</a>';
1596 }
1597 // Preview link
1598 if (!$editline) {
1599 print $this->showPreview($file, $modulepart, $filepath, 0, '&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
1600 }
1601
1602 print "</td>\n";
1603
1604 // Size
1605 $sizetoshow = dol_print_size($file['size'], 1, 1);
1606 $sizetoshowbytes = dol_print_size($file['size'], 0, 1);
1607 print '<td class="right nowraponall">';
1608 if ($sizetoshow == $sizetoshowbytes) {
1609 print $sizetoshow;
1610 } else {
1611 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1612 }
1613 print '</td>';
1614
1615 // Date
1616 print '<td class="center nowraponall">'.dol_print_date($file['date'], "dayhour", "tzuser").'</td>';
1617
1618 // Preview
1619 $fileinfo = pathinfo($file['name']);
1620 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1621 print '<td class="center">';
1622 if (image_format_supported($file['name']) >= 0) {
1623 if ($useinecm == 5 || $useinecm == 6) {
1624 $smallfile = getImageFileNameForSize($file['name'], ''); // There is no thumb for ECM module and Media filemanager, so we use true image. TODO Change this for better performance.
1625 } else {
1626 $smallfile = getImageFileNameForSize($file['name'], '_small'); // For new thumbs using same ext (in lower case however) than original
1627 }
1628 if (!dol_is_file($file['path'].'/'.$smallfile)) {
1629 $smallfile = getImageFileNameForSize($file['name'], '_small', '.png'); // For backward compatibility of old thumbs that were created with filename in lower case and with .png extension
1630 }
1631 if (!dol_is_file($file['path'].'/'.$smallfile)) {
1632 $smallfile = getImageFileNameForSize($file['name'], ''); // This is in case no _small image exist
1633 }
1634 //print $file['path'].'/'.$smallfile.'<br>';
1635
1636 $urlforhref = getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']), 1, '&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
1637 if (empty($urlforhref)) {
1638 $urlforhref = DOL_URL_ROOT.'/viewimage.php?modulepart='.urlencode($modulepart).'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).'&file='.urlencode($relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']));
1639 print '<a href="'.$urlforhref.'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1640 } else {
1641 print '<a href="'.$urlforhref['url'].'" class="'.$urlforhref['css'].'" target="'.$urlforhref['target'].'" mime="'.$urlforhref['mime'].'">';
1642 }
1643 print '<img class="photo maxwidth200 shadow valignmiddle"';
1644 if ($useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1645 print ' height="20"';
1646 } else {
1647 //print ' style="max-height: '.$maxheightmini.'px"';
1648 print ' style="max-height: 24px"';
1649 }
1650 print ' src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.urlencode($modulepart).'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).'&file='.urlencode($relativepath.$smallfile);
1651 if (!empty($filearray[$key]['date'])) { // We know the date of file, we can use it as cache key so URL will be in browser cache as long as file date is not modified.
1652 print '&cache='.urlencode((string) $filearray[$key]['date']);
1653 }
1654 print '" title="">';
1655 print '</a>';
1656 }
1657 print '</td>';
1658 }
1659
1660 // Shared or not - Hash of file
1661 print '<td class="center minwidth100 nowraponsmartphone">';
1662 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
1663 if ($editline) {
1664 print '<label for="idshareenabled'.$key.'">'.$langs->trans("FileSharedViaALink").'</label> ';
1665 print '<input class="inline-block" type="checkbox" id="idshareenabled'.$key.'" name="shareenabled"'.($file['share'] ? ' checked="checked"' : '').' /> ';
1666 } else {
1667 if ($file['share']) {
1668 // Define $urlwithroot
1669 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
1670 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
1671 //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
1672
1673 //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
1674 $forcedownload = getDolGlobalInt('MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1675 $paramlink = '';
1676 if (!empty($file['share'])) {
1677 $paramlink .= /* ($paramlink ? '&' : ''). */'hashp='.$file['share']; // Hash for public share
1678 }
1679 if ($forcedownload) {
1680 $paramlink .= ($paramlink ? '&' : '').'attachment=1';
1681 }
1682
1683 $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
1684
1685 print '<!-- shared link -->';
1686 print '<a href="'.$fulllink.'" target="_blank" rel="noopener">'.img_picto($langs->trans("FileSharedViaALink"), 'globe').'</a> ';
1687 print '<input type="text" class="centpercentminusx minwidth50imp nopadding small downloadexternallink" id="downloadlink'.$filearray[$key]['rowid'].'" name="downloadexternallink" title="'.dol_escape_htmltag($langs->trans("FileSharedViaALink")).'" value="'.dol_escape_htmltag($fulllink).'" spellcheck="false">';
1688 } else {
1689 //print '<span class="opacitymedium">'.$langs->trans("FileNotShared").'</span>';
1690 }
1691 }
1692 }
1693 print '</td>';
1694
1695 // Actions buttons (1 column or 2 if !disablemove)
1696 if (!$editline) {
1697 // Delete or view link
1698 // ($param must start with &)
1699 print '<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1700 if ($useinecm == 1 || $useinecm == 5) { // ECM manual tree only
1701 // $section is inside $param
1702 $newparam = preg_replace('/&file=.*$/', '', $param); // We don't need param file=
1703 $backtopage = DOL_URL_ROOT.'/ecm/index.php?&section_dir='.urlencode($relativepath).$newparam;
1704 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>';
1705 }
1706
1707 if (empty($useinecm) || $useinecm == 2 || $useinecm == 3 || $useinecm == 6) { // 6=Media file manager
1708 $newmodulepart = $modulepart;
1709 if (in_array($modulepart, array('product', 'produit', 'service'))) {
1710 $newmodulepart = 'produit|service';
1711 }
1712 if (image_format_supported($file['name']) > 0) {
1713 if ($permtoeditline) {
1714 $moreparaminurl = '';
1715 if (!empty($object->id) && $object->id > 0) {
1716 $moreparaminurl .= '&id='.$object->id;
1717 } elseif (GETPOST('website', 'alpha')) {
1718 $moreparaminurl .= '&website='.GETPOST('website', 'alpha');
1719 }
1720 // Set the backtourl
1721 if ($modulepart == 'medias' && !GETPOST('website')) {
1722 $moreparaminurl .= '&backtourl='.urlencode(DOL_URL_ROOT.'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.'&section_dir='.$relativepath);
1723 }
1724 // Link to convert into webp
1725 if (!preg_match('/\.webp$/i', $file['name'])) {
1726 if ($modulepart == 'medias' && !GETPOST('website')) {
1727 print '<a href="'.DOL_URL_ROOT.'/ecm/index_medias.php?action=confirmconvertimgwebp&token='.newToken().'&section_dir='.urlencode($relativepath).'&filetoregenerate='.urlencode($fileinfo['basename']).'&module='.$modulepart.$param.$moreparaminurl.'" title="'.dol_escape_htmltag($langs->trans("GenerateChosenImgWebp")).'">'.img_picto('', 'images', 'class="flip marginrightonly"').'</a>';
1728 } elseif ($modulepart == 'medias' && GETPOST('website')) {
1729 print '<a href="'.DOL_URL_ROOT.'/website/index.php?action=confirmconvertimgwebp&token='.newToken().'&section_dir='.urlencode($relativepath).'&filetoregenerate='.urlencode($fileinfo['basename']).'&module='.$modulepart.$param.$moreparaminurl.'" title="'.dol_escape_htmltag($langs->trans("GenerateChosenImgWebp")).'">'.img_picto('', 'images', 'class="flip marginrightonly"').'</a>';
1730 }
1731 }
1732 }
1733 }
1734 if (!$disablecrop && image_format_supported($file['name']) > 0) {
1735 if ($permtoeditline) {
1736 // Link to resize
1737 $moreparaminurl = '';
1738 if (!empty($object->id) && $object->id > 0) {
1739 $moreparaminurl .= '&id='.$object->id;
1740 } elseif (GETPOST('website', 'alpha')) {
1741 $moreparaminurl .= '&website='.GETPOST('website', 'alpha');
1742 }
1743 // Set the backtourl
1744 if ($modulepart == 'medias' && !GETPOST('website')) {
1745 $moreparaminurl .= '&backtourl='.urlencode(DOL_URL_ROOT.'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.'&section_dir='.$relativepath);
1746 }
1747 //var_dump($moreparaminurl);
1748 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>';
1749 }
1750 }
1751
1752 if ($permtoeditline) {
1753 $paramsectiondir = (in_array($modulepart, array('medias', 'ecm')) ? '&section_dir='.urlencode($relativepath) : '');
1754 print '<a class="editfielda reposition editfilelink paddingright marginleftonly" href="'.(($useinecm == 1 || $useinecm == 5) ? '#' : ($url.'?action=editfile&token='.newToken().'&urlfile='.urlencode($filepath).$paramsectiondir.$param)).'" rel="'.$filepath.'">'.img_edit('default', 0, 'class="paddingrightonly"').'</a>';
1755 }
1756 }
1757 // Output link to delete file
1758 if ($permonobject) {
1759 $useajax = 1;
1760 if (!empty($conf->dol_use_jmobile)) {
1761 $useajax = 0;
1762 }
1763 if (empty($conf->use_javascript_ajax)) {
1764 $useajax = 0;
1765 }
1766 if (getDolGlobalString('MAIN_ECM_DISABLE_JS')) {
1767 $useajax = 0;
1768 }
1769
1770 print '<a href="'.((($useinecm && $useinecm != 3 && $useinecm != 6) && $useajax) ? '#' : ($url.'?action=deletefile&token='.newToken().'&urlfile='.urlencode($filepath).$param)).'" class="reposition deletefilelink paddingright marginleftonly" rel="'.$filepath.'">'.img_delete().'</a>';
1771 }
1772 print "</td>";
1773
1774 if (empty($disablemove) && count($filearray) > 1) {
1775 if ($nboffiles > 1 && $conf->browser->layout != 'phone') {
1776 print '<td class="linecolmove tdlineupdown center">';
1777 if ($i > 0) {
1778 print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=up&rowid='.$object->id.'">'.img_up('default', 0, 'imgupforline').'</a>';
1779 }
1780 if ($i < ($nboffiles - 1)) {
1781 print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=down&rowid='.$object->id.'">'.img_down('default', 0, 'imgdownforline').'</a>';
1782 }
1783 print '</td>';
1784 } else {
1785 print '<td'.(($conf->browser->layout != 'phone') ? ' class="linecolmove tdlineupdown center"' : ' class="linecolmove center"').'>';
1786 print '</td>';
1787 }
1788 }
1789 } else {
1790 print '<td class="right">';
1791 print '<input type="hidden" name="ecmfileid" value="'.(empty($filearray[$key]['rowid']) ? '' : $filearray[$key]['rowid']).'">';
1792 print '<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv("Save")).'">';
1793 print '<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv("Cancel")).'">';
1794 print '</td>';
1795 if (empty($disablemove) && count($filearray) > 1) {
1796 print '<td class="right"></td>';
1797 }
1798 }
1799 print "</tr>\n";
1800
1801 $i++;
1802 }
1803 }
1804 if ($nboffiles == 0) {
1805 $colspan = '6';
1806 if (empty($disablemove) && count($filearray) > 1) {
1807 $colspan++; // 6 columns or 7
1808 }
1809 print '<tr class="oddeven"><td colspan="'.$colspan.'">';
1810 if (empty($textifempty)) {
1811 print '<span class="opacitymedium">'.$langs->trans("NoFileFound").'</span>';
1812 } else {
1813 print '<span class="opacitymedium">'.dolPrintHTML($textifempty).'</span>';
1814 }
1815 print '</td></tr>';
1816 }
1817
1818 print "</table>";
1819 print '</div>';
1820
1821 if ($nboflines > 1 && is_object($object)) {
1822 if (!empty($conf->use_javascript_ajax) && $permtoeditline) {
1823 $table_element_line = 'ecm_files'; // used by ajaxrow.tpl.php
1824 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
1825 }
1826 }
1827
1828 print ajax_autoselect('downloadlink');
1829
1830 if (GETPOST('action', 'aZ09') == 'editfile' && $permtoeditline) {
1831 print '</form>';
1832 }
1833
1834 return $nboffiles;
1835 }
1836 }
1837
1838
1839 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1858 public function list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload = 0, $relativepath = '', $permissiontodelete = 1, $useinecm = 0, $textifempty = '', $maxlength = 0, $url = '', $addfilterfields = 0)
1859 {
1860 // phpcs:enable
1861 global $conf, $langs, $hookmanager, $form;
1862 global $sortfield, $sortorder;
1863 global $search_doc_ref;
1865
1866 dol_syslog(get_class($this).'::list_of_autoecmfiles upload_dir='.$upload_dir.' modulepart='.$modulepart);
1867
1868 // Show list of documents
1869 if (empty($useinecm) || $useinecm == 6) {
1870 print load_fiche_titre($langs->trans("AttachedFiles"));
1871 }
1872 if (empty($url)) {
1873 $url = $_SERVER["PHP_SELF"];
1874 }
1875
1876 if (!empty($addfilterfields)) {
1877 print '<form action="'.$_SERVER['PHP_SELF'].'">';
1878 print '<input type="hidden" name="token" value="'.newToken().'">';
1879 print '<input type="hidden" name="module" value="'.$modulepart.'">';
1880 }
1881
1882 print '<div class="div-table-responsive-no-min">';
1883 print '<table class="noborder centpercent">'."\n";
1884
1885 if (!empty($addfilterfields)) {
1886 print '<tr class="liste_titre nodrag nodrop">';
1887 // Ref
1888 print '<td class="liste_titre"></td>';
1889 // Name
1890 print '<td class="liste_titre"><input type="text" class="maxwidth100onsmartphone" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
1891 // Size
1892 print '<td class="liste_titre"></td>';
1893 // Date
1894 print '<td class="liste_titre"></td>';
1895 // Shared and action column
1896 print '<td class="liste_titre right">';
1897 $searchpicto = $form->showFilterButtons();
1898 print $searchpicto;
1899 print '</td>';
1900 print "</tr>\n";
1901 }
1902
1903 print '<tr class="liste_titre">';
1904 $sortref = "fullname";
1905 if ($modulepart == 'invoice_supplier') {
1906 $sortref = 'level1name';
1907 }
1908 print_liste_field_titre("Ref", $url, $sortref, "", $param, '', $sortfield, $sortorder);
1909 print_liste_field_titre("Documents2", $url, "name", "", $param, '', $sortfield, $sortorder);
1910 print_liste_field_titre("Size", $url, "size", "", $param, '', $sortfield, $sortorder, 'right ');
1911 print_liste_field_titre("Date", $url, "date", "", $param, '', $sortfield, $sortorder, 'center ');
1912 print_liste_field_titre("Shared", $url, 'share', '', $param, '', $sortfield, $sortorder, 'right ');
1913 print '</tr>'."\n";
1914
1915 // To show ref or specific information according to view to show (defined by $module)
1916 $object_instance = null;
1917 if ($modulepart == 'company') {
1918 include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1919 $object_instance = new Societe($this->db);
1920 } elseif ($modulepart == 'invoice') {
1921 include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1922 $object_instance = new Facture($this->db);
1923 } elseif ($modulepart == 'invoice_supplier') {
1924 include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1925 $object_instance = new FactureFournisseur($this->db);
1926 } elseif ($modulepart == 'propal') {
1927 include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
1928 $object_instance = new Propal($this->db);
1929 } elseif ($modulepart == 'supplier_proposal') {
1930 include_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
1931 $object_instance = new SupplierProposal($this->db);
1932 } elseif ($modulepart == 'order') {
1933 include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
1934 $object_instance = new Commande($this->db);
1935 } elseif ($modulepart == 'order_supplier') {
1936 include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
1937 $object_instance = new CommandeFournisseur($this->db);
1938 } elseif ($modulepart == 'contract') {
1939 include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
1940 $object_instance = new Contrat($this->db);
1941 } elseif ($modulepart == 'product') {
1942 include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
1943 $object_instance = new Product($this->db);
1944 } elseif ($modulepart == 'tax') {
1945 include_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
1946 $object_instance = new ChargeSociales($this->db);
1947 } elseif ($modulepart == 'tax-vat') {
1948 include_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
1949 $object_instance = new Tva($this->db);
1950 } elseif ($modulepart == 'salaries') {
1951 include_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
1952 $object_instance = new Salary($this->db);
1953 } elseif ($modulepart == 'project') {
1954 include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
1955 $object_instance = new Project($this->db);
1956 } elseif ($modulepart == 'project_task') {
1957 include_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
1958 $object_instance = new Task($this->db);
1959 } elseif ($modulepart == 'fichinter') {
1960 include_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
1961 $object_instance = new Fichinter($this->db);
1962 } elseif ($modulepart == 'user') {
1963 include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
1964 $object_instance = new User($this->db);
1965 } elseif ($modulepart == 'expensereport') {
1966 include_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
1967 $object_instance = new ExpenseReport($this->db);
1968 } elseif ($modulepart == 'holiday') {
1969 include_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
1970 $object_instance = new Holiday($this->db);
1971 } elseif ($modulepart == 'recruitment-recruitmentcandidature') {
1972 include_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentcandidature.class.php';
1973 $object_instance = new RecruitmentCandidature($this->db);
1974 } elseif ($modulepart == 'banque') {
1975 include_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1976 $object_instance = new Account($this->db);
1977 } elseif ($modulepart == 'bank-statement') {
1978 //include_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
1979 $object_instance = null;
1980 } elseif ($modulepart == 'chequereceipt') {
1981 include_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
1982 $object_instance = new RemiseCheque($this->db);
1983 } elseif ($modulepart == 'mrp-mo') {
1984 include_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
1985 $object_instance = new Mo($this->db);
1986 } else {
1987 $parameters = array('modulepart' => $modulepart);
1988 $reshook = $hookmanager->executeHooks('addSectionECMAuto', $parameters);
1989 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
1990 if (array_key_exists('classpath', $hookmanager->resArray) && !empty($hookmanager->resArray['classpath'])) {
1991 dol_include_once($hookmanager->resArray['classpath']);
1992 if (array_key_exists('classname', $hookmanager->resArray) && !empty($hookmanager->resArray['classname'])) {
1993 $tmpclassname = $hookmanager->resArray['classname'];
1994 if (is_string($tmpclassname) && class_exists($tmpclassname)) {
1995 $object_instance = new $tmpclassname($this->db);
1996 }
1997 }
1998 }
1999 }
2000 }
2001
2002 //var_dump($filearray);
2003 //var_dump($object_instance);
2004
2005 // Get list of files stored into database for same relative directory
2006 $relativepathfromroot = preg_replace('/'.preg_quote(DOL_DATA_ROOT.'/', '/').'/', '', $upload_dir);
2007 if ($relativepathfromroot) {
2008 completeFileArrayWithDatabaseInfo($filearray, $relativepathfromroot.'/%');
2009 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $filearray';
2010
2011 //var_dump($sortfield.' - '.$sortorder);
2012 if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
2013 $filearray = dol_sort_array($filearray, $sortfield, $sortorder, 1);
2014 }
2015 }
2016
2017 //var_dump($filearray);
2018
2019 foreach ($filearray as $key => $file) {
2020 if (!is_dir($file['name'])
2021 && $file['name'] != '.'
2022 && $file['name'] != '..'
2023 && $file['name'] != 'CVS'
2024 && !preg_match('/\.meta$/i', $file['name'])) {
2025 // Define relative path used to store the file
2026 $relativefile = preg_replace('/'.preg_quote($upload_dir.'/', '/').'/', '', $file['fullname']);
2027
2028 $id = 0;
2029 $ref = '';
2030
2031 // To show ref or specific information according to view to show (defined by $modulepart)
2032 // $modulepart can be $object->table_name (that is 'mymodule_myobject') or $object->element.'-'.$module (for compatibility purpose)
2033 $reg = array();
2034 if ($modulepart == 'company' || $modulepart == 'tax' || $modulepart == 'tax-vat' || $modulepart == 'salaries') {
2035 preg_match('/(\d+)\/[^\/]+$/', $relativefile, $reg);
2036 $id = (isset($reg[1]) ? $reg[1] : '');
2037 } elseif ($modulepart == 'invoice_supplier') {
2038 preg_match('/([^\/]+)\/[^\/]+$/', $relativefile, $reg);
2039 $ref = (isset($reg[1]) ? $reg[1] : '');
2040 if (is_numeric($ref)) {
2041 $id = $ref;
2042 $ref = '';
2043 }
2044 } elseif ($modulepart == 'user') {
2045 // $ref may be also id with old supplier invoices
2046 preg_match('/(.*)\/[^\/]+$/', $relativefile, $reg);
2047 $id = (isset($reg[1]) ? $reg[1] : '');
2048 } elseif ($modulepart == 'project_task') {
2049 // $ref of task is the sub-directory of the project
2050 $reg = explode("/", $relativefile);
2051 $ref = (isset($reg[1]) ? $reg[1] : '');
2052 } elseif (in_array($modulepart, array(
2053 'invoice',
2054 'propal',
2055 'supplier_proposal',
2056 'order',
2057 'order_supplier',
2058 'contract',
2059 'product',
2060 'project',
2061 'project_task',
2062 'fichinter',
2063 'expensereport',
2064 'recruitment-recruitmentcandidature',
2065 'mrp-mo',
2066 'banque',
2067 'chequereceipt',
2068 'holiday'))) {
2069 preg_match('/(.*)\/[^\/]+$/', $relativefile, $reg);
2070 $ref = (isset($reg[1]) ? $reg[1] : '');
2071 } else {
2072 $parameters = array('modulepart' => $modulepart, 'fileinfo' => $file);
2073 $reshook = $hookmanager->executeHooks('addSectionECMAuto', $parameters);
2074 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
2075 if (array_key_exists('ref', $hookmanager->resArray) && !empty($hookmanager->resArray['ref'])) {
2076 $ref = $hookmanager->resArray['ref'];
2077 }
2078 if (array_key_exists('id', $hookmanager->resArray) && !empty($hookmanager->resArray['id'])) {
2079 $id = $hookmanager->resArray['id'];
2080 }
2081 }
2082 //print 'Error: Value for modulepart = '.$modulepart.' is not yet implemented in function list_of_autoecmfiles'."\n";
2083 }
2084
2085 if (!$id && !$ref) {
2086 continue;
2087 }
2088
2089 $found = 0;
2090 if (!empty($conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref])) {
2091 $found = 1;
2092 } else {
2093 //print 'Fetch '.$id." - ".$ref.' class='.get_class($object_instance).'<br>';
2094
2095 $result = 0;
2096 if (is_object($object_instance)) {
2097 $object_instance->id = 0;
2098 $object_instance->ref = '';
2099 if ($id) {
2100 $result = $object_instance->fetch($id);
2101 } else {
2102 $result = $object_instance->fetch(0, $ref);
2103 if ($result < 0) {
2104 print $object_instance->error;
2105 } elseif ($result == 0) {
2106 // fetchOneLike looks for objects with wildcards in its reference.
2107 // It is useful for those masks who get underscores instead of their actual symbols (because the _ had replaced all forbidden chars into filename)
2108 // TODO Example when this is needed ?
2109 // This may find when ref is 'A_B' and date was stored as 'A~B' into database, but in which case do we have this ?
2110 // May be we can add hidden option to enable this.
2111 $result = $object_instance->fetchOneLike($ref);
2112 }
2113 }
2114 }
2115
2116 if ($result > 0) { // Save object loaded into a cache
2117 $found = 1;
2118 $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref] = clone $object_instance;
2119 }
2120 if ($result == 0) {
2121 $found = 1;
2122 $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref] = 'notfound';
2123 unset($filearray[$key]);
2124 }
2125 }
2126
2127 if ($found <= 0 || !is_object($conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref])) {
2128 continue; // We do not show orphelins files
2129 }
2130
2131 print '<!-- Line list_of_autoecmfiles key='.$key.' -->'."\n";
2132 print '<tr class="oddeven">';
2133 // Ref
2134 print '<td class="tdoverflowmax150">';
2135 if ($found > 0 && is_object($conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref])) {
2136 $tmpobject = $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref];
2137 //if (! in_array($tmpobject->element, array('expensereport'))) {
2138 print $tmpobject->getNomUrl(1, 'document');
2139 //} else {
2140 // print $tmpobject->getNomUrl(1);
2141 //}
2142 } else {
2143 print $langs->trans("ObjectDeleted", ($id ? $id : $ref));
2144 }
2145
2146 //$modulesubdir=dol_sanitizeFileName($ref);
2147 //$modulesubdir = dirname($relativefile);
2148
2149 //$filedir=$conf->$modulepart->dir_output . '/' . dol_sanitizeFileName($obj->ref);
2150 //$filedir = $file['path'];
2151 //$urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid;
2152 //print $formfile->getDocumentsLink($modulepart, $filename, $filedir);
2153 print '</td>';
2154
2155 // File
2156 // Check if document source has external module part, if it the case use it for module part on document.php
2157 print '<td>';
2158 //print "XX".$file['name']; //$file['name'] must be utf8
2159 print '<a ';
2160 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
2161 print 'target="_blank" ';
2162 }
2163 print 'href="'.DOL_URL_ROOT.'/document.php?modulepart='.urlencode($modulepart);
2164 if ($forcedownload) {
2165 print '&attachment=1';
2166 }
2167 print '&file='.urlencode($relativefile).'">';
2168 print img_mime($file['name'], $file['name'].' ('.dol_print_size($file['size'], 0, 0).')');
2169 print dol_escape_htmltag(dol_trunc($file['name'], $maxlength, 'middle'));
2170 print '</a>';
2171
2172 //print $this->getDocumentsLink($modulepart, $modulesubdir, $filedir, '^'.preg_quote($file['name'],'/').'$');
2173
2174 print $this->showPreview($file, $modulepart, $file['relativename']);
2175
2176 print "</td>\n";
2177
2178 // Size
2179 $sizetoshow = dol_print_size($file['size'], 1, 1);
2180 $sizetoshowbytes = dol_print_size($file['size'], 0, 1);
2181 print '<td class="right nowraponall">';
2182 if ($sizetoshow == $sizetoshowbytes) {
2183 print $sizetoshow;
2184 } else {
2185 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
2186 }
2187 print '</td>';
2188
2189 // Date
2190 print '<td class="center">'.dol_print_date($file['date'], "dayhour").'</td>';
2191
2192 // Share link
2193 print '<td class="right">';
2194 if (!empty($file['share'])) {
2195 // Define $urlwithroot
2196 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
2197 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
2198 //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
2199
2200 //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
2201 $forcedownload = getDolGlobalInt('MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
2202 $paramlink = '';
2203 if (!empty($file['share'])) {
2204 $paramlink .= /* ($paramlink ? '&' : ''). */'hashp='.$file['share']; // Hash for public share
2205 }
2206 if ($forcedownload) {
2207 $paramlink .= ($paramlink ? '&' : '').'attachment=1';
2208 }
2209
2210 $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
2211
2212 print '<!-- shared link -->';
2213 print img_picto($langs->trans("FileSharedViaALink"), 'globe').' ';
2214 print '<input type="text" class="quatrevingtpercent width100 nopadding nopadding small downloadexternallink" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).'" spellcheck="false">';
2215 }
2216 //if (!empty($useinecm) && $useinecm != 6) print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart;
2217 //if ($forcedownload) print '&attachment=1';
2218 //print '&file='.urlencode($relativefile).'">';
2219 //print img_view().'</a> &nbsp; ';
2220 //if ($permissiontodelete) print '<a href="'.$url.'?id='.$object->id.'&section='.$_REQUEST["section"].'&action=delete&token='.newToken().'&urlfile='.urlencode($file['name']).'">'.img_delete().'</a>';
2221 //else print '&nbsp;';
2222 print "</td>";
2223
2224 print "</tr>\n";
2225 }
2226 }
2227
2228 if (count($filearray) == 0) {
2229 print '<tr class="oddeven"><td colspan="5">';
2230 if (empty($textifempty)) {
2231 print '<span class="opacitymedium">'.$langs->trans("NoFileFound").'</span>';
2232 } else {
2233 print '<span class="opacitymedium">'.$textifempty.'</span>';
2234 }
2235 print '</td></tr>';
2236 }
2237 print "</table>";
2238 print '</div>';
2239
2240 if (!empty($addfilterfields)) {
2241 print '</form>';
2242 }
2243 return count($filearray);
2244 // Fin de zone
2245 }
2246
2259 public function listOfLinks($object, $permissiontodelete = 1, $action = null, $selected = null, $param = '', $htmlname = 'formaddlink', $moreoptions = array())
2260 {
2261 global $conf, $langs;
2262 global $sortfield, $sortorder;
2263
2264 $langs->load("link");
2265
2266 require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
2267 $link = new Link($this->db);
2268 $links = array();
2269 if ($sortfield == "name") {
2270 $sortfield = "label";
2271 } elseif ($sortfield == "date") {
2272 $sortfield = "datea";
2273 } else {
2274 $sortfield = '';
2275 }
2276 $res = $link->fetchAll($links, $object->element, $object->id, $sortfield, $sortorder);
2277 $param .= (isset($object->id) && !preg_match('/&id='.$object->id.'/i', $param) ? '&id='.$object->id : '');
2278
2279 $permissiontoedit = $permissiontodelete;
2280
2281 print '<!-- listOfLinks -->'."\n";
2282
2283 $morehtmlright = '';
2284 if (!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) {
2285 $morehtmlright .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', 'javascript:console.log("open addlink form"); jQuery(".divlinkfile").toggle(); void(0);', '', $permissiontoedit);
2286 }
2287
2288 // Show list of associated links
2289 print load_fiche_titre($langs->trans("LinkedFiles"), $morehtmlright, 'link', 0, '', 'table-list-of-links');
2290
2291 if (!empty($moreoptions) && $moreoptions['afterlinktitle']) {
2292 print '<div class="divlinkfile'.((!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) ? ' hidden' : '').'">'.$moreoptions['afterlinktitle'].'</div>';
2293 }
2294
2295 print '<form action="'.$_SERVER['PHP_SELF'].($param ? '?'.$param : '').'" id="'.$htmlname.'" method="POST">';
2296 print '<input type="hidden" name="token" value="'.newToken().'">';
2297 print '<div class="div-table-responsive-no-min">';
2298
2299 print '<table class="liste noborder nobottom centpercent">';
2300 print '<tr class="liste_titre">';
2302 $langs->trans("Links"),
2303 $_SERVER['PHP_SELF'],
2304 "name",
2305 "",
2306 $param,
2307 '',
2308 $sortfield,
2309 $sortorder,
2310 ''
2311 );
2313 "",
2314 "",
2315 "",
2316 "",
2317 "",
2318 '',
2319 '',
2320 '',
2321 'right '
2322 );
2324 $langs->trans("Date"),
2325 $_SERVER['PHP_SELF'],
2326 "date",
2327 "",
2328 $param,
2329 '',
2330 $sortfield,
2331 $sortorder,
2332 'center '
2333 );
2335 '',
2336 $_SERVER['PHP_SELF'],
2337 "",
2338 "",
2339 $param,
2340 '',
2341 '',
2342 '',
2343 'center '
2344 );
2345 // Shared or not - Hash of file
2346 print_liste_field_titre('', '', '');
2347 print '</tr>';
2348 $nboflinks = count($links);
2349 if ($nboflinks > 0) {
2350 include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
2351 }
2352 foreach ($links as $key => $link) {
2353 print '<tr class="oddeven">';
2354 //edit mode
2355 if ($action == 'update' && (int) $selected === (int) $link->id && $permissiontoedit) {
2356 print '<td>';
2357 print '<input type="hidden" name="id" value="'.$object->id.'">';
2358 print '<input type="hidden" name="linkid" value="'.$link->id.'">';
2359 print '<input type="hidden" name="action" value="confirm_updateline">';
2360 print $langs->trans('Link').': <input type="text" name="link" value="'.$link->url.'">';
2361 print '</td>';
2362 print '<td>';
2363 print $langs->trans('Label').': <input type="text" name="label" value="'.dol_escape_htmltag($link->label).'">';
2364 print '</td>';
2365 print '<td class="center">'.dol_print_date(dol_now(), "dayhour", "tzuser").'</td>';
2366 print '<td class="right">';
2367 print '<label for="idshareenabled'.$key.'">'.$langs->trans("LinkSharedViaALink").'</label> ';
2368 print '<input class="inline-block" type="checkbox" id="idshareenabled'.$key.'" name="shareenabled"'.($link->share ? ' checked="checked"' : '').' /> ';
2369 print '</td>';
2370 print '<td class="right">';
2371 print '<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
2372 print '<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
2373 print '</td>';
2374 } else {
2375 print '<td>';
2376 print img_picto('', 'globe').' ';
2377 print '<a data-ajax="false" href="'.$link->url.'" target="_blank" rel="noopener noreferrer">';
2378 print dol_escape_htmltag($link->label);
2379 print '</a>';
2380 print '</td>'."\n";
2381 print '<td class="right"></td>';
2382 print '<td class="center">'.dol_print_date($link->datea, "dayhour", "tzuser").'</td>';
2383 print '<td class="center">';
2384 if ($link->share) {
2386 $urlwithouturlroot = preg_replace('/' . preg_quote(DOL_URL_ROOT, '/') . '$/i', '', trim($dolibarr_main_url_root));
2387 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT; // This is to use external domain name found into config file
2388 $fulllink = $urlwithroot.'/document.php?type=link&hashp=' . $link->share;
2389
2390 print '<a href="'.$fulllink.'" target="_blank" rel="noopener">'.img_picto($langs->trans("FileSharedViaALink"), 'globe').'</a> ';
2391 print '<input type="text" class="centpercentminusx minwidth200imp nopadding small downloadexternallink" id="downloadlink'.$link->id.'" name="downloadexternallink" title="'.dol_escape_htmltag($langs->trans("LinkSharedViaALink")).'" value="'.dol_escape_htmltag($fulllink).'" spellcheck="false">';
2392 }
2393 print '</td>';
2394 print '<td class="right">';
2395 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
2396 if ($permissiontodelete) {
2397 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
2398 } else {
2399 print '&nbsp;';
2400 }
2401 print '</td>';
2402 }
2403 print "</tr>\n";
2404 }
2405 if ($nboflinks == 0) {
2406 print '<tr class="oddeven"><td colspan="5">';
2407 print '<span class="opacitymedium">'.$langs->trans("NoLinkFound").'</span>';
2408 print '</td></tr>';
2409 }
2410 print "</table>";
2411
2412 print '</form>';
2413 print '</div>';
2414 return $nboflinks;
2415 }
2416
2417
2428 public function showPreview($file, $modulepart, $relativepath, $ruleforpicto = 0, $param = '')
2429 {
2430 global $langs, $conf;
2431
2432 $out = '';
2433 if (($conf->browser->layout != 'phone' || getDolGlobalString('MAIN_SHOW_PREVIEW_PICTO_EVEN_ON_PHONE')) && !empty($conf->use_javascript_ajax)) {
2434 $urladvancedpreview = getAdvancedPreviewUrl($modulepart, $relativepath, 1, $param); // Return if a file is qualified for preview.
2435 if (count($urladvancedpreview)) {
2436 $out .= '<a class="pictopreview '.$urladvancedpreview['css'].'" href="'.$urladvancedpreview['url'].'"'.(empty($urladvancedpreview['mime']) ? '' : ' mime="'.$urladvancedpreview['mime'].'"').' '.(empty($urladvancedpreview['target']) ? '' : ' target="'.$urladvancedpreview['target'].'"').'>';
2437 //$out.= '<a class="pictopreview">';
2438 if (empty($ruleforpicto)) {
2439 $out .= img_picto('', 'search-plus', 'class="pictofixedwidth"');
2440 } else {
2441 $out .= img_mime($relativepath, $langs->trans('Preview').' '.$file['name'], 'pictofixedwidth');
2442 }
2443 $out .= '</a>';
2444 } else {
2445 if ($ruleforpicto < 0) {
2446 $out .= img_picto('', 'generic', '', 0, 0, 0, '', 'paddingright pictofixedwidth');
2447 }
2448 }
2449 }
2450 return $out;
2451 }
2452}
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
global $dolibarr_main_url_root
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:475
Class to manage bank accounts.
Class for managing the social charges.
Class to manage predefined suppliers products.
Class to manage customers orders.
Class to manage ECM files.
Class to manage Trips and Expenses.
Class to manage suppliers invoices.
Class to manage invoices.
Class to generate html code for admin pages.
Class to offer components to list and upload files.
showImageToEdit(string $htmlname, string $modulepart, string $dirformainimage, string $subdirformainimage, string $fileformainimage)
Show an image with feature to edit it.
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.
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='', $moreoptions=array())
Show list of documents in $filearray (may be they are all in same directory but may not) This also sy...
form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object=null, $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.
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.
listOfLinks($object, $permissiontodelete=1, $action=null, $selected=null, $param='', $htmlname='formaddlink', $moreoptions=array())
Show array with linked files.
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:35
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($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($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($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.
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.
Class to manage VAT - Value-added tax (also known in French as TVA - Taxe sur la valeur ajoutée)
Definition tva.class.php:39
Class to manage Dolibarr users.
dol_filemtime($pathoffile)
Return time of a file.
dol_filesize($pathoffile)
Return size of a file.
completeFileArrayWithDatabaseInfo(&$filearray, $relativedir, $object=null)
Complete $filearray with data from database.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_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:64
dol_now($mode='gmt')
Return date for now.
dol_print_size($size, $shortvalue=0, $shortunit=0)
Return string with formatted size.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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 the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
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.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify 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.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
if(!defined( 'IMAGETYPE_WEBP')) getDefaultImageSizes()
Return default values for image sizes.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
getMaxFileSizeArray()
Return the max allowed for file upload.