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