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-2026 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="'.dolPrintHTMLForAttribute($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 (is_object($module) && 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 $parameters = array('tmpout' => &$tmpout, 'colspan' => ($colspan + $colspanmore), 'socid' => (isset($GLOBALS['socid']) ? $GLOBALS['socid'] : ''), 'id' => (isset($GLOBALS['id']) ? $GLOBALS['id'] : ''), 'modulepart' => $modulepart, 'relativepath' => $relativepath);
1080 $res = $hookmanager->executeHooks('formBuilddocLineOptions', $parameters, $file);
1081 if (empty($res)) {
1082 $tmpout .= $hookmanager->resPrint; // Complete line
1083 $tmpout .= '</tr>';
1084 } else {
1085 $tmpout = $hookmanager->resPrint; // Replace all $out
1086 }
1087 } else {
1088 $tmpout .= '</tr>';
1089 }
1090
1091 $out .= $tmpout;
1092 }
1093
1094 $this->numoffiles++;
1095 }
1096 // Loop on each link found
1097 if (is_array($link_list)) {
1098 $colspan = 2;
1099
1100 foreach ($link_list as $file) {
1101 $out .= '<tr class="oddeven">';
1102 $out .= '<td colspan="'.$colspan.'" class="maxwidhtonsmartphone">';
1103 $out .= '<a data-ajax="false" href="'.$file->url.'" target="_blank" rel="noopener noreferrer">';
1104 $out .= $file->label;
1105 $out .= '</a>';
1106 $out .= '</td>';
1107 $out .= '<td class="right">';
1108 $out .= dol_print_date($file->datea, 'dayhour');
1109 $out .= '</td>';
1110 // for share link of files
1111 $out .= '<td></td>';
1112 if ($delallowed || $printer || $morepicto) {
1113 $out .= '<td></td>';
1114 }
1115 if ($colspanmore) {
1116 $out .= '<td colspan="'.$colspanmore.'"></td>';
1117 }
1118 $out .= '</tr>'."\n";
1119 }
1120 $this->numoffiles++;
1121 }
1122
1123 if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
1124 $addcolumforpicto = ($delallowed || $printer || $morepicto);
1125 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
1126 $out .= '<tr><td colspan="'.($colspan + $colspanmore).'"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>'."\n";
1127 }
1128 }
1129
1130 if ($headershown) {
1131 // end of table
1132 $out .= "</table>\n";
1133 $out .= "</div>\n";
1134 if ($genallowed) {
1135 if (empty($noform)) {
1136 $out .= '</form>'."\n";
1137 }
1138 }
1139 }
1140 $out .= '<!-- End show_document -->'."\n";
1141
1142 $out .= '<script>
1143 jQuery(document).ready(function() {
1144 var selectedValue = $(".selectformat").val();
1145
1146 if (selectedValue === "excel2007" || selectedValue === "tsv") {
1147 $(".forhide").prop("disabled", true).hide();
1148 } else {
1149 $(".forhide").prop("disabled", false).show();
1150 }
1151 });
1152 </script>';
1153 //return ($i?$i:$headershown);
1154 return $out;
1155 }
1156
1170 public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter = '', $morecss = 'valignmiddle', $allfiles = 0)
1171 {
1172 global $conf, $langs;
1173
1174 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
1175
1176 $out = '';
1177 $this->infofiles = array('nboffiles' => 0, 'extensions' => array(), 'files' => array());
1178
1179 $entity = 1; // Without multicompany
1180
1181 // Get object entity
1182 if (isModEnabled('multicompany')) {
1183 $regs = array();
1184 preg_match('/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir, '/').'$/', $filedir, $regs);
1185 $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1); // If entity id not found in $filedir this is entity 1 by default
1186 }
1187
1188 // Get list of files starting with name of ref (Note: files with '^ref\.extension' are generated files, files with '^ref-...' are uploaded files)
1189 if ($allfiles || getDolGlobalString('MAIN_SHOW_ALL_FILES_ON_DOCUMENT_TOOLTIP')) {
1190 $filterforfilesearch = '^'.preg_quote(basename($modulesubdir), '/');
1191 } else {
1192 $filterforfilesearch = '^'.preg_quote(basename($modulesubdir), '/').'\.';
1193 }
1194 $file_list = dol_dir_list($filedir, 'files', 0, $filterforfilesearch, '\.meta$|\.png$'); // We also discard .meta and .png preview
1195
1196 //var_dump($file_list);
1197 // For ajax treatment
1198 $out .= '<!-- html.formfile::getDocumentsLink -->'."\n";
1199 if (!empty($file_list)) {
1200 $out = '<dl class="dropdown inline-block">
1201 <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto('', 'listlight', '', 0, 0, 0, '', $morecss).'</a></dt>
1202 <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1203 $tmpout = '';
1204
1205 // Loop on each file found
1206 $found = 0;
1207 $i = 0;
1208 foreach ($file_list as $file) {
1209 $i++;
1210 if ($filter && !preg_match('/'.$filter.'/i', $file["name"])) {
1211 continue; // Discard this. It does not match provided filter.
1212 }
1213
1214 $found++;
1215 // Define relative path for download link (depends on module)
1216 $relativepath = $file["name"]; // Cas general
1217 if ($modulesubdir) {
1218 $relativepath = (string) $modulesubdir."/".$file["name"]; // Cas propal, facture...
1219 }
1220 // Autre cas
1221 if ($modulepart == 'donation') {
1222 $relativepath = (string) get_exdir($modulesubdir, 2, 0, 0, null, 'donation').$file["name"];
1223 }
1224 if ($modulepart == 'export') {
1225 $relativepath = (string) $file["name"];
1226 }
1227
1228 $this->infofiles['nboffiles']++;
1229 $this->infofiles['files'][] = $file['fullname'];
1230 $ext = (string) pathinfo($file['name'], PATHINFO_EXTENSION); // pathinfo returns a string here (cast for static analysis)
1231 if (!array_key_exists($ext, $this->infofiles['extensions'])) {
1232 $this->infofiles['extensions'][$ext] = 1;
1233 } else {
1234 $this->infofiles['extensions'][$ext]++;
1235 }
1236
1237 // Preview
1238 if (!empty($conf->use_javascript_ajax) && ($conf->browser->layout != 'phone')) {
1239 $tmparray = getAdvancedPreviewUrl($modulepart, $relativepath, 1, '&entity='.$entity);
1240 if ($tmparray && $tmparray['url']) {
1241 $tmpout .= '<li><a href="'.$tmparray['url'].'"'.($tmparray['css'] ? ' class="'.$tmparray['css'].'"' : '').($tmparray['mime'] ? ' mime="'.$tmparray['mime'].'"' : '').($tmparray['target'] ? ' target="'.$tmparray['target'].'"' : '').'>';
1242 //$tmpout.= img_picto('','detail');
1243 $tmpout .= img_picto('', 'search-plus', 'class="paddingright"');
1244 $tmpout .= $langs->trans("Preview").' '.$ext.'</a></li>';
1245 }
1246 }
1247
1248 // Download
1249 $tmpout .= '<li class="nowrap"><a class="pictopreview nowrap" ';
1250 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
1251 $tmpout .= 'target="_blank" ';
1252 }
1253 $tmpout .= 'href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&amp;entity='.$entity.'&amp;file='.urlencode($relativepath).'"';
1254 $mime = dol_mimetype($relativepath, '', 0);
1255 if (preg_match('/text/', $mime)) {
1256 $tmpout .= ' target="_blank" rel="noopener noreferrer"';
1257 }
1258 $tmpout .= '>';
1259 $tmpout .= img_mime($relativepath, $file["name"]);
1260 $tmpout .= $langs->trans("Download").' '.$ext;
1261 $tmpout .= '</a></li>'."\n";
1262 }
1263 $out .= $tmpout;
1264 $out .= '</ul></div></dd>
1265 </dl>';
1266
1267 if (!$found) {
1268 $out = '';
1269 }
1270 } else {
1271 // TODO Add link to regenerate doc ?
1272 //$out.= '<div id="gen_pdf_'.$modulesubdir.'" class="linkobject hideobject">'.img_picto('', 'refresh').'</div>'."\n";
1273 }
1274
1275 return $out;
1276 }
1277
1278
1279 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1313 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())
1314 {
1315 // phpcs:enable
1316 global $user, $conf, $langs, $hookmanager, $form;
1317 global $sortfield, $sortorder;
1319
1320 if ($disablecrop == -1) {
1321 $disablecrop = 1;
1322 // Values here must be supported by the photos_resize.php page.
1323 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'))) {
1324 $disablecrop = 0;
1325 }
1326 }
1327
1328 // Define relative path used to store the file
1329 if (empty($relativepath)) {
1330 $relativepath = (!empty($object->ref) ? dol_sanitizeFileName($object->ref) : '').'/';
1331 if (!empty($object->element) && $object->element == "societe" && !empty($object->id)) {
1332 $relativepath = ($object->id).'/';
1333 } elseif (!empty($object->element) && $object->element == 'invoice_supplier') {
1334 $relativepath = get_exdir($object->id, 2, 0, 0, $object, 'invoice_supplier').$relativepath; // TODO Call using a defined value for $relativepath
1335 } elseif (!empty($object->element) && $object->element == 'project_task') {
1336 $relativepath = 'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1337 }
1338 }
1339 // For backward compatibility, we detect file stored into an old path
1340 if (getDolGlobalInt('PRODUCT_USE_OLD_PATH_FOR_PHOTO') && isset($filearray[0]) && $filearray[0]['level1name'] == 'photos') {
1341 $relativepath = preg_replace('/^.*\/produit\//', '', $filearray[0]['path']).'/';
1342 }
1343
1344 // Defined relative dir to DOL_DATA_ROOT
1345 $relativedir = '';
1346 if ($upload_dir) {
1347 $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $upload_dir);
1348 $relativedir = preg_replace('/^[\\/]/', '', $relativedir);
1349 }
1350
1351 // For example here $upload_dir = '/pathtodocuments/commande/SO2001-123/'
1352 // For example here $upload_dir = '/pathtodocuments/tax/vat/1'
1353 // 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'
1354
1355 $hookmanager->initHooks(array('formfile'));
1356 $parameters = array(
1357 'filearray' => $filearray,
1358 'modulepart' => $modulepart,
1359 'param' => $param,
1360 'forcedownload' => $forcedownload,
1361 'relativepath' => $relativepath, // relative filename to module dir
1362 'relativedir' => $relativedir, // relative dirname to DOL_DATA_ROOT
1363 'permtodelete' => $permonobject,
1364 'useinecm' => $useinecm,
1365 'textifempty' => $textifempty,
1366 'maxlength' => $maxlength,
1367 'title' => $title,
1368 'url' => $url
1369 );
1370 // @phan-suppress-next-line PhanTypeMismatchArgumentNullable
1371 $reshook = $hookmanager->executeHooks('showFilesList', $parameters, $object);
1372
1373 if (!empty($reshook)) { // null or '' for bypass
1374 return $reshook;
1375 } else {
1376 if (!is_object($form)) {
1377 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
1378 $form = new Form($this->db);
1379 }
1380
1381 if (!preg_match('/&id=/', $param) && isset($object->id)) {
1382 $param .= '&id='.$object->id;
1383 }
1384 $relativepathwihtoutslashend = preg_replace('/\/$/', '', $relativepath);
1385 if ($relativepathwihtoutslashend) {
1386 $param .= '&file='.urlencode($relativepathwihtoutslashend);
1387 }
1388
1389 if ($permtoeditline < 0) { // Old behaviour for backward compatibility. New feature should call method with value 0 or 1
1390 $permtoeditline = 0;
1391 if (in_array($modulepart, array('product', 'produit', 'service'))) {
1392 '@phan-var-force Product $object';
1393 if ($user->hasRight('produit', 'creer') && $object->type == Product::TYPE_PRODUCT) {
1394 $permtoeditline = 1;
1395 }
1396 if ($user->hasRight('service', 'creer') && $object->type == Product::TYPE_SERVICE) {
1397 $permtoeditline = 1;
1398 }
1399 }
1400 }
1401 if (!getDolGlobalString('MAIN_UPLOAD_DOC')) {
1402 $permtoeditline = 0;
1403 $permonobject = 0;
1404 }
1405 if (empty($url)) {
1406 $url = $_SERVER["PHP_SELF"];
1407 }
1408
1409
1410 // Show title of list of existing files
1411 $morehtmlright = '';
1412 if (!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) {
1413 $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);';
1414 $morehtmlright .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', $tmpurlforbutton, '', $permtoeditline);
1415 }
1416
1417 if ((empty($useinecm) || $useinecm == 3 || $useinecm == 6) && $title != 'none') {
1418 print load_fiche_titre($title ? $title : $langs->trans("AttachedFiles"), $morehtmlright, 'file-upload', 0, '', 'table-list-of-attached-files');
1419 }
1420 if (!empty($moreoptions) && $moreoptions['afteruploadtitle']) {
1421 print '<!-- Add form from $moreoptions[\'afteruploadtitle\'] -->';
1422 print '<div class="divattachnewfile'.((!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) ? ' hidden' : '').'">'.$moreoptions['afteruploadtitle'].'</div>';
1423 }
1424
1425 // Show the table
1426 print '<!-- html.formfile::list_of_documents -->'."\n";
1427 if (GETPOST('action', 'aZ09') == 'editfile' && $permtoeditline) {
1428 print '<form action="'.$_SERVER["PHP_SELF"].'?'.$param.'" method="POST">';
1429 print '<input type="hidden" name="token" value="'.newToken().'">';
1430 print '<input type="hidden" name="action" value="renamefile">';
1431 print '<input type="hidden" name="id" value="'.(is_object($object) ? $object->id : '').'">';
1432 print '<input type="hidden" name="modulepart" value="'.$modulepart.'">';
1433 }
1434
1435 print '<div class="div-table-responsive-no-min"'.($moreattrondiv ? ' '.$moreattrondiv : '').'>';
1436 print '<table id="tablelines" class="centpercent liste noborder nobottom">'."\n";
1437
1438 if (!empty($addfilterfields)) {
1439 print '<tr class="liste_titre nodrag nodrop">';
1440 print '<td><input type="search_doc_ref" value="'.dol_escape_htmltag(GETPOST('search_doc_ref', 'alpha')).'"></td>';
1441 print '<td></td>';
1442 print '<td></td>';
1443 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1444 print '<td></td>';
1445 }
1446 print '<td></td>';
1447 print '<td></td>';
1448 if (empty($disablemove) && count($filearray) > 1) {
1449 print '<td></td>';
1450 }
1451 print "</tr>\n";
1452 }
1453
1454 // Get list of files stored into database for the same relative directory
1455 if ($relativedir) {
1456 completeFileArrayWithDatabaseInfo($filearray, $relativedir, $object);
1457 '@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';
1458
1459 //var_dump($sortfield.' - '.$sortorder);
1460 if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
1461 $filearray = dol_sort_array($filearray, $sortfield, $sortorder, 1);
1462 }
1463 }
1464
1465 print '<tr class="liste_titre nodrag nodrop">';
1466 // Name
1467 print_liste_field_titre('Documents2', $url, "name", "", $param, '', $sortfield, $sortorder, 'left ');
1468 // Size
1469 print_liste_field_titre('Size', $url, "size", "", $param, '', $sortfield, $sortorder, 'right ');
1470 // Date
1471 print_liste_field_titre('Date', $url, "date", "", $param, '', $sortfield, $sortorder, 'center ');
1472 // Preview
1473 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1474 print_liste_field_titre('', $url, "", "", $param, '', $sortfield, $sortorder, 'center '); // Preview
1475 }
1476 // Shared or not - Hash of file
1477 if (empty($moreoptions['hideshared'])) {
1478 //print_liste_field_titre('Shared');
1480 }
1481 // Custom action buttons
1482 if (!empty($moreoptions['buttons'])) {
1484 }
1485 // Action button
1487 if (empty($disablemove) && count($filearray) > 1) {
1488 // Move
1490 }
1491 print "</tr>\n";
1492
1493 $nboffiles = count($filearray);
1494 if ($nboffiles > 0) {
1495 include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
1496 }
1497
1498 $i = 0;
1499 $nboflines = 0;
1500 $lastrowid = 0;
1501 $parametersByDefault = array(
1502 'modulepart' => $modulepart,
1503 'relativepath' => $relativepath,
1504 'permtoedit' => $permtoeditline,
1505 'permonobject' => $permonobject,
1506 );
1507 foreach ($filearray as $key => $file) { // filearray must be only files here
1508 if ($file['name'] != '.' && $file['name'] != '..' && !preg_match('/\.meta$/i', $file['name'])) {
1509 if (array_key_exists('rowid', $filearray[$key]) && $filearray[$key]['rowid'] > 0) {
1510 $lastrowid = $filearray[$key]['rowid'];
1511 }
1512 //var_dump($filearray[$key]);
1513
1514 // get specific parameters from file attributes if set or get default ones
1515 $modulepart = ($file['modulepart'] ?? $parametersByDefault['modulepart']);
1516 $relativepath = ($file['relativepath'] ?? $parametersByDefault['relativepath']);
1517 $permtoeditline = ($file['permtoedit'] ?? $parametersByDefault['permtoedit']);
1518 $permonobject = ($file['permonobject'] ?? $parametersByDefault['permonobject']);
1519
1520 // Note: for supplier invoice, $modulepart may be already 'facture_fournisseur' and $relativepath may be already '6/1/SI2210-0013/'
1521 if (empty($relativepath) || empty($modulepart)) {
1522 $filepath = $file['level1name'].'/'.$file['name'];
1523 } else {
1524 $filepath = $relativepath.$file['name'];
1525 }
1526 if (empty($modulepart)) {
1527 $modulepart = basename(dirname($file['path']));
1528 }
1529 if (empty($relativepath)) {
1530 $relativepath = preg_replace('/\/(.+)/', '', $filepath) . '/';
1531 }
1532
1533 $editline = 0;
1534 $nboflines++;
1535 print '<!-- Line list_of_documents '.$key.' relativepath = '.$relativepath.' -->'."\n";
1536 // Do we have entry into database ?
1537
1538 print '<!-- In database: position='.(array_key_exists('position', $filearray[$key]) ? $filearray[$key]['position'] : 0).' -->'."\n";
1539 print '<tr class="oddeven" id="row-'.((array_key_exists('rowid', $filearray[$key]) && $filearray[$key]['rowid'] > 0) ? $filearray[$key]['rowid'] : 'AFTER'.$lastrowid.'POS'.($i + 1)).'">';
1540
1541
1542 // File name
1543 print '<td class="minwidth200imp tdoverflowmax300" title="'.dolPrintHTMLForAttribute($file['name']).'">';
1544
1545 // Show file name with link to download
1546 //print "XX".$file['name']; //$file['name'] must be utf8
1547 print '<a class="paddingright valignmiddle" ';
1548 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
1549 print 'target="_blank" ';
1550 }
1551 print 'href="'.DOL_URL_ROOT.'/document.php?modulepart='.urlencode($modulepart);
1552 if ($forcedownload) {
1553 print '&attachment=1';
1554 }
1555 if (!empty($object->entity)) {
1556 print '&entity='.((int) $object->entity);
1557 }
1558 print '&file='.urlencode($filepath);
1559 print '">';
1560 print img_mime($file['name'], $file['name'].' ('.dol_print_size($file['size'], 0, 0).')', 'inline-block valignmiddle paddingright');
1561 if ($showrelpart == 1) {
1562 print $relativepath;
1563 }
1564 //print dol_trunc($file['name'],$maxlength,'middle');
1565
1566 //var_dump(dirname($filepath).' - '.dirname(GETPOST('urlfile', 'alpha')));
1567
1568 if (GETPOST('action', 'aZ09') == 'editfile' && $file['name'] == basename(GETPOST('urlfile', 'alpha')) && dirname($filepath) == dirname(GETPOST('urlfile', 'alpha'))) {
1569 print '</a>';
1570 $section_dir = dirname(GETPOST('urlfile', 'alpha'));
1571 if (!preg_match('/\/$/', $section_dir)) {
1572 $section_dir .= '/';
1573 }
1574 print '<input type="hidden" name="section_dir" value="'.$section_dir.'">';
1575 print '<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file['name']).'">';
1576 print '<input type="text" name="renamefileto" class="centpercentminusx" value="'.dol_escape_htmltag($file['name']).'" spellcheck="false">';
1577 $editline = 1;
1578 } else {
1579 $filenametoshow = preg_replace('/\.noexe$/', '', $file['name']);
1580 print dolPrintHTML(dol_trunc($filenametoshow, 200));
1581 print '</a>';
1582 }
1583 // Preview link
1584 if (!$editline) {
1585 print $this->showPreview($file, $modulepart, $filepath, 0, '&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
1586 }
1587
1588 print "</td>\n";
1589
1590 // Size
1591 $sizetoshow = dol_print_size($file['size'], 1, 1);
1592 $sizetoshowbytes = dol_print_size($file['size'], 0, 1);
1593 print '<td class="right nowraponall">';
1594 if ($sizetoshow == $sizetoshowbytes) {
1595 print $sizetoshow;
1596 } else {
1597 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1598 }
1599 print '</td>';
1600
1601 // Date
1602 print '<td class="center nowraponall">'.dol_print_date($file['date'], "dayhour", "tzuser").'</td>';
1603
1604 // Preview
1605 $fileinfo = pathinfo($file['name']);
1606 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1607 print '<td class="center">';
1608 if (image_format_supported($file['name']) >= 0) {
1609 if ($useinecm == 5 || $useinecm == 6) {
1610 $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.
1611 } else {
1612 $smallfile = getImageFileNameForSize($file['name'], '_small'); // For new thumbs using same ext (in lower case however) than original
1613 }
1614 if (!dol_is_file($file['path'].'/'.$smallfile)) {
1615 $smallfile = getImageFileNameForSize($file['name'], '_small', '.png'); // For backward compatibility of old thumbs that were created with filename in lower case and with .png extension
1616 }
1617 if (!dol_is_file($file['path'].'/'.$smallfile)) {
1618 $smallfile = getImageFileNameForSize($file['name'], ''); // This is in case no _small image exist
1619 }
1620 //print $file['path'].'/'.$smallfile.'<br>';
1621
1622 $urlforhref = getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo['filename'].'.'.strtolower($fileinfo['extension']), 1, '&entity='.(empty($object->entity) ? $conf->entity : $object->entity));
1623 if (empty($urlforhref)) {
1624 $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']));
1625 print '<a href="'.$urlforhref.'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1626 } else {
1627 print '<a href="'.$urlforhref['url'].'" class="'.$urlforhref['css'].'" target="'.$urlforhref['target'].'" mime="'.$urlforhref['mime'].'">';
1628 }
1629 print '<img class="photo maxwidth200 shadow valignmiddle"';
1630 if ($useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1631 print ' height="20"';
1632 } else {
1633 //print ' style="max-height: '.$maxheightmini.'px"';
1634 print ' style="max-height: 24px"';
1635 }
1636 print ' src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.urlencode($modulepart).'&entity='.(empty($object->entity) ? $conf->entity : $object->entity).'&file='.urlencode($relativepath.$smallfile);
1637 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.
1638 print '&cache='.urlencode((string) $filearray[$key]['date']);
1639 }
1640 print '" title="">';
1641 print '</a>';
1642 }
1643 print '</td>';
1644 }
1645
1646 // Shared or not - Hash of file
1647 if (empty($moreoptions['hideshared'])) {
1648 print '<td class="center nowraponsmartphone">';
1649 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
1650 if ($editline) {
1651 print '<label for="idshareenabled'.$key.'">'.$langs->trans("FileSharedViaALink").'</label> ';
1652 print '<input class="inline-block" type="checkbox" id="idshareenabled'.$key.'" name="shareenabled"'.($file['share'] ? ' checked="checked"' : '').' /> ';
1653 } else {
1654 if ($file['share']) {
1655 // Define $urlwithroot
1656 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
1657 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
1658 //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
1659
1660 //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
1661 $forcedownload = getDolGlobalInt('MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1662 $paramlink = '';
1663 if (!empty($file['share'])) {
1664 $paramlink .= /* ($paramlink ? '&' : ''). */'hashp='.$file['share']; // Hash for public share
1665 }
1666 if ($forcedownload) {
1667 $paramlink .= ($paramlink ? '&' : '').'attachment=1';
1668 }
1669
1670 $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
1671
1672 print '<!-- shared link -->';
1673 print '<a href="'.$fulllink.'" target="_blank" rel="noopener" data-showidonhover="downloadlink'.$filearray[$key]['rowid'].'">';
1674 print img_picto($langs->trans("FileSharedViaALink"), 'collab');
1675 print '</a> ';
1676 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">';
1677 } else {
1678 //print '<span class="opacitymedium">'.$langs->trans("FileNotShared").'</span>';
1679 }
1680 }
1681 }
1682 print '</td>';
1683 }
1684
1685 // Custom actions buttons
1686 if (!empty($moreoptions['buttons'])) {
1687 print '<td>';
1688 foreach ($moreoptions['buttons'] as $moreoptval) {
1689 print '<a href="'.$moreoptval['url'].'&urlfile='.urlencode($file['name']).'">';
1690 print $moreoptval['picto'];
1691 print '</a>';
1692 }
1693 print '</td>';
1694 }
1695
1696 // Hard coded common actions buttons (1 column or 2 if !disablemove)
1697 if (!$editline) {
1698 // Delete or view link
1699 // ($param must start with &)
1700 print '<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1701 if ($useinecm == 1 || $useinecm == 5) { // ECM manual tree only
1702 // $section is inside $param
1703 $newparam = preg_replace('/&file=.*$/', '', $param); // We don't need param file=
1704 $backtopage = DOL_URL_ROOT.'/ecm/index.php?&section_dir='.urlencode($relativepath).$newparam;
1705 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>';
1706 }
1707
1708 if (empty($useinecm) || $useinecm == 2 || $useinecm == 3 || $useinecm == 6) { // 6=Media file manager
1709 $newmodulepart = $modulepart;
1710 if (in_array($modulepart, array('product', 'produit', 'service'))) {
1711 $newmodulepart = 'produit|service';
1712 }
1713 if (image_format_supported($file['name']) > 0) {
1714 if ($permtoeditline) {
1715 $moreparaminurl = '';
1716 if (!empty($object->id) && $object->id > 0) {
1717 $moreparaminurl .= '&id='.$object->id;
1718 } elseif (GETPOST('website', 'alpha')) {
1719 $moreparaminurl .= '&website='.GETPOST('website', 'alpha');
1720 }
1721 // Set the backtourl
1722 if ($modulepart == 'medias' && !GETPOST('website')) {
1723 $moreparaminurl .= '&backtourl='.urlencode(DOL_URL_ROOT.'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.'&section_dir='.$relativepath);
1724 }
1725 // Link to convert into webp
1726 if (!preg_match('/\.webp$/i', $file['name'])) {
1727 if ($modulepart == 'medias' && !GETPOST('website')) {
1728 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>';
1729 } elseif ($modulepart == 'medias' && GETPOST('website')) {
1730 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>';
1731 }
1732 }
1733 }
1734 }
1735 if (!$disablecrop && image_format_supported($file['name']) > 0) {
1736 if ($permtoeditline) {
1737 // Link to resize
1738 $moreparaminurl = '';
1739 if (!empty($object->id) && $object->id > 0) {
1740 $moreparaminurl .= '&id='.$object->id;
1741 } elseif (GETPOST('website', 'alpha')) {
1742 $moreparaminurl .= '&website='.GETPOST('website', 'alpha');
1743 }
1744 // Set the backtourl
1745 if ($modulepart == 'medias' && !GETPOST('website')) {
1746 $moreparaminurl .= '&backtourl='.urlencode(DOL_URL_ROOT.'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.'&section_dir='.$relativepath);
1747 }
1748 //var_dump($moreparaminurl);
1749 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>';
1750 }
1751 }
1752
1753 if ($permtoeditline) {
1754 $paramsectiondir = (in_array($modulepart, array('medias', 'ecm')) ? '&section_dir='.urlencode($relativepath) : '');
1755 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>';
1756 }
1757 }
1758 // Output link to delete file
1759 if ($permonobject) {
1760 $useajax = 1;
1761 if (!empty($conf->dol_use_jmobile)) {
1762 $useajax = 0;
1763 }
1764 if (empty($conf->use_javascript_ajax)) {
1765 $useajax = 0;
1766 }
1767 if (getDolGlobalString('MAIN_ECM_DISABLE_JS')) {
1768 $useajax = 0;
1769 }
1770
1771 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>';
1772 }
1773 print "</td>";
1774
1775 if (empty($disablemove) && count($filearray) > 1) {
1776 if ($nboffiles > 1 && $conf->browser->layout != 'phone') {
1777 print '<td class="linecolmove tdlineupdown center">';
1778 if ($i > 0) {
1779 print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=up&token='.newToken().'&rowid='.$object->id.'">'.img_up('default', 0, 'imgupforline').'</a>';
1780 }
1781 if ($i < ($nboffiles - 1)) {
1782 print '<a class="lineupdown" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=down&token='.newToken().'&rowid='.$object->id.'">'.img_down('default', 0, 'imgdownforline').'</a>';
1783 }
1784 print '</td>';
1785 } else {
1786 print '<td'.(($conf->browser->layout != 'phone') ? ' class="linecolmove tdlineupdown center"' : ' class="linecolmove center"').'>';
1787 print '</td>';
1788 }
1789 }
1790 } else {
1791 print '<td class="right">';
1792 print '<input type="hidden" name="ecmfileid" value="'.(empty($filearray[$key]['rowid']) ? '' : $filearray[$key]['rowid']).'">';
1793 print '<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv("Save")).'">';
1794 print '<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv("Cancel")).'">';
1795 print '</td>';
1796 if (empty($disablemove) && count($filearray) > 1) {
1797 print '<td class="right"></td>';
1798 }
1799 }
1800 print "</tr>\n";
1801
1802 $i++;
1803 }
1804 }
1805 if ($nboffiles == 0) {
1806 $colspan = '6';
1807 if (!empty($moreoptions['buttons'])) {
1808 $colspan++;
1809 }
1810 if (!empty($moreoptions['hideshared'])) {
1811 $colspan++;
1812 }
1813 if (empty($disablemove) && count($filearray) > 1) {
1814 $colspan++; // 6 columns or 7
1815 }
1816 print '<tr class="oddeven"><td colspan="'.$colspan.'">';
1817 if (empty($textifempty)) {
1818 print '<span class="opacitymedium">'.$langs->trans("NoFileFound").'</span>';
1819 } else {
1820 print '<span class="opacitymedium">'.dolPrintHTML($textifempty).'</span>';
1821 }
1822 print '</td></tr>';
1823 }
1824
1825 print "</table>";
1826 print '</div>';
1827
1828 if ($nboflines > 1 && is_object($object)) {
1829 if (!empty($conf->use_javascript_ajax) && $permtoeditline) {
1830 $table_element_line = 'ecm_files'; // used by ajaxrow.tpl.php
1831 include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
1832 }
1833 }
1834
1835 print ajax_autoselect('downloadlink');
1836
1837 if (GETPOST('action', 'aZ09') == 'editfile' && $permtoeditline) {
1838 print '</form>';
1839 }
1840
1841 return $nboffiles;
1842 }
1843 }
1844
1845
1846 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1865 public function list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload = 0, $relativepath = '', $permissiontodelete = 1, $useinecm = 0, $textifempty = '', $maxlength = 0, $url = '', $addfilterfields = 0)
1866 {
1867 // phpcs:enable
1868 global $conf, $langs, $hookmanager, $form;
1869 global $sortfield, $sortorder;
1870 global $search_doc_ref;
1871 global $search_doc_date_start, $search_doc_date_end;
1873
1874 dol_syslog(get_class($this).'::list_of_autoecmfiles upload_dir='.$upload_dir.' modulepart='.$modulepart);
1875
1876 // Show list of documents
1877 if (empty($useinecm) || $useinecm == 6) {
1878 print load_fiche_titre($langs->trans("AttachedFiles"));
1879 }
1880 if (empty($url)) {
1881 $url = $_SERVER["PHP_SELF"];
1882 }
1883
1884 $enablebulkdownload = ($modulepart == 'invoice_supplier');
1885
1886 if (!empty($addfilterfields)) {
1887 print '<form action="'.dol_escape_htmltag($url).'" method="'.($enablebulkdownload ? 'POST' : 'GET').'">';
1888 print '<input type="hidden" name="token" value="'.newToken().'">';
1889 print '<input type="hidden" name="module" value="'.dol_escape_htmltag($modulepart).'">';
1890 if ($sortfield) {
1891 print '<input type="hidden" name="sortfield" value="'.dol_escape_htmltag($sortfield).'">';
1892 }
1893 if ($sortorder) {
1894 print '<input type="hidden" name="sortorder" value="'.dol_escape_htmltag($sortorder).'">';
1895 }
1896 }
1897
1898 print '<div class="div-table-responsive-no-min">';
1899 print '<table class="noborder centpercent">'."\n";
1900
1901 if (!empty($addfilterfields)) {
1902 print '<tr class="liste_titre nodrag nodrop">';
1903 if ($enablebulkdownload) {
1904 print '<td class="liste_titre center">';
1905 print $form->showCheckAddButtons('checkforselect', 0);
1906 print '</td>';
1907 }
1908 // Ref
1909 print '<td class="liste_titre"></td>';
1910 // Name
1911 print '<td class="liste_titre"><input type="text" class="maxwidth100onsmartphone" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).'"></td>';
1912 // Size
1913 print '<td class="liste_titre"></td>';
1914 // Date
1915 print '<td class="liste_titre center">';
1916 if ($enablebulkdownload) {
1917 print '<div class="nowrap">';
1918 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'));
1919 print '</div>';
1920 print '<div class="nowrap">';
1921 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'));
1922 print '</div>';
1923 }
1924 print '</td>';
1925 // Shared and action column
1926 print '<td class="liste_titre right">';
1927 if ($enablebulkdownload) {
1928 print '<button type="submit" class="button smallpaddingimp marginrightonly" name="action" value="download_selected">';
1929 print img_picto('', 'download', 'class="pictofixedwidth"').$langs->trans("Download");
1930 print '</button>';
1931 }
1932 $searchpicto = $form->showFilterButtons();
1933 print $searchpicto;
1934 print '</td>';
1935 print "</tr>\n";
1936 }
1937
1938 print '<tr class="liste_titre">';
1939 if ($enablebulkdownload) {
1940 print '<th class="liste_titre center maxwidthsearch"></th>';
1941 }
1942 $sortref = "fullname";
1943 if ($modulepart == 'invoice_supplier') {
1944 $sortref = 'level1name';
1945 }
1946 print_liste_field_titre("Ref", $url, $sortref, "", $param, '', $sortfield, $sortorder);
1947 print_liste_field_titre("Documents2", $url, "name", "", $param, '', $sortfield, $sortorder);
1948 print_liste_field_titre("Size", $url, "size", "", $param, '', $sortfield, $sortorder, 'right ');
1949 print_liste_field_titre("Date", $url, "date", "", $param, '', $sortfield, $sortorder, 'center ');
1950 print_liste_field_titre("Shared", $url, 'share', '', $param, '', $sortfield, $sortorder, 'right ');
1951 print '</tr>'."\n";
1952
1953 // To show ref or specific information according to view to show (defined by $module)
1954 $object_instance = null;
1955 if ($modulepart == 'company') {
1956 include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1957 $object_instance = new Societe($this->db);
1958 } elseif ($modulepart == 'invoice') {
1959 include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
1960 $object_instance = new Facture($this->db);
1961 } elseif ($modulepart == 'invoice_supplier') {
1962 include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
1963 $object_instance = new FactureFournisseur($this->db);
1964 } elseif ($modulepart == 'propal') {
1965 include_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php';
1966 $object_instance = new Propal($this->db);
1967 } elseif ($modulepart == 'supplier_proposal') {
1968 include_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php';
1969 $object_instance = new SupplierProposal($this->db);
1970 } elseif ($modulepart == 'order') {
1971 include_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php';
1972 $object_instance = new Commande($this->db);
1973 } elseif ($modulepart == 'order_supplier') {
1974 include_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php';
1975 $object_instance = new CommandeFournisseur($this->db);
1976 } elseif ($modulepart == 'contract') {
1977 include_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
1978 $object_instance = new Contrat($this->db);
1979 } elseif ($modulepart == 'product') {
1980 include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
1981 $object_instance = new Product($this->db);
1982 } elseif ($modulepart == 'tax') {
1983 include_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
1984 $object_instance = new ChargeSociales($this->db);
1985 } elseif ($modulepart == 'tax-vat') {
1986 include_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
1987 $object_instance = new Tva($this->db);
1988 } elseif ($modulepart == 'salaries') {
1989 include_once DOL_DOCUMENT_ROOT.'/salaries/class/salary.class.php';
1990 $object_instance = new Salary($this->db);
1991 } elseif ($modulepart == 'project') {
1992 include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
1993 $object_instance = new Project($this->db);
1994 } elseif ($modulepart == 'project_task') {
1995 include_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
1996 $object_instance = new Task($this->db);
1997 } elseif ($modulepart == 'fichinter') {
1998 include_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
1999 $object_instance = new Fichinter($this->db);
2000 } elseif ($modulepart == 'user') {
2001 include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
2002 $object_instance = new User($this->db);
2003 } elseif ($modulepart == 'expensereport') {
2004 include_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php';
2005 $object_instance = new ExpenseReport($this->db);
2006 } elseif ($modulepart == 'holiday') {
2007 include_once DOL_DOCUMENT_ROOT.'/holiday/class/holiday.class.php';
2008 $object_instance = new Holiday($this->db);
2009 } elseif ($modulepart == 'recruitment-recruitmentcandidature') {
2010 include_once DOL_DOCUMENT_ROOT.'/recruitment/class/recruitmentcandidature.class.php';
2011 $object_instance = new RecruitmentCandidature($this->db);
2012 } elseif ($modulepart == 'banque') {
2013 include_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
2014 $object_instance = new Account($this->db);
2015 } elseif ($modulepart == 'bank-statement') {
2016 //include_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
2017 $object_instance = null;
2018 } elseif ($modulepart == 'chequereceipt') {
2019 include_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php';
2020 $object_instance = new RemiseCheque($this->db);
2021 } elseif ($modulepart == 'mrp-mo') {
2022 include_once DOL_DOCUMENT_ROOT.'/mrp/class/mo.class.php';
2023 $object_instance = new Mo($this->db);
2024 } else {
2025 $parameters = array('modulepart' => $modulepart);
2026 $reshook = $hookmanager->executeHooks('addSectionECMAuto', $parameters);
2027 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
2028 if (array_key_exists('classpath', $hookmanager->resArray) && !empty($hookmanager->resArray['classpath'])) {
2029 dol_include_once($hookmanager->resArray['classpath']);
2030 if (array_key_exists('classname', $hookmanager->resArray) && !empty($hookmanager->resArray['classname'])) {
2031 $tmpclassname = $hookmanager->resArray['classname'];
2032 if (is_string($tmpclassname) && class_exists($tmpclassname)) {
2033 $object_instance = new $tmpclassname($this->db);
2034 }
2035 }
2036 }
2037 }
2038 }
2039
2040 //var_dump($filearray);
2041 //var_dump($object_instance);
2042
2043 // Get list of files stored into database for same relative directory
2044 $relativepathfromroot = preg_replace('/'.preg_quote(DOL_DATA_ROOT.'/', '/').'/', '', $upload_dir);
2045 if ($relativepathfromroot) {
2046 completeFileArrayWithDatabaseInfo($filearray, $relativepathfromroot.'/%');
2047 '@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';
2048
2049 //var_dump($sortfield.' - '.$sortorder);
2050 if ($sortfield && $sortorder) { // If $sortfield is for example 'position_name', we will sort on the property 'position_name' (that is concat of position+name)
2051 $filearray = dol_sort_array($filearray, $sortfield, $sortorder, 1);
2052 }
2053 }
2054
2055 //var_dump($filearray);
2056
2057 foreach ($filearray as $key => $file) {
2058 if (!is_dir($file['name'])
2059 && $file['name'] != '.'
2060 && $file['name'] != '..'
2061 && $file['name'] != 'CVS'
2062 && !preg_match('/\.meta$/i', $file['name'])) {
2063 // Define relative path used to store the file
2064 $relativefile = preg_replace('/'.preg_quote($upload_dir.'/', '/').'/', '', $file['fullname']);
2065
2066 $id = 0;
2067 $ref = '';
2068
2069 // To show ref or specific information according to view to show (defined by $modulepart)
2070 // $modulepart can be $object->table_name (that is 'mymodule_myobject') or $object->element.'-'.$module (for compatibility purpose)
2071 $reg = array();
2072 if ($modulepart == 'company' || $modulepart == 'tax' || $modulepart == 'tax-vat' || $modulepart == 'salaries') {
2073 preg_match('/(\d+)\/[^\/]+$/', $relativefile, $reg);
2074 $id = (isset($reg[1]) ? $reg[1] : '');
2075 } elseif ($modulepart == 'invoice_supplier') {
2076 preg_match('/([^\/]+)\/[^\/]+$/', $relativefile, $reg);
2077 $ref = (isset($reg[1]) ? $reg[1] : '');
2078 if (is_numeric($ref)) {
2079 $id = $ref;
2080 $ref = '';
2081 }
2082 } elseif ($modulepart == 'user') {
2083 // $ref may be also id with old supplier invoices
2084 preg_match('/(.*)\/[^\/]+$/', $relativefile, $reg);
2085 $id = (isset($reg[1]) ? $reg[1] : '');
2086 } elseif ($modulepart == 'project_task') {
2087 // $ref of task is the sub-directory of the project
2088 $reg = explode("/", $relativefile);
2089 $ref = (isset($reg[1]) ? $reg[1] : '');
2090 } elseif (in_array($modulepart, array(
2091 'invoice',
2092 'propal',
2093 'supplier_proposal',
2094 'order',
2095 'order_supplier',
2096 'contract',
2097 'product',
2098 'project',
2099 'project_task',
2100 'fichinter',
2101 'expensereport',
2102 'recruitment-recruitmentcandidature',
2103 'mrp-mo',
2104 'banque',
2105 'chequereceipt',
2106 'holiday'))) {
2107 preg_match('/(.*)\/[^\/]+$/', $relativefile, $reg);
2108 $ref = (isset($reg[1]) ? $reg[1] : '');
2109 } else {
2110 $parameters = array('modulepart' => $modulepart, 'fileinfo' => $file);
2111 $reshook = $hookmanager->executeHooks('addSectionECMAuto', $parameters);
2112 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
2113 if (array_key_exists('ref', $hookmanager->resArray) && !empty($hookmanager->resArray['ref'])) {
2114 $ref = $hookmanager->resArray['ref'];
2115 }
2116 if (array_key_exists('id', $hookmanager->resArray) && !empty($hookmanager->resArray['id'])) {
2117 $id = $hookmanager->resArray['id'];
2118 }
2119 }
2120 //print 'Error: Value for modulepart = '.$modulepart.' is not yet implemented in function list_of_autoecmfiles'."\n";
2121 }
2122
2123 if (!$id && !$ref) {
2124 continue;
2125 }
2126
2127 $found = 0;
2128 if (!empty($conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref])) {
2129 $found = 1;
2130 } else {
2131 //print 'Fetch '.$id." - ".$ref.' class='.get_class($object_instance).'<br>';
2132
2133 $result = 0;
2134 if (is_object($object_instance)) {
2135 $object_instance->id = 0;
2136 $object_instance->ref = '';
2137 if ($id) {
2138 $result = $object_instance->fetch($id);
2139 } else {
2140 $result = $object_instance->fetch(0, $ref);
2141 if ($result < 0) {
2142 print $object_instance->error;
2143 } elseif ($result == 0) {
2144 // fetchOneLike looks for objects with wildcards in its reference.
2145 // It is useful for those masks who get underscores instead of their actual symbols (because the _ had replaced all forbidden chars into filename)
2146 // TODO Example when this is needed ?
2147 // 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 ?
2148 // May be we can add hidden option to enable this.
2149 $result = $object_instance->fetchOneLike($ref);
2150 }
2151 }
2152 }
2153
2154 if ($result > 0) { // Save object loaded into a cache
2155 $found = 1;
2156 $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref] = clone $object_instance;
2157 }
2158 if ($result == 0) {
2159 $found = 1;
2160 $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref] = 'notfound';
2161 unset($filearray[$key]);
2162 }
2163 }
2164
2165 if ($found <= 0 || !is_object($conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref])) {
2166 continue; // We do not show orphelins files
2167 }
2168 if ($modulepart == 'invoice_supplier' && (int) $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref]->entity !== (int) $conf->entity) {
2169 continue;
2170 }
2171
2172 print '<!-- Line list_of_autoecmfiles key='.$key.' -->'."\n";
2173 print '<tr class="oddeven">';
2174 if ($enablebulkdownload) {
2175 print '<td class="center">';
2176 print '<input type="checkbox" class="flat checkforselect" name="selectedfiles[]" value="'.dol_escape_htmltag($relativefile).'">';
2177 print '</td>';
2178 }
2179 // Ref
2180 print '<td class="tdoverflowmax150">';
2181 if ($found > 0 && is_object($conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref])) {
2182 $tmpobject = $conf->cache['modulepartobject'][$modulepart.'_'.$id.'_'.$ref];
2183 //if (! in_array($tmpobject->element, array('expensereport'))) {
2184 print $tmpobject->getNomUrl(1, 'document');
2185 //} else {
2186 // print $tmpobject->getNomUrl(1);
2187 //}
2188 } else {
2189 print $langs->trans("ObjectDeleted", ($id ? $id : $ref));
2190 }
2191
2192 //$modulesubdir=dol_sanitizeFileName($ref);
2193 //$modulesubdir = dirname($relativefile);
2194
2195 //$filedir=$conf->$modulepart->dir_output . '/' . dol_sanitizeFileName($obj->ref);
2196 //$filedir = $file['path'];
2197 //$urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid;
2198 //print $formfile->getDocumentsLink($modulepart, $filename, $filedir);
2199 print '</td>';
2200
2201 // File
2202 // Check if document source has external module part, if it the case use it for module part on document.php
2203 print '<td>';
2204 //print "XX".$file['name']; //$file['name'] must be utf8
2205 print '<a ';
2206 if (getDolGlobalInt('MAIN_DISABLE_FORCE_SAVEAS') == 2) {
2207 print 'target="_blank" ';
2208 }
2209 print 'href="'.DOL_URL_ROOT.'/document.php?modulepart='.urlencode($modulepart);
2210 if ($forcedownload) {
2211 print '&attachment=1';
2212 }
2213 print '&file='.urlencode($relativefile).'">';
2214 print img_mime($file['name'], $file['name'].' ('.dol_print_size($file['size'], 0, 0).')');
2215 print dol_escape_htmltag(dol_trunc($file['name'], $maxlength, 'middle'));
2216 print '</a>';
2217
2218 //print $this->getDocumentsLink($modulepart, $modulesubdir, $filedir, '^'.preg_quote($file['name'],'/').'$');
2219
2220 print $this->showPreview($file, $modulepart, $file['relativename']);
2221
2222 print "</td>\n";
2223
2224 // Size
2225 $sizetoshow = dol_print_size($file['size'], 1, 1);
2226 $sizetoshowbytes = dol_print_size($file['size'], 0, 1);
2227 print '<td class="right nowraponall">';
2228 if ($sizetoshow == $sizetoshowbytes) {
2229 print $sizetoshow;
2230 } else {
2231 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
2232 }
2233 print '</td>';
2234
2235 // Date
2236 print '<td class="center">'.dol_print_date($file['date'], "dayhour").'</td>';
2237
2238 // Share link
2239 print '<td class="right">';
2240 if (!empty($file['share'])) {
2241 // Define $urlwithroot
2242 $urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
2243 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
2244 //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current
2245
2246 //print '<span class="opacitymedium">'.$langs->trans("Hash").' : '.$file['share'].'</span>';
2247 $forcedownload = getDolGlobalInt('MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
2248 $paramlink = '';
2249 if (!empty($file['share'])) {
2250 $paramlink .= /* ($paramlink ? '&' : ''). */'hashp='.$file['share']; // Hash for public share
2251 }
2252 if ($forcedownload) {
2253 $paramlink .= ($paramlink ? '&' : '').'attachment=1';
2254 }
2255
2256 $fulllink = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
2257
2258 print '<!-- shared link -->';
2259 print img_picto($langs->trans("FileSharedViaALink"), 'globe').' ';
2260 print '<input type="text" class="quatrevingtpercent width100 nopadding nopadding small downloadexternallink" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).'" spellcheck="false">';
2261 }
2262 //if (!empty($useinecm) && $useinecm != 6) print '<a data-ajax="false" href="'.DOL_URL_ROOT.'/document.php?modulepart='.$modulepart;
2263 //if ($forcedownload) print '&attachment=1';
2264 //print '&file='.urlencode($relativefile).'">';
2265 //print img_view().'</a> &nbsp; ';
2266 //if ($permissiontodelete) print '<a href="'.$url.'?id='.$object->id.'&section='.urlencode(GETPOST("section")).'&action=delete&token='.newToken().'&urlfile='.urlencode($file['name']).'">'.img_delete().'</a>';
2267 //else print '&nbsp;';
2268 print "</td>";
2269
2270 print "</tr>\n";
2271 }
2272 }
2273
2274 if (count($filearray) == 0) {
2275 print '<tr class="oddeven"><td colspan="'.($enablebulkdownload ? '6' : '5').'">';
2276 if (empty($textifempty)) {
2277 print '<span class="opacitymedium">'.$langs->trans("NoFileFound").'</span>';
2278 } else {
2279 print '<span class="opacitymedium">'.$textifempty.'</span>';
2280 }
2281 print '</td></tr>';
2282 }
2283 print "</table>";
2284 print '</div>';
2285
2286 if (!empty($addfilterfields)) {
2287 print '</form>';
2288 }
2289 return count($filearray);
2290 // Fin de zone
2291 }
2292
2305 public function listOfLinks($object, $permissiontodelete = 1, $action = null, $selected = null, $param = '', $htmlname = 'formaddlink', $moreoptions = array())
2306 {
2307 global $conf, $langs;
2308 global $sortfield, $sortorder;
2309
2310 $langs->load("link");
2311
2312 require_once DOL_DOCUMENT_ROOT.'/core/class/link.class.php';
2313 $link = new Link($this->db);
2314 $links = array();
2315 if ($sortfield == "name") {
2316 $sortfield = "label";
2317 } elseif ($sortfield == "date") {
2318 $sortfield = "datea";
2319 } else {
2320 $sortfield = '';
2321 }
2322 $res = $link->fetchAll($links, $object->element, $object->id, $sortfield, $sortorder);
2323 $param .= (isset($object->id) && !preg_match('/&id='.$object->id.'/i', $param) ? '&id='.$object->id : '');
2324
2325 $permissiontoedit = $permissiontodelete;
2326
2327 print '<!-- listOfLinks -->'."\n";
2328
2329 $morehtmlright = '';
2330 if (!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) {
2331 $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);
2332 }
2333
2334 // Show list of associated links
2335 print load_fiche_titre($langs->trans("LinkedFiles"), $morehtmlright, 'link', 0, '', 'table-list-of-links');
2336
2337 if (!empty($moreoptions) && $moreoptions['afterlinktitle']) {
2338 print '<div class="divlinkfile'.((!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) ? ' hidden' : '').'">'.$moreoptions['afterlinktitle'].'</div>';
2339 }
2340
2341 print '<form action="'.$_SERVER['PHP_SELF'].($param ? '?'.$param : '').'" id="'.$htmlname.'" method="POST">';
2342 print '<input type="hidden" name="token" value="'.newToken().'">';
2343 print '<div class="div-table-responsive-no-min">';
2344
2345 print '<table class="liste noborder nobottom centpercent">';
2346 print '<tr class="liste_titre">';
2348 $langs->trans("Links"),
2349 $_SERVER['PHP_SELF'],
2350 "name",
2351 "",
2352 $param,
2353 '',
2354 $sortfield,
2355 $sortorder,
2356 ''
2357 );
2359 "",
2360 "",
2361 "",
2362 "",
2363 "",
2364 '',
2365 '',
2366 '',
2367 'right '
2368 );
2370 $langs->trans("Date"),
2371 $_SERVER['PHP_SELF'],
2372 "date",
2373 "",
2374 $param,
2375 '',
2376 $sortfield,
2377 $sortorder,
2378 'center '
2379 );
2381 '',
2382 $_SERVER['PHP_SELF'],
2383 "",
2384 "",
2385 $param,
2386 '',
2387 '',
2388 '',
2389 'center '
2390 );
2391 // Shared or not - Hash of file
2392 print_liste_field_titre('', '', '');
2393 print '</tr>';
2394 $nboflinks = count($links);
2395 if ($nboflinks > 0) {
2396 include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
2397 }
2398 foreach ($links as $key => $link) {
2399 print '<tr class="oddeven">';
2400 //edit mode
2401 if ($action == 'update' && (int) $selected === (int) $link->id && $permissiontoedit) {
2402 print '<td>';
2403 print '<input type="hidden" name="id" value="'.$object->id.'">';
2404 print '<input type="hidden" name="linkid" value="'.$link->id.'">';
2405 print '<input type="hidden" name="action" value="confirm_updateline">';
2406 print $langs->trans('Link').': <input type="text" name="link" value="'.$link->url.'">';
2407 print '</td>';
2408 print '<td>';
2409 print $langs->trans('Label').': <input type="text" name="label" value="'.dol_escape_htmltag($link->label).'">';
2410 print '</td>';
2411 print '<td class="center">'.dol_print_date(dol_now(), "dayhour", "tzuser").'</td>';
2412 print '<td class="right">';
2413 print '<label for="idshareenabled'.$key.'">'.$langs->trans("LinkSharedViaALink").'</label> ';
2414 print '<input class="inline-block" type="checkbox" id="idshareenabled'.$key.'" name="shareenabled"'.($link->share ? ' checked="checked"' : '').' /> ';
2415 print '</td>';
2416 print '<td class="right">';
2417 print '<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans("Save")).'">';
2418 print '<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans("Cancel")).'">';
2419 print '</td>';
2420 } else {
2421 print '<td>';
2422 print img_picto('', 'globe').' ';
2423 print '<a data-ajax="false" href="'.$link->url.'" target="_blank" rel="noopener noreferrer">';
2424 print dol_escape_htmltag($link->label);
2425 print '</a>';
2426 print '</td>'."\n";
2427 print '<td class="right"></td>';
2428 print '<td class="center">'.dol_print_date($link->datea, "dayhour", "tzuser").'</td>';
2429 print '<td class="center">';
2430 if ($link->share) {
2432 $urlwithouturlroot = preg_replace('/' . preg_quote(DOL_URL_ROOT, '/') . '$/i', '', trim($dolibarr_main_url_root));
2433 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT; // This is to use external domain name found into config file
2434 $fulllink = $urlwithroot.'/document.php?type=link&hashp=' . $link->share;
2435
2436 print '<a href="'.$fulllink.'" target="_blank" rel="noopener">'.img_picto($langs->trans("FileSharedViaALink"), 'globe').'</a> ';
2437 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">';
2438 }
2439 print '</td>';
2440 print '<td class="right">';
2441 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
2442 if ($permissiontodelete) {
2443 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
2444 } else {
2445 print '&nbsp;';
2446 }
2447 print '</td>';
2448 }
2449 print "</tr>\n";
2450 }
2451 if ($nboflinks == 0) {
2452 print '<tr class="oddeven"><td colspan="5">';
2453 print '<span class="opacitymedium">'.$langs->trans("NoLinkFound").'</span>';
2454 print '</td></tr>';
2455 }
2456 print "</table>";
2457
2458 print '</form>';
2459 print '</div>';
2460 return $nboflinks;
2461 }
2462
2463
2474 public function showPreview($file, $modulepart, $relativepath, $ruleforpicto = 0, $param = '')
2475 {
2476 global $langs, $conf;
2477
2478 $out = '';
2479 if (($conf->browser->layout != 'phone' || getDolGlobalString('MAIN_SHOW_PREVIEW_PICTO_EVEN_ON_PHONE')) && !empty($conf->use_javascript_ajax)) {
2480 $urladvancedpreview = getAdvancedPreviewUrl($modulepart, $relativepath, 1, $param); // Return if a file is qualified for preview.
2481 if (count($urladvancedpreview)) {
2482 $out .= '<a class="pictopreview '.$urladvancedpreview['css'].'" href="'.$urladvancedpreview['url'].'"'.(empty($urladvancedpreview['mime']) ? '' : ' mime="'.$urladvancedpreview['mime'].'"').' '.(empty($urladvancedpreview['target']) ? '' : ' target="'.$urladvancedpreview['target'].'"').'>';
2483 //$out.= '<a class="pictopreview">';
2484 if (empty($ruleforpicto)) {
2485 $out .= img_picto('', 'search-plus', 'class="pictofixedwidth"');
2486 } else {
2487 $out .= img_mime($relativepath, $langs->trans('Preview').' '.$file['name'], 'pictofixedwidth');
2488 }
2489 $out .= '</a>';
2490 } else {
2491 if ($ruleforpicto < 0) {
2492 $out .= img_picto('', 'generic', '', 0, 0, 0, '', 'paddingright pictofixedwidth');
2493 }
2494 }
2495 }
2496 return $out;
2497 }
2498}
$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='', $placeholder='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:477
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(! $sortfield) if(! $sortorder) $module
Definition list.php:193
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
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)
Definition html.lib.php:181
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
if(!defined( 'IMAGETYPE_WEBP')) getDefaultImageSizes()
Return default values for image sizes.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
getMaxFileSizeArray()
Return the max allowed for file upload.