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