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'];
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);
510 $supportedmoduleparts = [
526 'commande_fournisseur',
527 'facture_fournisseur',
535 if (in_array($modulepart, $supportedmoduleparts)) {
536 $printer = ($user->hasRight(
'printing',
'read') &&
isModEnabled(
'printing'));
539 $hookmanager->initHooks(array(
'formfile'));
542 $file_list = array();
543 if (!empty($filedir)) {
544 $file_list =
dol_dir_list($filedir,
'files', 0,
'',
'(\.meta|_preview.*.*\.png)$',
'date', SORT_DESC);
546 if ($hideifempty && empty($file_list)) {
551 $forname =
'builddoc';
556 $out .=
"\n".
'<!-- Start show_document -->'.
"\n";
558 if (preg_match(
'/massfilesarea_/', $modulepart)) {
559 $out .=
'<div id="show_files"><br></div>'.
"\n";
560 $title = $langs->trans(
"MassFilesArea").
' <a href="" id="togglemassfilesarea" ref="shown">('.$langs->trans(
"Hide").
')</a>';
561 $title .=
'<script nonce="'.getNonce().
'">
562 jQuery(document).ready(function() {
563 jQuery(\'#togglemassfilesarea\').click(function() {
564 if (jQuery(\'#togglemassfilesarea\').attr(\'ref\') == "shown")
566 jQuery(\'#'.$modulepart.
'_table\').hide();
567 jQuery(\'#togglemassfilesarea\').attr("ref", "hidden");
568 jQuery(\'#togglemassfilesarea\').text("('.
dol_escape_js($langs->trans(
"Show")).
')");
572 jQuery(\'#'.$modulepart.
'_table\').show();
573 jQuery(\'#togglemassfilesarea\').attr("ref","shown");
574 jQuery(\'#togglemassfilesarea\').text("('.
dol_escape_js($langs->trans(
"Hide")).
')");
582 $titletoshow = $langs->trans(
"Documents");
583 if (!empty($title)) {
584 $titletoshow = ($title ==
'none' ?
'' : $title);
587 $submodulepart = $modulepart;
590 $tmp = explode(
':', $modulepart);
591 if (!empty($tmp[1])) {
592 $modulepart = $tmp[0];
593 $submodulepart = $tmp[1];
596 $addcolumforpicto = ($delallowed || $printer || $morepicto);
597 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
602 $modellist = array();
604 if ($modulepart ==
'company') {
606 if (is_array($genallowed)) {
607 $modellist = $genallowed;
609 include_once DOL_DOCUMENT_ROOT.
'/core/modules/societe/modules_societe.class.php';
612 } elseif ($modulepart ==
'propal') {
613 if (is_array($genallowed)) {
614 $modellist = $genallowed;
616 include_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
619 } elseif ($modulepart ==
'supplier_proposal') {
620 if (is_array($genallowed)) {
621 $modellist = $genallowed;
623 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_proposal/modules_supplier_proposal.php';
626 } elseif ($modulepart ==
'commande') {
627 if (is_array($genallowed)) {
628 $modellist = $genallowed;
630 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
633 } elseif ($modulepart ==
'expedition') {
634 if (is_array($genallowed)) {
635 $modellist = $genallowed;
637 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
640 } elseif ($modulepart ==
'reception') {
641 if (is_array($genallowed)) {
642 $modellist = $genallowed;
644 include_once DOL_DOCUMENT_ROOT.
'/core/modules/reception/modules_reception.php';
647 } elseif ($modulepart ==
'delivery') {
648 if (is_array($genallowed)) {
649 $modellist = $genallowed;
651 include_once DOL_DOCUMENT_ROOT.
'/core/modules/delivery/modules_delivery.php';
654 } elseif ($modulepart ==
'ficheinter') {
655 if (is_array($genallowed)) {
656 $modellist = $genallowed;
658 include_once DOL_DOCUMENT_ROOT.
'/core/modules/fichinter/modules_fichinter.php';
661 } elseif ($modulepart ==
'facture') {
662 if (is_array($genallowed)) {
663 $modellist = $genallowed;
665 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
668 } elseif ($modulepart ==
'contract') {
670 if (is_array($genallowed)) {
671 $modellist = $genallowed;
673 include_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
676 } elseif ($modulepart ==
'project') {
677 if (is_array($genallowed)) {
678 $modellist = $genallowed;
680 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/modules_project.php';
683 } elseif ($modulepart ==
'project_task') {
684 if (is_array($genallowed)) {
685 $modellist = $genallowed;
687 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/task/modules_task.php';
690 } elseif ($modulepart ==
'product') {
691 if (is_array($genallowed)) {
692 $modellist = $genallowed;
694 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product/modules_product.class.php';
697 } elseif ($modulepart ==
'product_batch') {
698 if (is_array($genallowed)) {
699 $modellist = $genallowed;
701 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product_batch/modules_product_batch.class.php';
704 } elseif ($modulepart ==
'stock') {
705 if (is_array($genallowed)) {
706 $modellist = $genallowed;
708 include_once DOL_DOCUMENT_ROOT.
'/core/modules/stock/modules_stock.php';
711 } elseif ($modulepart ==
'hrm') {
712 if (is_array($genallowed)) {
713 $modellist = $genallowed;
715 include_once DOL_DOCUMENT_ROOT.
'/core/modules/hrm/modules_evaluation.php';
718 } elseif ($modulepart ==
'movement') {
719 if (is_array($genallowed)) {
720 $modellist = $genallowed;
722 include_once DOL_DOCUMENT_ROOT.
'/core/modules/movement/modules_movement.php';
725 } elseif ($modulepart ==
'export') {
726 if (is_array($genallowed)) {
727 $modellist = $genallowed;
729 include_once DOL_DOCUMENT_ROOT.
'/core/modules/export/modules_export.php';
731 $modellist = array();
733 } elseif ($modulepart ==
'commande_fournisseur' || $modulepart ==
'supplier_order') {
734 if (is_array($genallowed)) {
735 $modellist = $genallowed;
737 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
740 } elseif ($modulepart ==
'facture_fournisseur' || $modulepart ==
'supplier_invoice') {
742 if (is_array($genallowed)) {
743 $modellist = $genallowed;
745 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_invoice/modules_facturefournisseur.php';
748 } elseif ($modulepart ==
'supplier_payment') {
749 if (is_array($genallowed)) {
750 $modellist = $genallowed;
752 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_payment/modules_supplier_payment.php';
755 } elseif ($modulepart ==
'remisecheque') {
756 if (is_array($genallowed)) {
757 $modellist = $genallowed;
759 include_once DOL_DOCUMENT_ROOT.
'/core/modules/cheque/modules_chequereceipts.php';
762 } elseif ($modulepart ==
'donation') {
763 if (is_array($genallowed)) {
764 $modellist = $genallowed;
766 include_once DOL_DOCUMENT_ROOT.
'/core/modules/dons/modules_don.php';
769 } elseif ($modulepart ==
'member') {
770 if (is_array($genallowed)) {
771 $modellist = $genallowed;
773 include_once DOL_DOCUMENT_ROOT.
'/core/modules/member/modules_cards.php';
776 } elseif ($modulepart ==
'agenda' || $modulepart ==
'actions') {
777 if (is_array($genallowed)) {
778 $modellist = $genallowed;
780 include_once DOL_DOCUMENT_ROOT.
'/core/modules/action/modules_action.php';
783 } elseif ($modulepart ==
'expensereport') {
784 if (is_array($genallowed)) {
785 $modellist = $genallowed;
787 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expensereport/modules_expensereport.php';
790 } elseif ($modulepart ==
'unpaid') {
792 } elseif ($modulepart ==
'user') {
793 if (is_array($genallowed)) {
794 $modellist = $genallowed;
796 include_once DOL_DOCUMENT_ROOT.
'/core/modules/user/modules_user.class.php';
799 } elseif ($modulepart ==
'usergroup') {
800 if (is_array($genallowed)) {
801 $modellist = $genallowed;
803 include_once DOL_DOCUMENT_ROOT.
'/core/modules/usergroup/modules_usergroup.class.php';
808 $file =
dol_buildpath(
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
810 if (file_exists($file)) {
811 $res = include_once $file;
814 $file =
dol_buildpath(
'/'.$modulepart.
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
815 $res = include_once $file;
818 $class =
'ModelePDF'.ucfirst($submodulepart);
820 if (class_exists($class)) {
821 $modellist = call_user_func($class.
'::liste_modeles', $this->db);
823 dol_print_error($this->db,
"Bad value for modulepart '".$modulepart.
"' in showdocuments (class ".$class.
" for Doc generation not found)");
831 if (empty($buttonlabel)) {
832 $buttonlabel = $langs->trans(
'Generate');
835 if ($conf->browser->layout ==
'phone') {
836 $urlsource .=
'#'.$forname.
'_form';
838 if (empty($noform)) {
839 $out .=
'<form action="'.$urlsource.
'" id="'.$forname.
'_form" method="post">';
841 $out .=
'<input type="hidden" name="action" value="builddoc">';
842 $out .=
'<input type="hidden" name="page_y" value="">';
843 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
848 $out .=
'<div class="div-table-responsive-no-min">';
849 $out .=
'<table class="liste formdoc noborder centpercent">';
851 $out .=
'<tr class="liste_titre">';
852 $addcolumforpicto = ($delallowed || $printer || $morepicto);
853 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
856 $out .=
'<th colspan="'.$colspan.
'" class="formdoc liste_titre maxwidthonsmartphone center">';
859 if (!empty($modellist)) {
861 $out .=
'<span class="hideonsmartphone">'.$langs->trans(
'Model').
' </span>';
862 if (is_array($modellist) && count($modellist) == 1) {
863 $arraykeys = array_keys($modellist);
864 $modelselected = $arraykeys[0];
866 $morecss =
'minwidth75 maxwidth200';
867 if ($conf->browser->layout ==
'phone') {
868 $morecss =
'maxwidth100';
870 $out .= $form->selectarray(
'model', $modellist, $modelselected, $showempty, 0, 0,
'', 0, 0, 0,
'', $morecss, 1,
'', 0, 0);
871 if ($conf->use_javascript_ajax) {
874 $out .= $form->textwithpicto(
'', $tooltipontemplatecombo, 1,
'help',
'marginrightonly', 0, 3,
'', 0);
876 $out .=
'<div class="float">'.$langs->trans(
"Files").
'</div>';
880 if (($allowgenifempty || (is_array($modellist) && count($modellist) > 0)) &&
getDolGlobalInt(
'MAIN_MULTILANGS') && !$forcenomultilang && (!empty($modellist) || $showempty)) {
881 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formadmin.class.php';
883 $defaultlang = ($codelang && $codelang !=
'auto') ? $codelang : $langs->getDefaultLang();
884 $morecss =
'maxwidth150';
885 if ($conf->browser->layout ==
'phone') {
886 $morecss =
'maxwidth100';
888 $out .= $formadmin->select_language($defaultlang,
'lang_id', 0, array(), 0, 0, 0, $morecss);
894 $genbutton =
'<input class="button buttongen reposition nomargintop nomarginbottom" id="'.$forname.
'_generatebutton" name="'.$forname.
'_generatebutton"';
895 $genbutton .=
' type="submit" value="'.$buttonlabel.
'"';
896 if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) {
897 $genbutton .=
' disabled';
900 if ($allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
901 $langs->load(
"errors");
902 $genbutton .=
' '.img_warning($langs->transnoentitiesnoconv(
"WarningNoDocumentModelActivated"));
907 if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
910 if (empty($modellist) && !$showempty && $modulepart !=
'unpaid') {
916 if (!empty($hookmanager->hooks[
'formfile'])) {
917 foreach ($hookmanager->hooks[
'formfile'] as $module) {
918 if (method_exists($module,
'formBuilddocLineOptions')) {
927 $parameters = array(
'colspan' => ($colspan + $colspanmore),
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'modulepart' => $modulepart);
928 if (is_object($hookmanager)) {
929 $reshook = $hookmanager->executeHooks(
'formBuilddocOptions', $parameters, $GLOBALS[
'object']);
930 $out .= $hookmanager->resPrint;
935 if (!empty($filedir)) {
936 $link_list = array();
938 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
939 $link =
new Link($this->db);
940 $sortfield = $sortorder =
'';
941 $res = $link->fetchAll($link_list,
$object->element,
$object->id, $sortfield, $sortorder);
944 $out .=
'<!-- html.formfile::showdocuments -->'.
"\n";
947 if ((!empty($file_list) || !empty($link_list) || preg_match(
'/^massfilesarea/', $modulepart))
950 $out .=
'<div class="titre paddingbottom">'.$titletoshow.
'</div>'.
"\n";
951 $out .=
'<div class="div-table-responsive-no-min">';
952 $out .=
'<table class="noborder centpercent" id="'.$modulepart.
'_table">'.
"\n";
956 if (is_array($file_list)) {
957 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string}> $file_list';
961 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filedir);
962 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
968 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $file_list';
971 if (!empty($sortfield) && !empty($sortorder)) {
976 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $file_list';
978 require_once DOL_DOCUMENT_ROOT .
'/ecm/class/ecmfiles.class.php';
981 foreach ($file_list as $file) {
984 if (!empty($file[
'rowid']) && $user->hasRight(
'ecm',
'read')) {
988 $ecmfile->fetch($file[
'rowid']);
995 $relativepath = (string) $file[
"name"];
997 $relativepath = (string) $modulesubdir.
"/".$file[
"name"];
999 if ($modulepart ==
'export') {
1000 $relativepath = (string) $file[
"name"];
1003 $out .=
'<tr class="oddeven'.((!$genallowed && $i == 1) ?
' trfirstline' :
'').
'">';
1005 $documenturl =
getDolGlobalString(
'DOL_URL_ROOT_DOCUMENT_PHP', DOL_URL_ROOT.
'/document.php');
1008 $imgpreview = $this->
showPreview($file, $modulepart, $relativepath, 0, $param);
1009 $out .=
'<td class="minwidth200 tdoverflowmax300">';
1011 $out .=
'<span class="spanoverflow widthcentpercentminusx valignmiddle">';
1013 $out .=
'<span class="spanoverflow">';
1016 $out .= $imgpreview;
1019 if (is_object($ecmfile)) {
1020 $out .= $ecmfile->getNomUrl(1, $modulepart, 0, 0,
' documentdownload');
1023 $out .=
'<a class="documentdownload paddingright" ';
1025 $out .=
'target="_blank" ';
1027 $out .=
'href="'.$documenturl.
'?modulepart='.$modulepart.
'&file='.urlencode($relativepath).($param ?
'&'.$param :
'').
'"';
1029 if (preg_match(
'/text/', $mime)) {
1030 $out .=
' target="_blank" rel="noopener noreferrer"';
1032 $out .=
' title="'.dol_escape_htmltag($file[
"name"]).
'"';
1034 $out .=
img_mime($file[
"name"], $langs->trans(
"File").
': '.$file[
"name"]);
1039 $out .=
'</span>'.
"\n";
1041 $out .= $imgpreview;
1047 $size = (!empty($file[
'size']) ? $file[
'size'] :
dol_filesize($filedir.
"/".$file[
"name"]));
1048 $out .=
'<td class="nowraponall right" title="'.dolPrintHTML($size.
' '.$langs->trans(
"Bytes")).
'">'.
dol_print_size($size, 1, 1).
'</td>';
1051 $date = (!empty($file[
'date']) ? $file[
'date'] :
dol_filemtime($filedir.
"/".$file[
"name"]));
1052 $out .=
'<td class="nowrap right">'.dol_print_date($date,
'dayhour',
'tzuser').
'</td>';
1055 $out .=
'<td class="nowraponall">';
1056 if (!empty($file[
'share'])) {
1058 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
1059 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1063 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1065 if (!empty($file[
'share'])) {
1066 $paramlink .=
'hashp='.$file[
'share'];
1068 if ($forcedownload) {
1069 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1072 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1074 $out .=
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
1075 $out .=
'<input type="text" class="quatrevingtpercentminusx width75 nopadding small downloadexternallink" id="downloadlink'.$file[
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
1083 if ($delallowed || $printer || $morepicto) {
1084 $out .=
'<td class="right nowraponall">';
1086 $tmpurlsource = preg_replace(
'/#[a-zA-Z0-9_]*$/',
'', $urlsource);
1087 $out .=
'<a class="reposition" href="'.$tmpurlsource.((strpos($tmpurlsource,
'?') ===
false) ?
'?' :
'&').
'action='.urlencode($removeaction).
'&token='.
newToken().
'&file='.urlencode($relativepath);
1088 $out .= ($param ?
'&'.$param :
'');
1091 $out .=
'">'.img_picto($langs->trans(
"Delete"),
'delete').
'</a>';
1094 $out .=
'<a class="marginleftonly reposition" href="'.$urlsource.(strpos($urlsource,
'?') ?
'&' :
'?').
'action=print_file&token='.
newToken().
'&printer='.urlencode($modulepart).
'&file='.urlencode($relativepath);
1095 $out .= ($param ?
'&'.$param :
'');
1096 $out .=
'">'.img_picto($langs->trans(
"PrintFile", $relativepath),
'printer').
'</a>';
1099 $morepicto = preg_replace(
'/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto);
1105 if (is_object($hookmanager)) {
1106 $addcolumforpicto = ($delallowed || $printer || $morepicto);
1107 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
1109 $parameters = array(
'colspan' => ($colspan + $colspanmore),
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'modulepart' => $modulepart,
'relativepath' => $relativepath);
1110 $res = $hookmanager->executeHooks(
'formBuilddocLineOptions', $parameters, $file);
1112 $out .= $hookmanager->resPrint;
1115 $out = $hookmanager->resPrint;
1120 $this->numoffiles++;
1123 if (is_array($link_list)) {
1126 foreach ($link_list as $file) {
1127 $out .=
'<tr class="oddeven">';
1128 $out .=
'<td colspan="'.$colspan.
'" class="maxwidhtonsmartphone">';
1129 $out .=
'<a data-ajax="false" href="'.$file->url.
'" target="_blank" rel="noopener noreferrer">';
1130 $out .= $file->label;
1133 $out .=
'<td class="right">';
1137 $out .=
'<td></td>';
1138 if ($delallowed || $printer || $morepicto) {
1139 $out .=
'<td></td>';
1141 $out .=
'</tr>'.
"\n";
1143 $this->numoffiles++;
1146 if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
1147 $out .=
'<tr><td colspan="'.(3 + ($addcolumforpicto ? 1 : 0)).
'"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>'.
"\n";
1153 $out .=
"</table>\n";
1156 if (empty($noform)) {
1157 $out .=
'</form>'.
"\n";
1161 $out .=
'<!-- End show_document -->'.
"\n";
1164 jQuery(document).ready(function() {
1165 var selectedValue = $(".selectformat").val();
1167 if (selectedValue === "excel2007" || selectedValue === "tsv") {
1168 $(".forhide").prop("disabled", true).hide();
1170 $(".forhide").prop("disabled", false).show();
1191 public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter =
'', $morecss =
'valignmiddle', $allfiles = 0)
1193 global $conf, $langs;
1195 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1198 $this->infofiles = array(
'nboffiles' => 0,
'extensions' => array(),
'files' => array());
1205 preg_match(
'/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir,
'/').
'$/', $filedir, $regs);
1206 $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1);
1211 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/');
1213 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/').
'\.';
1215 $file_list =
dol_dir_list($filedir,
'files', 0, $filterforfilesearch,
'\.meta$|\.png$');
1219 $out .=
'<!-- html.formfile::getDocumentsLink -->'.
"\n";
1220 if (!empty($file_list)) {
1221 $out =
'<dl class="dropdown inline-block">
1222 <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto(
'',
'listlight',
'', 0, 0, 0,
'', $morecss).
'</a></dt>
1223 <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1229 foreach ($file_list as $file) {
1231 if ($filter && !preg_match(
'/'.$filter.
'/i', $file[
"name"])) {
1237 $relativepath = $file[
"name"];
1238 if ($modulesubdir) {
1239 $relativepath = (string) $modulesubdir.
"/".$file[
"name"];
1242 if ($modulepart ==
'donation') {
1243 $relativepath = (string)
get_exdir($modulesubdir, 2, 0, 0,
null,
'donation').$file[
"name"];
1245 if ($modulepart ==
'export') {
1246 $relativepath = (string) $file[
"name"];
1249 $this->infofiles[
'nboffiles']++;
1250 $this->infofiles[
'files'][] = $file[
'fullname'];
1251 $ext = (string) pathinfo($file[
'name'], PATHINFO_EXTENSION);
1252 if (!array_key_exists($ext, $this->infofiles[
'extensions'])) {
1253 $this->infofiles[
'extensions'][$ext] = 1;
1255 $this->infofiles[
'extensions'][$ext]++;
1259 if (!empty($conf->use_javascript_ajax) && ($conf->browser->layout !=
'phone')) {
1261 if ($tmparray && $tmparray[
'url']) {
1262 $tmpout .=
'<li><a href="'.$tmparray[
'url'].
'"'.($tmparray[
'css'] ?
' class="'.$tmparray[
'css'].
'"' :
'').($tmparray[
'mime'] ?
' mime="'.$tmparray[
'mime'].
'"' :
'').($tmparray[
'target'] ?
' target="'.$tmparray[
'target'].
'"' :
'').
'>';
1264 $tmpout .=
img_picto(
'',
'search-plus',
'class="paddingright"');
1265 $tmpout .= $langs->trans(
"Preview").
' '.$ext.
'</a></li>';
1270 $tmpout .=
'<li class="nowrap"><a class="pictopreview nowrap" ';
1272 $tmpout .=
'target="_blank" ';
1274 $tmpout .=
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&entity='.$entity.
'&file='.urlencode($relativepath).
'"';
1276 if (preg_match(
'/text/', $mime)) {
1277 $tmpout .=
' target="_blank" rel="noopener noreferrer"';
1280 $tmpout .=
img_mime($relativepath, $file[
"name"]);
1281 $tmpout .= $langs->trans(
"Download").
' '.$ext;
1282 $tmpout .=
'</a></li>'.
"\n";
1285 $out .=
'</ul></div></dd>
1334 public function list_of_documents($filearray,
$object, $modulepart, $param =
'', $forcedownload = 0, $relativepath =
'', $permonobject = 1, $useinecm = 0, $textifempty =
'', $maxlength = 0, $title =
'', $url =
'', $showrelpart = 0, $permtoeditline = -1, $upload_dir =
'', $sortfield =
'', $sortorder =
'ASC', $disablemove = 1, $addfilterfields = 0, $disablecrop = -1, $moreattrondiv =
'', $moreoptions = array())
1337 global $user, $conf, $langs, $hookmanager, $form;
1338 global $sortfield, $sortorder;
1341 if ($disablecrop == -1) {
1344 if (in_array($modulepart, array(
'bank',
'bom',
'expensereport',
'facture',
'facture_fournisseur',
'holiday',
'medias',
'member',
'mrp',
'project',
'product',
'produit',
'propal',
'service',
'societe',
'tax',
'tax-vat',
'ticket',
'user'))) {
1350 if (empty($relativepath)) {
1353 $relativepath = (
$object->id).
'/';
1354 } elseif (!empty(
$object->element) &&
$object->element ==
'invoice_supplier') {
1356 } elseif (!empty(
$object->element) &&
$object->element ==
'project_task') {
1357 $relativepath =
'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1361 if (
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO') && isset($filearray[0]) && $filearray[0][
'level1name'] ==
'photos') {
1362 $relativepath = preg_replace(
'/^.*\/produit\//',
'', $filearray[0][
'path']).
'/';
1368 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dir);
1369 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
1376 $hookmanager->initHooks(array(
'formfile'));
1377 $parameters = array(
1378 'filearray' => $filearray,
1379 'modulepart' => $modulepart,
1381 'forcedownload' => $forcedownload,
1382 'relativepath' => $relativepath,
1383 'relativedir' => $relativedir,
1384 'permtodelete' => $permonobject,
1385 'useinecm' => $useinecm,
1386 'textifempty' => $textifempty,
1387 'maxlength' => $maxlength,
1392 $reshook = $hookmanager->executeHooks(
'showFilesList', $parameters,
$object);
1394 if (!empty($reshook)) {
1397 if (!is_object($form)) {
1398 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
1399 $form =
new Form($this->db);
1402 if (!preg_match(
'/&id=/', $param) && isset(
$object->id)) {
1403 $param .=
'&id='.$object->id;
1405 $relativepathwihtoutslashend = preg_replace(
'/\/$/',
'', $relativepath);
1406 if ($relativepathwihtoutslashend) {
1407 $param .=
'&file='.urlencode($relativepathwihtoutslashend);
1410 if ($permtoeditline < 0) {
1411 $permtoeditline = 0;
1412 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1413 '@phan-var-force Product $object';
1415 $permtoeditline = 1;
1418 $permtoeditline = 1;
1423 $permtoeditline = 0;
1427 $url = $_SERVER[
"PHP_SELF"];
1432 $morehtmlright =
'';
1433 if (!empty($moreoptions[
'showhideaddbutton']) && $conf->use_javascript_ajax) {
1434 $tmpurlforbutton =
'javascript:console.log("open add file form");jQuery(".divattachnewfile").toggle(); if (!jQuery(".divattachnewfile").is(":hidden")) { jQuery(".divattachnewfile input[type=\'file\']").first().click();} void(0);';
1435 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'New'),
'',
'fa fa-plus-circle', $tmpurlforbutton,
'', $permtoeditline);
1438 if ((empty($useinecm) || $useinecm == 3 || $useinecm == 6) && $title !=
'none') {
1439 print
load_fiche_titre($title ? $title : $langs->trans(
"AttachedFiles"), $morehtmlright,
'file-upload', 0,
'',
'table-list-of-attached-files');
1441 if (!empty($moreoptions) && $moreoptions[
'afteruploadtitle']) {
1442 print
'<!-- Add form from $moreoptions[\'afteruploadtitle\'] -->';
1443 print
'<div class="divattachnewfile'.((!empty($moreoptions[
'showhideaddbutton']) && $conf->use_javascript_ajax) ?
' hidden' :
'').
'">'.$moreoptions[
'afteruploadtitle'].
'</div>';
1447 print
'<!-- html.formfile::list_of_documents -->'.
"\n";
1448 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1449 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param.
'" method="POST">';
1450 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1451 print
'<input type="hidden" name="action" value="renamefile">';
1452 print
'<input type="hidden" name="id" value="'.(is_object(
$object) ?
$object->id :
'').
'">';
1453 print
'<input type="hidden" name="modulepart" value="'.$modulepart.
'">';
1456 print
'<div class="div-table-responsive-no-min"'.($moreattrondiv ?
' '.$moreattrondiv :
'').
'>';
1457 print
'<table id="tablelines" class="centpercent liste noborder nobottom">'.
"\n";
1459 if (!empty($addfilterfields)) {
1460 print
'<tr class="liste_titre nodrag nodrop">';
1461 print
'<td><input type="search_doc_ref" value="'.dol_escape_htmltag(
GETPOST(
'search_doc_ref',
'alpha')).
'"></td>';
1464 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1469 if (empty($disablemove) && count($filearray) > 1) {
1478 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $filearray';
1481 if ($sortfield && $sortorder) {
1482 $filearray =
dol_sort_array($filearray, $sortfield, $sortorder, 1);
1486 print
'<tr class="liste_titre nodrag nodrop">';
1494 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1501 if (empty($disablemove) && count($filearray) > 1) {
1507 $nboffiles = count($filearray);
1508 if ($nboffiles > 0) {
1509 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
1515 $parametersByDefault = array(
1516 'modulepart' => $modulepart,
1517 'relativepath' => $relativepath,
1518 'permtoedit' => $permtoeditline,
1519 'permonobject' => $permonobject,
1521 foreach ($filearray as $key => $file) {
1522 if ($file[
'name'] !=
'.' && $file[
'name'] !=
'..' && !preg_match(
'/\.meta$/i', $file[
'name'])) {
1523 if (array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) {
1524 $lastrowid = $filearray[$key][
'rowid'];
1529 $modulepart = ($file[
'modulepart'] ?? $parametersByDefault[
'modulepart']);
1530 $relativepath = ($file[
'relativepath'] ?? $parametersByDefault[
'relativepath']);
1531 $permtoeditline = ($file[
'permtoedit'] ?? $parametersByDefault[
'permtoedit']);
1532 $permonobject = ($file[
'permonobject'] ?? $parametersByDefault[
'permonobject']);
1535 if (empty($relativepath) || empty($modulepart)) {
1536 $filepath = $file[
'level1name'].
'/'.$file[
'name'];
1538 $filepath = $relativepath.$file[
'name'];
1540 if (empty($modulepart)) {
1541 $modulepart = basename(dirname($file[
'path']));
1543 if (empty($relativepath)) {
1544 $relativepath = preg_replace(
'/\/(.+)/',
'', $filepath) .
'/';
1549 print
'<!-- Line list_of_documents '.$key.
' relativepath = '.$relativepath.
' -->'.
"\n";
1552 print
'<!-- In database: position='.(array_key_exists(
'position', $filearray[$key]) ? $filearray[$key][
'position'] : 0).
' -->'.
"\n";
1553 print
'<tr class="oddeven" id="row-'.((array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) ? $filearray[$key][
'rowid'] :
'AFTER'.$lastrowid.
'POS'.($i + 1)).
'">';
1557 print
'<td class="minwidth200imp tdoverflowmax500" title="'.dolPrintHTMLForAttribute($file[
'name']).
'">';
1561 print
'<a class="paddingright valignmiddle" ';
1563 print
'target="_blank" ';
1565 print
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart;
1566 if ($forcedownload) {
1567 print
'&attachment=1';
1569 if (!empty(
$object->entity)) {
1570 print
'&entity='.$object->entity;
1572 print
'&file='.urlencode($filepath);
1574 print
img_mime($file[
'name'], $file[
'name'].
' ('.
dol_print_size($file[
'size'], 0, 0).
')',
'inline-block valignmiddle paddingright');
1575 if ($showrelpart == 1) {
1576 print $relativepath;
1582 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $file[
'name'] == basename(
GETPOST(
'urlfile',
'alpha')) && dirname($filepath) == dirname(
GETPOST(
'urlfile',
'alpha'))) {
1584 $section_dir = dirname(
GETPOST(
'urlfile',
'alpha'));
1585 if (!preg_match(
'/\/$/', $section_dir)) {
1586 $section_dir .=
'/';
1588 print
'<input type="hidden" name="section_dir" value="'.$section_dir.
'">';
1589 print
'<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file[
'name']).
'">';
1590 print
'<input type="text" name="renamefileto" class="centpercentminusx" value="'.dol_escape_htmltag($file[
'name']).
'">';
1593 $filenametoshow = preg_replace(
'/\.noexe$/',
'', $file[
'name']);
1599 print $this->
showPreview($file, $modulepart, $filepath, 0,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
1607 print
'<td class="right nowraponall">';
1608 if ($sizetoshow == $sizetoshowbytes) {
1611 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1616 print
'<td class="center nowraponall">'.dol_print_date($file[
'date'],
"dayhour",
"tzuser").
'</td>';
1619 $fileinfo = pathinfo($file[
'name']);
1620 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1621 print
'<td class="center">';
1623 if ($useinecm == 5 || $useinecm == 6) {
1636 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity));
1637 if (empty($urlforhref)) {
1638 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.urlencode($modulepart).
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
1639 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1641 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
1643 print
'<img class="photo maxwidth200 shadow valignmiddle"';
1644 if ($useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1645 print
' height="20"';
1648 print
' style="max-height: 24px"';
1650 print
' src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.urlencode($modulepart).
'&entity='.(empty(
$object->entity) ? $conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$smallfile);
1651 if (!empty($filearray[$key][
'date'])) {
1652 print
'&cache='.urlencode((
string) $filearray[$key][
'date']);
1654 print
'" title="">';
1661 print
'<td class="center minwidth100 nowraponsmartphone">';
1662 if ($relativedir && $filearray[$key][
'rowid'] > 0) {
1664 print
'<label for="idshareenabled'.$key.
'">'.$langs->trans(
"FileSharedViaALink").
'</label> ';
1665 print
'<input class="inline-block" type="checkbox" id="idshareenabled'.$key.
'" name="shareenabled"'.($file[
'share'] ?
' checked="checked"' :
'').
' /> ';
1667 if ($file[
'share']) {
1669 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
1670 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1674 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1676 if (!empty($file[
'share'])) {
1677 $paramlink .=
'hashp='.$file[
'share'];
1679 if ($forcedownload) {
1680 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1683 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1685 print
'<!-- shared link -->';
1686 print
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
1687 print
'<input type="text" class="centpercentminusx minwidth50imp nopadding small downloadexternallink" id="downloadlink'.$filearray[$key][
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
1699 print
'<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1700 if ($useinecm == 1 || $useinecm == 5) {
1702 $newparam = preg_replace(
'/&file=.*$/',
'', $param);
1703 $backtopage = DOL_URL_ROOT.
'/ecm/index.php?§ion_dir='.urlencode($relativepath).$newparam;
1704 print
'<a class="editfielda editfilelink" href="'.DOL_URL_ROOT.
'/ecm/file_card.php?urlfile='.urlencode($file[
'name']).$param.
'&backtopage='.urlencode($backtopage).
'" rel="'.urlencode($file[
'name']).
'">'.
img_edit(
'default', 0,
'class="paddingrightonly"').
'</a>';
1707 if (empty($useinecm) || $useinecm == 2 || $useinecm == 3 || $useinecm == 6) {
1708 $newmodulepart = $modulepart;
1709 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1710 $newmodulepart =
'produit|service';
1713 if ($permtoeditline) {
1714 $moreparaminurl =
'';
1716 $moreparaminurl .=
'&id='.$object->id;
1717 } elseif (
GETPOST(
'website',
'alpha')) {
1718 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1721 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1722 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1725 if (!preg_match(
'/\.webp$/i', $file[
'name'])) {
1726 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1727 print
'<a href="'.DOL_URL_ROOT.
'/ecm/index_medias.php?action=confirmconvertimgwebp&token='.
newToken().
'§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>';
1728 } elseif ($modulepart ==
'medias' &&
GETPOST(
'website')) {
1729 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>';
1735 if ($permtoeditline) {
1737 $moreparaminurl =
'';
1739 $moreparaminurl .=
'&id='.$object->id;
1740 } elseif (
GETPOST(
'website',
'alpha')) {
1741 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1744 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1745 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1748 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/core/photos_resize.php?modulepart='.urlencode($newmodulepart).$moreparaminurl.
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension'])).
'" title="'.
dol_escape_htmltag($langs->trans(
"ResizeOrCrop")).
'">'.
img_picto($langs->trans(
"ResizeOrCrop"),
'resize',
'class="paddingrightonly"').
'</a>';
1752 if ($permtoeditline) {
1753 $paramsectiondir = (in_array($modulepart, array(
'medias',
'ecm')) ?
'§ion_dir='.urlencode($relativepath) :
'');
1754 print
'<a class="editfielda reposition editfilelink paddingright marginleftonly" href="'.(($useinecm == 1 || $useinecm == 5) ?
'#' : ($url.
'?action=editfile&token='.
newToken().
'&urlfile='.urlencode($filepath).$paramsectiondir.$param)).
'" rel="'.$filepath.
'">'.
img_edit(
'default', 0,
'class="paddingrightonly"').
'</a>';
1758 if ($permonobject) {
1760 if (!empty($conf->dol_use_jmobile)) {
1763 if (empty($conf->use_javascript_ajax)) {
1770 print
'<a href="'.((($useinecm && $useinecm != 3 && $useinecm != 6) && $useajax) ?
'#' : ($url.
'?action=deletefile&token='.
newToken().
'&urlfile='.urlencode($filepath).$param)).
'" class="reposition deletefilelink paddingright marginleftonly" rel="'.$filepath.
'">'.
img_delete().
'</a>';
1774 if (empty($disablemove) && count($filearray) > 1) {
1775 if ($nboffiles > 1 && $conf->browser->layout !=
'phone') {
1776 print
'<td class="linecolmove tdlineupdown center">';
1778 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&rowid='.
$object->id.
'">'.
img_up(
'default', 0,
'imgupforline').
'</a>';
1780 if ($i < ($nboffiles - 1)) {
1781 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&rowid='.
$object->id.
'">'.
img_down(
'default', 0,
'imgdownforline').
'</a>';
1785 print
'<td'.(($conf->browser->layout !=
'phone') ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'>';
1790 print
'<td class="right">';
1791 print
'<input type="hidden" name="ecmfileid" value="'.(empty($filearray[$key][
'rowid']) ?
'' : $filearray[$key][
'rowid']).
'">';
1792 print
'<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv(
"Save")).
'">';
1793 print
'<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv(
"Cancel")).
'">';
1795 if (empty($disablemove) && count($filearray) > 1) {
1796 print
'<td class="right"></td>';
1804 if ($nboffiles == 0) {
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';
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)) {
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 - Taxe sur la valeur ajoutée)
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)
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
vignette($file, $maxWidth=160, $maxHeight=120, $extName='_small', $quality=50, $outdir='thumbs', $targetformat=0)
Create a thumbnail from an image file (Supported extensions are gif, jpg, png and bmp).
if(!defined( 'IMAGETYPE_WEBP')) getDefaultImageSizes()
Return default values for image sizes.
image_format_supported($file, $acceptsvg=0)
Return if a filename is file name of a supported image format.
getMaxFileSizeArray()
Return the max allowed for file upload.