68 $this->numoffiles = 0;
81 public function showImageToEdit(
string $htmlname,
string $modulepart,
string $dirformainimage,
string $subdirformainimage,
string $fileformainimage)
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';
90 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
91 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
92 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
93 $maxheightmini = $tmparraysize[
'maxheightmini'];
94 $quality = $tmparraysize[
'quality'];
99 if ($htmlname ==
'logo_squarred') {
106 $maxmin = $maxfilesizearray[
'maxmin'];
107 $fileformainimagesmall = getImageFileNameForSize($fileformainimage,
'_small');
108 $fileformainimagemini = getImageFileNameForSize($fileformainimage,
'_mini');
112 $out .=
'<div class="centpercent nobordernopadding valignmiddle"><div class="inline-block marginrightonly">';
114 $out .=
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
116 $out .=
'<input type="file" class="flat minwidth100 maxwidthinputfileonsmartphone" name="'.$htmlname.
'" id="'.$htmlname.
'" accept="image/*">';
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>';
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).
'">';
126 } elseif (!empty($fileformainimage)) {
128 if (!file_exists($dirformainimage.
'/'.$subdirformainimage.$fileformainimagemini)) {
129 $imgThumbMini =
vignette($dirformainimage.
'/'.$subdirformainimage.$fileformainimage, $maxwidthmini, $maxheightmini,
'_mini', $quality);
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)).
'">';
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).
'">';
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>';
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">';
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)
181 global
$conf, $langs, $hookmanager;
182 $hookmanager->initHooks(array(
'formfile'));
186 dol_syslog(__METHOD__.
": using 2 for useajax is deprecated and should be not used", LOG_WARNING);
189 if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
203 $out =
"\n".
'<!-- Start form attach new file --><div class="formattachnewfile">'.
"\n";
205 if ($nooutput != 2) {
207 $title = $langs->trans(
"AttachANewFile");
209 if ($title !=
'none') {
214 if (empty($usewithoutform)) {
216 $url .= (strpos($url,
'?') ===
false ?
'?' :
'&').
'uploadform=1';
218 $out .=
'<form name="'.$htmlname.
'" id="'.$htmlname.
'" action="'.$url.
'" enctype="multipart/form-data" method="POST">'.
"\n";
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";
229 $out .=
'<table class="nobordernopadding centpercent">';
232 if (!empty($options)) {
233 $out .=
'<td>'.$options.
'</td>';
236 $out .=
'<td class="valignmiddle nowrap">';
239 $max = $maxfilesizearray[
'max'];
240 $maxmin = $maxfilesizearray[
'maxmin'];
241 $maxphptoshow = $maxfilesizearray[
'maxphptoshow'];
242 $maxphptoshowparam = $maxfilesizearray[
'maxphptoshowparam'];
244 $out .=
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
246 $out .=
'<input class="flat minwidth400 maxwidth200onsmartphone" type="file"';
247 $out .= ((
getDolGlobalString(
'MAIN_DISABLE_MULTIPLE_FILEUPLOAD') || $disablemulti) ?
' name="userfile"' :
' name="userfile[]" multiple');
249 $out .= (!empty($accept) ?
' accept="'.$accept.
'"' :
' accept=""');
250 $out .= (!empty($capture) ?
' capture="capture"' :
'');
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>';
259 $out .=
'<input type="submit" class="button smallpaddingimp reposition" name="sendit" value="'.$langs->trans(
"Upload").
'"';
265 $out .=
'<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
269 if ($perm && empty(
$conf->dol_optimize_smallscreen)) {
270 $langs->load(
'other');
272 $menudolibarrsetupmax = $langs->transnoentitiesnoconv(
"Home").
' - '.$langs->transnoentitiesnoconv(
"Setup").
' - '.$langs->transnoentitiesnoconv(
"Security");
274 $tooltiptext = $langs->trans(
"ThisLimitIsDefinedInSetupAt", $menudolibarrsetupmax, $max, $maxphptoshowparam, $maxphptoshow);
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>';
280 $out .=
info_admin($tooltiptext, 1, 0,
'1',
'classfortooltip');
283 $out .=
' ('.$langs->trans(
"UploadDisabled").
')';
285 $out .=
"</td></tr>";
287 if ($savingdocmask) {
289 $rename =
getDolGlobalString(
'MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT') ?
'' :
'checked';
292 if (!empty($options)) {
293 $out .=
'<td>'.$options.
'</td>';
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"));
306 if (empty($usewithoutform)) {
308 if (empty($sectionid)) {
313 $parameters = array(
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'url' => $url,
'perm' => $perm,
'options' => $options);
315 $res = $hookmanager->executeHooks(
'formattachOptionsUpload', $parameters,
$object);
317 $out =
'<div class="'.($usewithoutform ?
'inline-block valignmiddle' : (($nooutput == 2 ?
'' :
'attacharea ').
'attacharea'.$htmlname)).
'">'.$out.
'</div>';
319 $out .= $hookmanager->resPrint;
321 $out .=
"\n</div><!-- End form class=formattachnewfile -->\n";
328 $out2 .=
"\n".
'<!-- Start form link new url --><div class="formlinknewurl">'.
"\n";
329 $langs->load(
'link');
331 if ($nooutput != 2) {
332 $title = $langs->trans(
"LinkANewFile");
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";
344 $out2 .=
'<div class="valignmiddle">';
345 $out2 .=
'<div class="inline-block" style="padding-right: 10px;">';
347 $out2 .=
'<label for="link">'.$langs->trans(
"URLToLink").
':</label> ';
349 $out2 .=
'<input type="text" name="link" class="flat minwidth400imp" id="link" placeholder="'.dol_escape_htmltag($langs->trans(
"URLToLink")).
'">';
351 $out2 .=
'<div class="inline-block" style="padding-right: 10px;">';
353 $out2 .=
'<label for="label">'.$langs->trans(
"Label").
':</label> ';
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.
'">';
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").
'"';
365 if (empty($usewithoutform)) {
366 $out2 .=
'<div class="clearboth"></div>';
367 $out2 .=
'</form><br>';
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);
373 $out2 =
'<div class="'.($usewithoutform ?
'inline-block valignmiddle' : (($nooutput == 2 ?
'' :
'attacharea ').$htmlname)).
'">'.$out2.
'</div>';
375 $out2 .= $hookmanager->resPrint;
377 $out2 .=
"\n</div><!-- End form class=formlinknewurl -->\n";
381 if ($nooutput == 2) {
382 return array(
'formToUploadAFile' => $out,
'formToAddALink' => $out2);
383 } elseif ($nooutput) {
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 =
'')
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;
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 =
'')
454 if (!empty($iconPDF)) {
455 dol_syslog(__METHOD__.
": passing iconPDF parameter is deprecated", LOG_WARNING);
458 global $langs,
$conf, $user, $hookmanager;
462 if (is_object($hookmanager)) {
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,
476 'buttonlabel' => &$buttonlabel,
477 'codelang' => &$codelang,
478 'morepicto' => &$morepicto,
479 'hideifempty' => &$hideifempty,
480 'removeaction' => &$removeaction
482 $reshook = $hookmanager->executeHooks(
'showDocuments', $parameters,
$object);
490 return $hookmanager->resPrint;
493 if (!is_object($form)) {
494 $form =
new Form($this->db);
497 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
500 if (!empty($iconPDF)) {
505 if (!preg_match(
'/entity\=[0-9]+/', $param)) {
506 $param .= ($param ?
'&' :
'').
'entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity);
509 $printer = ($user->hasRight(
'printing',
'read') &&
isModEnabled(
'printing'));
511 $hookmanager->initHooks(array(
'formfile'));
514 $file_list = array();
515 if (!empty($filedir)) {
516 $file_list =
dol_dir_list($filedir,
'files', 0,
'',
'(\.meta|_preview.*.*\.png)$',
'date', SORT_DESC);
518 if ($hideifempty && empty($file_list)) {
523 $forname =
'builddoc';
528 $out .=
"\n".
'<!-- Start show_document -->'.
"\n";
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")
538 jQuery(\'#'.$modulepart.
'_table\').hide();
539 jQuery(\'#togglemassfilesarea\').attr("ref", "hidden");
540 jQuery(\'#togglemassfilesarea\').text("('.
dol_escape_js($langs->trans(
"Show")).
')");
544 jQuery(\'#'.$modulepart.
'_table\').show();
545 jQuery(\'#togglemassfilesarea\').attr("ref","shown");
546 jQuery(\'#togglemassfilesarea\').text("('.
dol_escape_js($langs->trans(
"Hide")).
')");
554 $titletoshow = $langs->trans(
"Documents");
555 if (!empty($title)) {
556 $titletoshow = ($title ==
'none' ?
'' : $title);
559 $submodulepart = $modulepart;
562 $tmp = explode(
':', $modulepart);
563 if (!empty($tmp[1])) {
564 $modulepart = $tmp[0];
565 $submodulepart = $tmp[1];
568 $addcolumforpicto = ($delallowed || $printer || $morepicto);
569 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
574 $modellist = array();
576 if ($modulepart ==
'company') {
578 if (is_array($genallowed)) {
579 $modellist = $genallowed;
581 include_once DOL_DOCUMENT_ROOT.
'/core/modules/societe/modules_societe.class.php';
584 } elseif ($modulepart ==
'propal') {
585 if (is_array($genallowed)) {
586 $modellist = $genallowed;
588 include_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
591 } elseif ($modulepart ==
'supplier_proposal') {
592 if (is_array($genallowed)) {
593 $modellist = $genallowed;
595 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_proposal/modules_supplier_proposal.php';
598 } elseif ($modulepart ==
'commande') {
599 if (is_array($genallowed)) {
600 $modellist = $genallowed;
602 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
605 } elseif ($modulepart ==
'expedition') {
606 if (is_array($genallowed)) {
607 $modellist = $genallowed;
609 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
612 } elseif ($modulepart ==
'reception') {
613 if (is_array($genallowed)) {
614 $modellist = $genallowed;
616 include_once DOL_DOCUMENT_ROOT.
'/core/modules/reception/modules_reception.php';
619 } elseif ($modulepart ==
'delivery') {
620 if (is_array($genallowed)) {
621 $modellist = $genallowed;
623 include_once DOL_DOCUMENT_ROOT.
'/core/modules/delivery/modules_delivery.php';
626 } elseif ($modulepart ==
'ficheinter') {
627 if (is_array($genallowed)) {
628 $modellist = $genallowed;
630 include_once DOL_DOCUMENT_ROOT.
'/core/modules/fichinter/modules_fichinter.php';
633 } elseif ($modulepart ==
'facture') {
634 if (is_array($genallowed)) {
635 $modellist = $genallowed;
637 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
640 } elseif ($modulepart ==
'contract') {
642 if (is_array($genallowed)) {
643 $modellist = $genallowed;
645 include_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
648 } elseif ($modulepart ==
'project') {
649 if (is_array($genallowed)) {
650 $modellist = $genallowed;
652 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/modules_project.php';
655 } elseif ($modulepart ==
'project_task') {
656 if (is_array($genallowed)) {
657 $modellist = $genallowed;
659 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/task/modules_task.php';
662 } elseif ($modulepart ==
'product') {
663 if (is_array($genallowed)) {
664 $modellist = $genallowed;
666 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product/modules_product.class.php';
669 } elseif ($modulepart ==
'product_batch') {
670 if (is_array($genallowed)) {
671 $modellist = $genallowed;
673 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product_batch/modules_product_batch.class.php';
676 } elseif ($modulepart ==
'stock') {
677 if (is_array($genallowed)) {
678 $modellist = $genallowed;
680 include_once DOL_DOCUMENT_ROOT.
'/core/modules/stock/modules_stock.php';
683 } elseif ($modulepart ==
'hrm') {
684 if (is_array($genallowed)) {
685 $modellist = $genallowed;
687 include_once DOL_DOCUMENT_ROOT.
'/core/modules/hrm/modules_evaluation.php';
690 } elseif ($modulepart ==
'movement') {
691 if (is_array($genallowed)) {
692 $modellist = $genallowed;
694 include_once DOL_DOCUMENT_ROOT.
'/core/modules/movement/modules_movement.php';
697 } elseif ($modulepart ==
'export') {
698 if (is_array($genallowed)) {
699 $modellist = $genallowed;
701 include_once DOL_DOCUMENT_ROOT.
'/core/modules/export/modules_export.php';
703 $modellist = array();
705 } elseif ($modulepart ==
'commande_fournisseur' || $modulepart ==
'supplier_order') {
706 if (is_array($genallowed)) {
707 $modellist = $genallowed;
709 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
712 } elseif ($modulepart ==
'facture_fournisseur' || $modulepart ==
'supplier_invoice') {
714 if (is_array($genallowed)) {
715 $modellist = $genallowed;
717 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_invoice/modules_facturefournisseur.php';
720 } elseif ($modulepart ==
'supplier_payment') {
721 if (is_array($genallowed)) {
722 $modellist = $genallowed;
724 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_payment/modules_supplier_payment.php';
727 } elseif ($modulepart ==
'remisecheque') {
728 if (is_array($genallowed)) {
729 $modellist = $genallowed;
731 include_once DOL_DOCUMENT_ROOT.
'/core/modules/cheque/modules_chequereceipts.php';
734 } elseif ($modulepart ==
'donation') {
735 if (is_array($genallowed)) {
736 $modellist = $genallowed;
738 include_once DOL_DOCUMENT_ROOT.
'/core/modules/dons/modules_don.php';
741 } elseif ($modulepart ==
'member') {
742 if (is_array($genallowed)) {
743 $modellist = $genallowed;
745 include_once DOL_DOCUMENT_ROOT.
'/core/modules/member/modules_cards.php';
748 } elseif ($modulepart ==
'agenda' || $modulepart ==
'actions') {
749 if (is_array($genallowed)) {
750 $modellist = $genallowed;
752 include_once DOL_DOCUMENT_ROOT.
'/core/modules/action/modules_action.php';
755 } elseif ($modulepart ==
'expensereport') {
756 if (is_array($genallowed)) {
757 $modellist = $genallowed;
759 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expensereport/modules_expensereport.php';
762 } elseif ($modulepart ==
'unpaid') {
764 } elseif ($modulepart ==
'user') {
765 if (is_array($genallowed)) {
766 $modellist = $genallowed;
768 include_once DOL_DOCUMENT_ROOT.
'/core/modules/user/modules_user.class.php';
771 } elseif ($modulepart ==
'usergroup') {
772 if (is_array($genallowed)) {
773 $modellist = $genallowed;
775 include_once DOL_DOCUMENT_ROOT.
'/core/modules/usergroup/modules_usergroup.class.php';
780 $file =
dol_buildpath(
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
782 if (file_exists($file)) {
783 $res = include_once $file;
786 $file =
dol_buildpath(
'/'.$modulepart.
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
787 $res = include_once $file;
790 $class =
'ModelePDF'.ucfirst($submodulepart);
792 if (class_exists($class)) {
793 $modellist = call_user_func($class.
'::liste_modeles', $this->db);
795 dol_print_error($this->db,
"Bad value for modulepart '".$modulepart.
"' in showdocuments (class ".$class.
" for Doc generation not found)");
803 if (empty($buttonlabel)) {
804 $buttonlabel = $langs->trans(
'Generate');
807 if (
$conf->browser->layout ==
'phone') {
808 $urlsource .=
'#'.$forname.
'_form';
810 if (empty($noform)) {
811 $out .=
'<form action="'.$urlsource.
'" id="'.$forname.
'_form" method="post">';
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().
'">';
820 $out .=
'<div class="div-table-responsive-no-min">';
821 $out .=
'<table class="liste formdoc noborder centpercent">';
823 $out .=
'<tr class="liste_titre">';
824 $addcolumforpicto = ($delallowed || $printer || $morepicto);
825 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
828 $out .=
'<th colspan="'.$colspan.
'" class="formdoc liste_titre maxwidthonsmartphone center">';
831 if (!empty($modellist)) {
833 $out .=
'<span class="hideonsmartphone">'.$langs->trans(
'Model').
' </span>';
834 if (is_array($modellist) && count($modellist) == 1) {
835 $arraykeys = array_keys($modellist);
836 $modelselected = $arraykeys[0];
838 $morecss =
'minwidth75 maxwidth200';
839 if (
$conf->browser->layout ==
'phone') {
840 $morecss =
'maxwidth100';
842 $out .= $form->selectarray(
'model', $modellist, $modelselected, $showempty, 0, 0,
'', 0, 0, 0,
'', $morecss, 1,
'', 0, 0);
843 if (
$conf->use_javascript_ajax) {
846 $out .= $form->textwithpicto(
'', $tooltipontemplatecombo, 1,
'help',
'marginrightonly', 0, 3,
'', 0);
848 $out .=
'<div class="float">'.$langs->trans(
"Files").
'</div>';
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';
855 $defaultlang = ($codelang && $codelang !=
'auto') ? $codelang : $langs->getDefaultLang();
856 $morecss =
'maxwidth150';
857 if (
$conf->browser->layout ==
'phone') {
858 $morecss =
'maxwidth100';
860 $out .= $formadmin->select_language($defaultlang,
'lang_id', 0, array(), 0, 0, 0, $morecss);
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';
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"));
879 if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty(
$conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
882 if (empty($modellist) && !$showempty && $modulepart !=
'unpaid') {
888 if (!empty($hookmanager->hooks[
'formfile'])) {
889 foreach ($hookmanager->hooks[
'formfile'] as $module) {
890 if (method_exists($module,
'formBuilddocLineOptions')) {
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;
907 if (!empty($filedir)) {
908 $link_list = array();
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);
916 $out .=
'<!-- html.formfile::showdocuments -->'.
"\n";
919 if ((!empty($file_list) || !empty($link_list) || preg_match(
'/^massfilesarea/', $modulepart))
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";
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';
933 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filedir);
934 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
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';
943 if (!empty($sortfield) && !empty($sortorder)) {
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';
950 require_once DOL_DOCUMENT_ROOT .
'/ecm/class/ecmfiles.class.php';
953 foreach ($file_list as $file) {
956 if (!empty($file[
'rowid']) && $user->hasRight(
'ecm',
'read')) {
960 $ecmfile->fetch($file[
'rowid']);
967 $relativepath = (
string) $file[
"name"];
969 $relativepath = (
string) $modulesubdir.
"/".$file[
"name"];
971 if ($modulepart ==
'export') {
972 $relativepath = (
string) $file[
"name"];
975 $out .=
'<tr class="oddeven'.((!$genallowed && $i == 1) ?
' trfirstline' :
'').
'">';
977 $documenturl =
getDolGlobalString(
'DOL_URL_ROOT_DOCUMENT_PHP', DOL_URL_ROOT.
'/document.php');
980 $imgpreview = $this->
showPreview($file, $modulepart, $relativepath, 0, $param.
'&preview=1');
981 $out .=
'<td class="minwidth200 tdoverflowmax300">';
983 $out .=
'<span class="spanoverflow widthcentpercentminusx valignmiddle">';
985 $out .=
'<span class="spanoverflow">';
991 if (is_object($ecmfile)) {
992 $out .= $ecmfile->getNomUrl(1, $modulepart, 0, 0,
' documentdownload');
995 $out .=
'<a class="documentdownload paddingright" ';
997 $out .=
'target="_blank" ';
999 $out .=
'href="'.$documenturl.
'?modulepart='.$modulepart.
'&file='.urlencode($relativepath).($param ?
'&'.$param :
'').
'"';
1000 $mime = dol_mimetype($relativepath,
'', 0);
1001 if (preg_match(
'/text/', $mime)) {
1002 $out .=
' target="_blank" rel="noopener noreferrer"';
1004 $out .=
' title="'.dol_escape_htmltag($file[
"name"]).
'"';
1006 $out .=
img_mime($file[
"name"], $langs->trans(
"File").
': '.$file[
"name"]);
1011 $out .=
'</span>'.
"\n";
1013 $out .= $imgpreview;
1019 $size = (!empty($file[
'size']) ? $file[
'size'] :
dol_filesize($filedir.
"/".$file[
"name"]));
1020 $out .=
'<td class="nowraponall right" title="'.dolPrintHTML($size.
' '.$langs->trans(
"Bytes")).
'">'.
dol_print_size($size, 1, 1).
'</td>';
1023 $date = (!empty($file[
'date']) ? $file[
'date'] :
dol_filemtime($filedir.
"/".$file[
"name"]));
1024 $out .=
'<td class="nowrap right">'.dol_print_date($date,
'dayhour',
'tzuser').
'</td>';
1027 $out .=
'<td class="nowraponall">';
1028 if (!empty($file[
'share'])) {
1030 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
1031 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1035 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1037 if (!empty($file[
'share'])) {
1038 $paramlink .=
'hashp='.$file[
'share'];
1040 if ($forcedownload) {
1041 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1044 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1046 $out .=
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
1047 $out .=
'<input type="text" class="quatrevingtpercentminusx width75 nopadding small downloadexternallink" id="downloadlink'.$file[
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
1048 $out .= ajax_autoselect(
'downloadlink'.$file[
'rowid']);
1055 if ($delallowed || $printer || $morepicto) {
1056 $out .=
'<td class="right nowraponall">';
1058 $tmpurlsource = preg_replace(
'/#[a-zA-Z0-9_]*$/',
'', $urlsource);
1059 $out .=
'<a class="reposition" href="'.$tmpurlsource.((strpos($tmpurlsource,
'?') ===
false) ?
'?' :
'&').
'action='.urlencode($removeaction).
'&token='.newToken().
'&file='.urlencode($relativepath);
1060 $out .= ($param ?
'&'.$param :
'');
1063 $out .=
'">'.img_picto($langs->trans(
"Delete"),
'delete').
'</a>';
1066 $out .=
'<a class="marginleftonly reposition" href="'.$urlsource.(strpos($urlsource,
'?') ?
'&' :
'?').
'action=print_file&token='.newToken().
'&printer='.urlencode($modulepart).
'&file='.urlencode($relativepath);
1067 $out .= ($param ?
'&'.$param :
'');
1068 $out .=
'">'.img_picto($langs->trans(
"PrintFile", $relativepath),
'printer').
'</a>';
1071 $morepicto = preg_replace(
'/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto);
1077 if (is_object($hookmanager)) {
1078 $addcolumforpicto = ($delallowed || $printer || $morepicto);
1079 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
1081 $parameters = array(
'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);
1084 $out .= $hookmanager->resPrint;
1087 $out = $hookmanager->resPrint;
1092 $this->numoffiles++;
1095 if (is_array($link_list)) {
1098 foreach ($link_list as $file) {
1099 $out .=
'<tr class="oddeven">';
1100 $out .=
'<td colspan="'.$colspan.
'" class="maxwidhtonsmartphone">';
1101 $out .=
'<a data-ajax="false" href="'.$file->url.
'" target="_blank" rel="noopener noreferrer">';
1102 $out .= $file->label;
1105 $out .=
'<td class="right">';
1109 $out .=
'<td></td>';
1110 if ($delallowed || $printer || $morepicto) {
1111 $out .=
'<td></td>';
1113 $out .=
'</tr>'.
"\n";
1115 $this->numoffiles++;
1118 if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
1119 $out .=
'<tr><td colspan="'.(3 + ($addcolumforpicto ? 1 : 0)).
'"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>'.
"\n";
1125 $out .=
"</table>\n";
1128 if (empty($noform)) {
1129 $out .=
'</form>'.
"\n";
1133 $out .=
'<!-- End show_document -->'.
"\n";
1136 jQuery(document).ready(function() {
1137 var selectedValue = $(".selectformat").val();
1139 if (selectedValue === "excel2007" || selectedValue === "tsv") {
1140 $(".forhide").prop("disabled", true).hide();
1142 $(".forhide").prop("disabled", false).show();
1163 public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter =
'', $morecss =
'valignmiddle', $allfiles = 0)
1165 global
$conf, $langs;
1167 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1170 $this->infofiles = array(
'nboffiles' => 0,
'extensions' => array(),
'files' => array());
1177 preg_match(
'/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir,
'/').
'$/', $filedir, $regs);
1178 $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1);
1183 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/');
1185 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/').
'\.';
1187 $file_list =
dol_dir_list($filedir,
'files', 0, $filterforfilesearch,
'\.meta$|\.png$');
1191 $out .=
'<!-- html.formfile::getDocumentsLink -->'.
"\n";
1192 if (!empty($file_list)) {
1193 $out =
'<dl class="dropdown inline-block">
1194 <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto(
'',
'listlight',
'', 0, 0, 0,
'', $morecss).
'</a></dt>
1195 <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1201 foreach ($file_list as $file) {
1203 if ($filter && !preg_match(
'/'.$filter.
'/i', $file[
"name"])) {
1209 $relativepath = $file[
"name"];
1210 if ($modulesubdir) {
1211 $relativepath = (
string) $modulesubdir.
"/".$file[
"name"];
1214 if ($modulepart ==
'donation') {
1215 $relativepath = (
string)
get_exdir($modulesubdir, 2, 0, 0,
null,
'donation').$file[
"name"];
1217 if ($modulepart ==
'export') {
1218 $relativepath = (
string) $file[
"name"];
1221 $this->infofiles[
'nboffiles']++;
1222 $this->infofiles[
'files'][] = $file[
'fullname'];
1223 $ext = (
string) pathinfo($file[
'name'], PATHINFO_EXTENSION);
1224 if (!array_key_exists($ext, $this->infofiles[
'extensions'])) {
1225 $this->infofiles[
'extensions'][$ext] = 1;
1227 $this->infofiles[
'extensions'][$ext]++;
1231 if (!empty(
$conf->use_javascript_ajax) && (
$conf->browser->layout !=
'phone')) {
1232 $tmparray = getAdvancedPreviewUrl($modulepart, $relativepath, 1,
'&entity='.$entity);
1233 if ($tmparray && $tmparray[
'url']) {
1234 $tmpout .=
'<li><a href="'.$tmparray[
'url'].
'"'.($tmparray[
'css'] ?
' class="'.$tmparray[
'css'].
'"' :
'').($tmparray[
'mime'] ?
' mime="'.$tmparray[
'mime'].
'"' :
'').($tmparray[
'target'] ?
' target="'.$tmparray[
'target'].
'"' :
'').
'>';
1236 $tmpout .=
img_picto(
'',
'search-plus',
'class="paddingright"');
1237 $tmpout .= $langs->trans(
"Preview").
' '.$ext.
'</a></li>';
1242 $tmpout .=
'<li class="nowrap"><a class="pictopreview nowrap" ';
1244 $tmpout .=
'target="_blank" ';
1246 $tmpout .=
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&entity='.$entity.
'&file='.urlencode($relativepath).
'"';
1247 $mime = dol_mimetype($relativepath,
'', 0);
1248 if (preg_match(
'/text/', $mime)) {
1249 $tmpout .=
' target="_blank" rel="noopener noreferrer"';
1252 $tmpout .=
img_mime($relativepath, $file[
"name"]);
1253 $tmpout .= $langs->trans(
"Download").
' '.$ext;
1254 $tmpout .=
'</a></li>'.
"\n";
1257 $out .=
'</ul></div></dd>
1306 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())
1309 global $user,
$conf, $langs, $hookmanager, $form;
1310 global $sortfield, $sortorder;
1313 if ($disablecrop == -1) {
1316 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'))) {
1322 if (empty($relativepath)) {
1325 $relativepath = (
$object->id).
'/';
1326 } elseif (!empty(
$object->element) &&
$object->element ==
'invoice_supplier') {
1328 } elseif (!empty(
$object->element) &&
$object->element ==
'project_task') {
1329 $relativepath =
'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1333 if (
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO') && isset($filearray[0]) && $filearray[0][
'level1name'] ==
'photos') {
1334 $relativepath = preg_replace(
'/^.*\/produit\//',
'', $filearray[0][
'path']).
'/';
1340 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dir);
1341 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
1348 $hookmanager->initHooks(array(
'formfile'));
1349 $parameters = array(
1350 'filearray' => $filearray,
1351 'modulepart' => $modulepart,
1353 'forcedownload' => $forcedownload,
1354 'relativepath' => $relativepath,
1355 'relativedir' => $relativedir,
1356 'permtodelete' => $permonobject,
1357 'useinecm' => $useinecm,
1358 'textifempty' => $textifempty,
1359 'maxlength' => $maxlength,
1364 $reshook = $hookmanager->executeHooks(
'showFilesList', $parameters,
$object);
1366 if (!empty($reshook)) {
1369 if (!is_object($form)) {
1370 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
1371 $form =
new Form($this->db);
1374 if (!preg_match(
'/&id=/', $param) && isset(
$object->id)) {
1375 $param .=
'&id='.$object->id;
1377 $relativepathwihtoutslashend = preg_replace(
'/\/$/',
'', $relativepath);
1378 if ($relativepathwihtoutslashend) {
1379 $param .=
'&file='.urlencode($relativepathwihtoutslashend);
1382 if ($permtoeditline < 0) {
1383 $permtoeditline = 0;
1384 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1385 '@phan-var-force Product $object';
1387 $permtoeditline = 1;
1390 $permtoeditline = 1;
1395 $permtoeditline = 0;
1399 $url = $_SERVER[
"PHP_SELF"];
1404 $morehtmlright =
'';
1405 if (!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) {
1406 $tmpurlforbutton =
'javascript:console.log("open add file form");jQuery(".divattachnewfile").removeClass("hidden").toggle(); if (!jQuery(".divattachnewfile").is(":hidden")) { jQuery(".divattachnewfile input[type=\'file\']").first().click();} void(0);';
1407 $morehtmlright .= dolGetButtonTitle($langs->trans(
'New'),
'',
'fa fa-plus-circle', $tmpurlforbutton,
'', $permtoeditline);
1410 if ((empty($useinecm) || $useinecm == 3 || $useinecm == 6) && $title !=
'none') {
1411 print
load_fiche_titre($title ? $title : $langs->trans(
"AttachedFiles"), $morehtmlright,
'file-upload', 0,
'',
'table-list-of-attached-files');
1413 if (!empty($moreoptions) && $moreoptions[
'afteruploadtitle']) {
1414 print
'<!-- Add form from $moreoptions[\'afteruploadtitle\'] -->';
1415 print
'<div class="divattachnewfile'.((!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) ?
' hidden' :
'').
'">'.$moreoptions[
'afteruploadtitle'].
'</div>';
1419 print
'<!-- html.formfile::list_of_documents -->'.
"\n";
1420 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1421 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param.
'" method="POST">';
1422 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1423 print
'<input type="hidden" name="action" value="renamefile">';
1424 print
'<input type="hidden" name="id" value="'.(is_object(
$object) ?
$object->id :
'').
'">';
1425 print
'<input type="hidden" name="modulepart" value="'.$modulepart.
'">';
1428 print
'<div class="div-table-responsive-no-min"'.($moreattrondiv ?
' '.$moreattrondiv :
'').
'>';
1429 print
'<table id="tablelines" class="centpercent liste noborder nobottom">'.
"\n";
1431 if (!empty($addfilterfields)) {
1432 print
'<tr class="liste_titre nodrag nodrop">';
1433 print
'<td><input type="search_doc_ref" value="'.dol_escape_htmltag(
GETPOST(
'search_doc_ref',
'alpha')).
'"></td>';
1436 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1441 if (empty($disablemove) && count($filearray) > 1) {
1450 '@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';
1453 if ($sortfield && $sortorder) {
1454 $filearray =
dol_sort_array($filearray, $sortfield, $sortorder, 1);
1458 print
'<tr class="liste_titre nodrag nodrop">';
1466 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1470 if (empty($moreoptions[
'hideshared'])) {
1475 if (!empty($moreoptions[
'buttons'])) {
1480 if (empty($disablemove) && count($filearray) > 1) {
1486 $nboffiles = count($filearray);
1487 if ($nboffiles > 0) {
1488 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
1494 $parametersByDefault = array(
1495 'modulepart' => $modulepart,
1496 'relativepath' => $relativepath,
1497 'permtoedit' => $permtoeditline,
1498 'permonobject' => $permonobject,
1500 foreach ($filearray as $key => $file) {
1501 if ($file[
'name'] !=
'.' && $file[
'name'] !=
'..' && !preg_match(
'/\.meta$/i', $file[
'name'])) {
1502 if (array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) {
1503 $lastrowid = $filearray[$key][
'rowid'];
1508 $modulepart = ($file[
'modulepart'] ?? $parametersByDefault[
'modulepart']);
1509 $relativepath = ($file[
'relativepath'] ?? $parametersByDefault[
'relativepath']);
1510 $permtoeditline = ($file[
'permtoedit'] ?? $parametersByDefault[
'permtoedit']);
1511 $permonobject = ($file[
'permonobject'] ?? $parametersByDefault[
'permonobject']);
1514 if (empty($relativepath) || empty($modulepart)) {
1515 $filepath = $file[
'level1name'].
'/'.$file[
'name'];
1517 $filepath = $relativepath.$file[
'name'];
1519 if (empty($modulepart)) {
1520 $modulepart = basename(dirname($file[
'path']));
1522 if (empty($relativepath)) {
1523 $relativepath = preg_replace(
'/\/(.+)/',
'', $filepath) .
'/';
1528 print
'<!-- Line list_of_documents '.$key.
' relativepath = '.$relativepath.
' -->'.
"\n";
1531 print
'<!-- In database: position='.(array_key_exists(
'position', $filearray[$key]) ? $filearray[$key][
'position'] : 0).
' -->'.
"\n";
1532 print
'<tr class="oddeven" id="row-'.((array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) ? $filearray[$key][
'rowid'] :
'AFTER'.$lastrowid.
'POS'.($i + 1)).
'">';
1536 print
'<td class="minwidth200imp tdoverflowmax500" title="'.dolPrintHTMLForAttribute($file[
'name']).
'">';
1540 print
'<a class="paddingright valignmiddle" ';
1542 print
'target="_blank" ';
1544 print
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.urlencode($modulepart);
1545 if ($forcedownload) {
1546 print
'&attachment=1';
1548 if (!empty(
$object->entity)) {
1549 print
'&entity='.((int)
$object->entity);
1551 print
'&file='.urlencode($filepath);
1553 print
img_mime($file[
'name'], $file[
'name'].
' ('.
dol_print_size($file[
'size'], 0, 0).
')',
'inline-block valignmiddle paddingright');
1554 if ($showrelpart == 1) {
1555 print $relativepath;
1561 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $file[
'name'] == basename(
GETPOST(
'urlfile',
'alpha')) && dirname($filepath) == dirname(
GETPOST(
'urlfile',
'alpha'))) {
1563 $section_dir = dirname(
GETPOST(
'urlfile',
'alpha'));
1564 if (!preg_match(
'/\/$/', $section_dir)) {
1565 $section_dir .=
'/';
1567 print
'<input type="hidden" name="section_dir" value="'.$section_dir.
'">';
1568 print
'<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file[
'name']).
'">';
1569 print
'<input type="text" name="renamefileto" class="centpercentminusx" value="'.dol_escape_htmltag($file[
'name']).
'" spellcheck="false">';
1572 $filenametoshow = preg_replace(
'/\.noexe$/',
'', $file[
'name']);
1586 print
'<td class="right nowraponall">';
1587 if ($sizetoshow == $sizetoshowbytes) {
1590 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1595 print
'<td class="center nowraponall">'.dol_print_date($file[
'date'],
"dayhour",
"tzuser").
'</td>';
1598 $fileinfo = pathinfo($file[
'name']);
1599 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1600 print
'<td class="center">';
1602 if ($useinecm == 5 || $useinecm == 6) {
1603 $smallfile = getImageFileNameForSize($file[
'name'],
'');
1605 $smallfile = getImageFileNameForSize($file[
'name'],
'_small');
1608 $smallfile = getImageFileNameForSize($file[
'name'],
'_small',
'.png');
1611 $smallfile = getImageFileNameForSize($file[
'name'],
'');
1615 $urlforhref = getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity));
1616 if (empty($urlforhref)) {
1617 $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']));
1618 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1620 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
1622 print
'<img class="photo maxwidth200 shadow valignmiddle"';
1623 if ($useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1624 print
' height="20"';
1627 print
' style="max-height: 24px"';
1629 print
' src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.urlencode($modulepart).
'&entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$smallfile);
1630 if (!empty($filearray[$key][
'date'])) {
1631 print
'&cache='.urlencode((
string) $filearray[$key][
'date']);
1633 print
'" title="">';
1640 if (empty($moreoptions[
'hideshared'])) {
1641 print
'<td class="center nowraponsmartphone">';
1642 if ($relativedir && $filearray[$key][
'rowid'] > 0) {
1644 print
'<label for="idshareenabled'.$key.
'">'.$langs->trans(
"FileSharedViaALink").
'</label> ';
1645 print
'<input class="inline-block" type="checkbox" id="idshareenabled'.$key.
'" name="shareenabled"'.($file[
'share'] ?
' checked="checked"' :
'').
' /> ';
1647 if ($file[
'share']) {
1649 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
1650 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1654 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1656 if (!empty($file[
'share'])) {
1657 $paramlink .=
'hashp='.$file[
'share'];
1659 if ($forcedownload) {
1660 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1663 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1665 print
'<!-- shared link -->';
1666 print
'<a href="'.$fulllink.
'" target="_blank" rel="noopener" data-showidonhover="downloadlink'.$filearray[$key][
'rowid'].
'">';
1667 print
img_picto($langs->trans(
"FileSharedViaALink"),
'collab');
1669 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">';
1679 if (!empty($moreoptions[
'buttons'])) {
1681 foreach ($moreoptions[
'buttons'] as $moreoptval) {
1682 print
'<a href="'.$moreoptval[
'url'].
'&urlfile='.urlencode($file[
'name']).
'">';
1683 print $moreoptval[
'picto'];
1693 print
'<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1694 if ($useinecm == 1 || $useinecm == 5) {
1696 $newparam = preg_replace(
'/&file=.*$/',
'', $param);
1697 $backtopage = DOL_URL_ROOT.
'/ecm/index.php?§ion_dir='.urlencode($relativepath).$newparam;
1698 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>';
1701 if (empty($useinecm) || $useinecm == 2 || $useinecm == 3 || $useinecm == 6) {
1702 $newmodulepart = $modulepart;
1703 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1704 $newmodulepart =
'produit|service';
1707 if ($permtoeditline) {
1708 $moreparaminurl =
'';
1710 $moreparaminurl .=
'&id='.$object->id;
1711 } elseif (
GETPOST(
'website',
'alpha')) {
1712 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1715 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1716 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1719 if (!preg_match(
'/\.webp$/i', $file[
'name'])) {
1720 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1721 print
'<a href="'.DOL_URL_ROOT.
'/ecm/index_medias.php?action=confirmconvertimgwebp&token='.newToken().
'§ion_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>';
1722 } elseif ($modulepart ==
'medias' &&
GETPOST(
'website')) {
1723 print
'<a href="'.DOL_URL_ROOT.
'/website/index.php?action=confirmconvertimgwebp&token='.newToken().
'§ion_dir='.urlencode($relativepath).
'&filetoregenerate='.urlencode($fileinfo[
'basename']).
'&module='.$modulepart.$param.$moreparaminurl.
'" title="'.
dol_escape_htmltag($langs->trans(
"GenerateChosenImgWebp")).
'">'.
img_picto(
'',
'images',
'class="flip marginrightonly"').
'</a>';
1729 if ($permtoeditline) {
1731 $moreparaminurl =
'';
1733 $moreparaminurl .=
'&id='.$object->id;
1734 } elseif (
GETPOST(
'website',
'alpha')) {
1735 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1738 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1739 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1742 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/core/photos_resize.php?modulepart='.urlencode($newmodulepart).$moreparaminurl.
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension'])).
'" title="'.
dol_escape_htmltag($langs->trans(
"ResizeOrCrop")).
'">'.
img_picto($langs->trans(
"ResizeOrCrop"),
'resize',
'class="paddingrightonly"').
'</a>';
1746 if ($permtoeditline) {
1747 $paramsectiondir = (in_array($modulepart, array(
'medias',
'ecm')) ?
'§ion_dir='.urlencode($relativepath) :
'');
1748 print
'<a class="editfielda reposition editfilelink paddingright marginleftonly" href="'.(($useinecm == 1 || $useinecm == 5) ?
'#' : ($url.
'?action=editfile&urlfile='.urlencode($filepath).$paramsectiondir.$param)).
'" rel="'.$filepath.
'">'.
img_edit(
'default', 0,
'class="paddingrightonly"').
'</a>';
1752 if ($permonobject) {
1754 if (!empty(
$conf->dol_use_jmobile)) {
1757 if (empty(
$conf->use_javascript_ajax)) {
1764 print
'<a href="'.((($useinecm && $useinecm != 3 && $useinecm != 6) && $useajax) ?
'#' : ($url.
'?action=deletefile&token='.newToken().
'&urlfile='.urlencode($filepath).$param)).
'" class="reposition deletefilelink paddingright marginleftonly" rel="'.$filepath.
'">'.
img_delete().
'</a>';
1768 if (empty($disablemove) && count($filearray) > 1) {
1769 if ($nboffiles > 1 &&
$conf->browser->layout !=
'phone') {
1770 print
'<td class="linecolmove tdlineupdown center">';
1772 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&rowid='.
$object->id.
'">'.
img_up(
'default', 0,
'imgupforline').
'</a>';
1774 if ($i < ($nboffiles - 1)) {
1775 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&rowid='.
$object->id.
'">'.
img_down(
'default', 0,
'imgdownforline').
'</a>';
1779 print
'<td'.(($conf->browser->layout !=
'phone') ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'>';
1784 print
'<td class="right">';
1785 print
'<input type="hidden" name="ecmfileid" value="'.(empty($filearray[$key][
'rowid']) ?
'' : $filearray[$key][
'rowid']).
'">';
1786 print
'<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv(
"Save")).
'">';
1787 print
'<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv(
"Cancel")).
'">';
1789 if (empty($disablemove) && count($filearray) > 1) {
1790 print
'<td class="right"></td>';
1798 if ($nboffiles == 0) {
1800 if (!empty($moreoptions[
'buttons'])) {
1803 if (!empty($moreoptions[
'hideshared'])) {
1806 if (empty($disablemove) && count($filearray) > 1) {
1809 print
'<tr class="oddeven"><td colspan="'.$colspan.
'">';
1810 if (empty($textifempty)) {
1811 print
'<span class="opacitymedium">'.$langs->trans(
"NoFileFound").
'</span>';
1813 print
'<span class="opacitymedium">'.dolPrintHTML($textifempty).
'</span>';
1821 if ($nboflines > 1 && is_object(
$object)) {
1822 if (!empty(
$conf->use_javascript_ajax) && $permtoeditline) {
1823 $table_element_line =
'ecm_files';
1824 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1828 print ajax_autoselect(
'downloadlink');
1830 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1858 public function list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload = 0, $relativepath =
'', $permissiontodelete = 1, $useinecm = 0, $textifempty =
'', $maxlength = 0, $url =
'', $addfilterfields = 0)
1861 global
$conf, $langs, $hookmanager, $form;
1862 global $sortfield, $sortorder;
1863 global $search_doc_ref;
1866 dol_syslog(get_class($this).
'::list_of_autoecmfiles upload_dir='.$upload_dir.
' modulepart='.$modulepart);
1869 if (empty($useinecm) || $useinecm == 6) {
1873 $url = $_SERVER[
"PHP_SELF"];
1876 if (!empty($addfilterfields)) {
1877 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'">';
1878 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1879 print
'<input type="hidden" name="module" value="'.$modulepart.
'">';
1882 print
'<div class="div-table-responsive-no-min">';
1883 print
'<table class="noborder centpercent">'.
"\n";
1885 if (!empty($addfilterfields)) {
1886 print
'<tr class="liste_titre nodrag nodrop">';
1888 print
'<td class="liste_titre"></td>';
1890 print
'<td class="liste_titre"><input type="text" class="maxwidth100onsmartphone" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).
'"></td>';
1892 print
'<td class="liste_titre"></td>';
1894 print
'<td class="liste_titre"></td>';
1896 print
'<td class="liste_titre right">';
1897 $searchpicto = $form->showFilterButtons();
1903 print
'<tr class="liste_titre">';
1904 $sortref =
"fullname";
1905 if ($modulepart ==
'invoice_supplier') {
1906 $sortref =
'level1name';
1916 $object_instance =
null;
1917 if ($modulepart ==
'company') {
1918 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
1919 $object_instance =
new Societe($this->db);
1920 } elseif ($modulepart ==
'invoice') {
1921 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
1922 $object_instance =
new Facture($this->db);
1923 } elseif ($modulepart ==
'invoice_supplier') {
1924 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
1926 } elseif ($modulepart ==
'propal') {
1927 include_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
1928 $object_instance =
new Propal($this->db);
1929 } elseif ($modulepart ==
'supplier_proposal') {
1930 include_once DOL_DOCUMENT_ROOT.
'/supplier_proposal/class/supplier_proposal.class.php';
1932 } elseif ($modulepart ==
'order') {
1933 include_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
1934 $object_instance =
new Commande($this->db);
1935 } elseif ($modulepart ==
'order_supplier') {
1936 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1938 } elseif ($modulepart ==
'contract') {
1939 include_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
1940 $object_instance =
new Contrat($this->db);
1941 } elseif ($modulepart ==
'product') {
1942 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
1943 $object_instance =
new Product($this->db);
1944 } elseif ($modulepart ==
'tax') {
1945 include_once DOL_DOCUMENT_ROOT.
'/compta/sociales/class/chargesociales.class.php';
1947 } elseif ($modulepart ==
'tax-vat') {
1948 include_once DOL_DOCUMENT_ROOT.
'/compta/tva/class/tva.class.php';
1949 $object_instance =
new Tva($this->db);
1950 } elseif ($modulepart ==
'salaries') {
1951 include_once DOL_DOCUMENT_ROOT.
'/salaries/class/salary.class.php';
1952 $object_instance =
new Salary($this->db);
1953 } elseif ($modulepart ==
'project') {
1954 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
1955 $object_instance =
new Project($this->db);
1956 } elseif ($modulepart ==
'project_task') {
1957 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
1958 $object_instance =
new Task($this->db);
1959 } elseif ($modulepart ==
'fichinter') {
1960 include_once DOL_DOCUMENT_ROOT.
'/fichinter/class/fichinter.class.php';
1961 $object_instance =
new Fichinter($this->db);
1962 } elseif ($modulepart ==
'user') {
1963 include_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
1964 $object_instance =
new User($this->db);
1965 } elseif ($modulepart ==
'expensereport') {
1966 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
1968 } elseif ($modulepart ==
'holiday') {
1969 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
1970 $object_instance =
new Holiday($this->db);
1971 } elseif ($modulepart ==
'recruitment-recruitmentcandidature') {
1972 include_once DOL_DOCUMENT_ROOT.
'/recruitment/class/recruitmentcandidature.class.php';
1974 } elseif ($modulepart ==
'banque') {
1975 include_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
1976 $object_instance =
new Account($this->db);
1977 } elseif ($modulepart ==
'bank-statement') {
1979 $object_instance =
null;
1980 } elseif ($modulepart ==
'chequereceipt') {
1981 include_once DOL_DOCUMENT_ROOT.
'/compta/paiement/cheque/class/remisecheque.class.php';
1983 } elseif ($modulepart ==
'mrp-mo') {
1984 include_once DOL_DOCUMENT_ROOT.
'/mrp/class/mo.class.php';
1985 $object_instance =
new Mo($this->db);
1987 $parameters = array(
'modulepart' => $modulepart);
1988 $reshook = $hookmanager->executeHooks(
'addSectionECMAuto', $parameters);
1989 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
1990 if (array_key_exists(
'classpath', $hookmanager->resArray) && !empty($hookmanager->resArray[
'classpath'])) {
1992 if (array_key_exists(
'classname', $hookmanager->resArray) && !empty($hookmanager->resArray[
'classname'])) {
1993 $tmpclassname = $hookmanager->resArray[
'classname'];
1994 if (is_string($tmpclassname) && class_exists($tmpclassname)) {
1995 $object_instance =
new $tmpclassname($this->db);
2006 $relativepathfromroot = preg_replace(
'/'.preg_quote(DOL_DATA_ROOT.
'/',
'/').
'/',
'', $upload_dir);
2007 if ($relativepathfromroot) {
2009 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $filearray';
2012 if ($sortfield && $sortorder) {
2013 $filearray =
dol_sort_array($filearray, $sortfield, $sortorder, 1);
2019 foreach ($filearray as $key => $file) {
2020 if (!is_dir($file[
'name'])
2021 && $file[
'name'] !=
'.'
2022 && $file[
'name'] !=
'..'
2023 && $file[
'name'] !=
'CVS'
2024 && !preg_match(
'/\.meta$/i', $file[
'name'])) {
2026 $relativefile = preg_replace(
'/'.preg_quote($upload_dir.
'/',
'/').
'/',
'', $file[
'fullname']);
2034 if ($modulepart ==
'company' || $modulepart ==
'tax' || $modulepart ==
'tax-vat' || $modulepart ==
'salaries') {
2035 preg_match(
'/(\d+)\/[^\/]+$/', $relativefile, $reg);
2036 $id = (isset($reg[1]) ? $reg[1] :
'');
2037 } elseif ($modulepart ==
'invoice_supplier') {
2038 preg_match(
'/([^\/]+)\/[^\/]+$/', $relativefile, $reg);
2039 $ref = (isset($reg[1]) ? $reg[1] :
'');
2040 if (is_numeric($ref)) {
2044 } elseif ($modulepart ==
'user') {
2046 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
2047 $id = (isset($reg[1]) ? $reg[1] :
'');
2048 } elseif ($modulepart ==
'project_task') {
2050 $reg = explode(
"/", $relativefile);
2051 $ref = (isset($reg[1]) ? $reg[1] :
'');
2052 } elseif (in_array($modulepart, array(
2055 'supplier_proposal',
2064 'recruitment-recruitmentcandidature',
2069 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
2070 $ref = (isset($reg[1]) ? $reg[1] :
'');
2072 $parameters = array(
'modulepart' => $modulepart,
'fileinfo' => $file);
2073 $reshook = $hookmanager->executeHooks(
'addSectionECMAuto', $parameters);
2074 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
2075 if (array_key_exists(
'ref', $hookmanager->resArray) && !empty($hookmanager->resArray[
'ref'])) {
2076 $ref = $hookmanager->resArray[
'ref'];
2078 if (array_key_exists(
'id', $hookmanager->resArray) && !empty($hookmanager->resArray[
'id'])) {
2079 $id = $hookmanager->resArray[
'id'];
2085 if (!
$id && !$ref) {
2090 if (!empty(
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref])) {
2096 if (is_object($object_instance)) {
2097 $object_instance->id = 0;
2098 $object_instance->ref =
'';
2100 $result = $object_instance->fetch(
$id);
2102 $result = $object_instance->fetch(0, $ref);
2104 print $object_instance->error;
2105 } elseif ($result == 0) {
2111 $result = $object_instance->fetchOneLike($ref);
2118 $conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref] = clone $object_instance;
2122 $conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref] =
'notfound';
2123 unset($filearray[$key]);
2127 if ($found <= 0 || !is_object(
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref])) {
2131 print
'<!-- Line list_of_autoecmfiles key='.$key.
' -->'.
"\n";
2132 print
'<tr class="oddeven">';
2134 print
'<td class="tdoverflowmax150">';
2135 if ($found > 0 && is_object(
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref])) {
2136 $tmpobject =
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref];
2138 print $tmpobject->getNomUrl(1,
'document');
2143 print $langs->trans(
"ObjectDeleted", (
$id ?
$id : $ref));
2161 print
'target="_blank" ';
2163 print
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.urlencode($modulepart);
2164 if ($forcedownload) {
2165 print
'&attachment=1';
2167 print
'&file='.urlencode($relativefile).
'">';
2174 print $this->
showPreview($file, $modulepart, $file[
'relativename']);
2181 print
'<td class="right nowraponall">';
2182 if ($sizetoshow == $sizetoshowbytes) {
2185 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
2190 print
'<td class="center">'.dol_print_date($file[
'date'],
"dayhour").
'</td>';
2193 print
'<td class="right">';
2194 if (!empty($file[
'share'])) {
2196 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
2197 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
2201 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
2203 if (!empty($file[
'share'])) {
2204 $paramlink .=
'hashp='.$file[
'share'];
2206 if ($forcedownload) {
2207 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
2210 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
2212 print
'<!-- shared link -->';
2213 print
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
' ';
2214 print
'<input type="text" class="quatrevingtpercent width100 nopadding nopadding small downloadexternallink" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).
'" spellcheck="false">';
2228 if (count($filearray) == 0) {
2229 print
'<tr class="oddeven"><td colspan="5">';
2230 if (empty($textifempty)) {
2231 print
'<span class="opacitymedium">'.$langs->trans(
"NoFileFound").
'</span>';
2233 print
'<span class="opacitymedium">'.$textifempty.
'</span>';
2240 if (!empty($addfilterfields)) {
2243 return count($filearray);
2259 public function listOfLinks(
$object, $permissiontodelete = 1, $action =
null, $selected =
null, $param =
'', $htmlname =
'formaddlink', $moreoptions = array())
2261 global
$conf, $langs;
2262 global $sortfield, $sortorder;
2264 $langs->load(
"link");
2266 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2267 $link =
new Link($this->db);
2269 if ($sortfield ==
"name") {
2270 $sortfield =
"label";
2271 } elseif ($sortfield ==
"date") {
2272 $sortfield =
"datea";
2276 $res = $link->fetchAll($links,
$object->element,
$object->id, $sortfield, $sortorder);
2277 $param .= (isset(
$object->id) && !preg_match(
'/&id='.
$object->id.
'/i', $param) ?
'&id='.$object->id :
'');
2279 $permissiontoedit = $permissiontodelete;
2281 print
'<!-- listOfLinks -->'.
"\n";
2283 $morehtmlright =
'';
2284 if (!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) {
2285 $morehtmlright .= dolGetButtonTitle($langs->trans(
'New'),
'',
'fa fa-plus-circle',
'javascript:console.log("open addlink form"); jQuery(".divlinkfile").toggle(); void(0);',
'', $permissiontoedit);
2289 print
load_fiche_titre($langs->trans(
"LinkedFiles"), $morehtmlright,
'link', 0,
'',
'table-list-of-links');
2291 if (!empty($moreoptions) && $moreoptions[
'afterlinktitle']) {
2292 print
'<div class="divlinkfile'.((!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) ?
' hidden' :
'').
'">'.$moreoptions[
'afterlinktitle'].
'</div>';
2295 print
'<form action="'.$_SERVER[
'PHP_SELF'].($param ?
'?'.$param :
'').
'" id="'.$htmlname.
'" method="POST">';
2296 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2297 print
'<div class="div-table-responsive-no-min">';
2299 print
'<table class="liste noborder nobottom centpercent">';
2300 print
'<tr class="liste_titre">';
2302 $langs->trans(
"Links"),
2303 $_SERVER[
'PHP_SELF'],
2324 $langs->trans(
"Date"),
2325 $_SERVER[
'PHP_SELF'],
2336 $_SERVER[
'PHP_SELF'],
2348 $nboflinks = count($links);
2349 if ($nboflinks > 0) {
2350 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2352 foreach ($links as $key => $link) {
2353 print
'<tr class="oddeven">';
2355 if ($action ==
'update' && (
int) $selected === (
int) $link->id && $permissiontoedit) {
2357 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2358 print
'<input type="hidden" name="linkid" value="'.$link->id.
'">';
2359 print
'<input type="hidden" name="action" value="confirm_updateline">';
2360 print $langs->trans(
'Link').
': <input type="text" name="link" value="'.$link->url.
'">';
2363 print $langs->trans(
'Label').
': <input type="text" name="label" value="'.
dol_escape_htmltag($link->label).
'">';
2365 print
'<td class="center">'.dol_print_date(
dol_now(),
"dayhour",
"tzuser").
'</td>';
2366 print
'<td class="right">';
2367 print
'<label for="idshareenabled'.$key.
'">'.$langs->trans(
"LinkSharedViaALink").
'</label> ';
2368 print
'<input class="inline-block" type="checkbox" id="idshareenabled'.$key.
'" name="shareenabled"'.($link->share ?
' checked="checked"' :
'').
' /> ';
2370 print
'<td class="right">';
2371 print
'<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'">';
2372 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'">';
2377 print
'<a data-ajax="false" href="'.$link->url.
'" target="_blank" rel="noopener noreferrer">';
2381 print
'<td class="right"></td>';
2382 print
'<td class="center">'.dol_print_date($link->datea,
"dayhour",
"tzuser").
'</td>';
2383 print
'<td class="center">';
2386 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim(
$dolibarr_main_url_root));
2387 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
2388 $fulllink = $urlwithroot.
'/document.php?type=link&hashp=' . $link->share;
2390 print
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
2391 print
'<input type="text" class="centpercentminusx minwidth200imp nopadding small downloadexternallink" id="downloadlink'.$link->id.
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"LinkSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
2394 print
'<td class="right">';
2395 print
'<a href="'.$_SERVER[
'PHP_SELF'].
'?action=update&linkid='.$link->id.$param.
'&token='.newToken().
'" class="editfilelink editfielda reposition" >'.
img_edit().
'</a>';
2396 if ($permissiontodelete) {
2397 print
' <a class="deletefilelink reposition" href="'.$_SERVER[
'PHP_SELF'].
'?action=deletelink&token='.newToken().
'&linkid='.((int) $link->id).$param.
'">'.
img_delete().
'</a>';
2405 if ($nboflinks == 0) {
2406 print
'<tr class="oddeven"><td colspan="5">';
2407 print
'<span class="opacitymedium">'.$langs->trans(
"NoLinkFound").
'</span>';
2428 public function showPreview($file, $modulepart, $relativepath, $ruleforpicto = 0, $param =
'')
2430 global $langs,
$conf;
2433 if ((
$conf->browser->layout !=
'phone' ||
getDolGlobalString(
'MAIN_SHOW_PREVIEW_PICTO_EVEN_ON_PHONE')) && !empty(
$conf->use_javascript_ajax)) {
2434 $urladvancedpreview = getAdvancedPreviewUrl($modulepart, $relativepath, 1, $param);
2435 if (count($urladvancedpreview)) {
2436 $out .=
'<a class="pictopreview '.$urladvancedpreview[
'css'].
'" href="'.$urladvancedpreview[
'url'].
'"'.(empty($urladvancedpreview[
'mime']) ?
'' :
' mime="'.$urladvancedpreview[
'mime'].
'"').
' '.(empty($urladvancedpreview[
'target']) ?
'' :
' target="'.$urladvancedpreview[
'target'].
'"').
'>';
2438 if (empty($ruleforpicto)) {
2439 $out .=
img_picto(
'',
'search-plus',
'class="pictofixedwidth"');
2441 $out .=
img_mime($relativepath, $langs->trans(
'Preview').
' '.$file[
'name'],
'pictofixedwidth');
2445 if ($ruleforpicto < 0) {
2446 $out .=
img_picto(
'',
'generic',
'', 0, 0, 0,
'',
'paddingright pictofixedwidth');
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
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.
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 of the module paid holiday.
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 VAT - Value-added tax (also known in French as TVA)
Class to manage Dolibarr users.
dol_filemtime($pathoffile)
Return time of a file.
dol_filesize($pathoffile)
Return size of a file.
completeFileArrayWithDatabaseInfo(&$filearray, $relativedir, $object=null)
Complete $filearray with data from database.
dol_is_file($pathoffile)
Return if path is a file.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
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)
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dolPrintHTML($s, $allowiframe=0, $moreallowedtags=array())
Return a string (that can be on several lines) ready to be output on a HTML page.
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.
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
if(!defined( 'IMAGETYPE_WEBP')) getDefaultImageSizes()
Return default values for image sizes.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
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.