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/images.lib.php';
86 include_once DOL_DOCUMENT_ROOT.
'/core/lib/security.lib.php';
89 $maxwidthsmall = $tmparraysize[
'maxwidthsmall'];
90 $maxheightsmall = $tmparraysize[
'maxheightsmall'];
91 $maxwidthmini = $tmparraysize[
'maxwidthmini'];
92 $maxheightmini = $tmparraysize[
'maxheightmini'];
93 $quality = $tmparraysize[
'quality'];
98 if ($htmlname ==
'logo_squarred') {
105 $maxmin = $maxfilesizearray[
'maxmin'];
111 $out .=
'<div class="centpercent nobordernopadding valignmiddle"><div class="inline-block marginrightonly">';
113 $out .=
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
115 $out .=
'<input type="file" class="flat minwidth100 maxwidthinputfileonsmartphone" name="'.$htmlname.
'" id="'.$htmlname.
'" accept="image/*">';
117 if (!empty($fileformainimagesmall)) {
118 $out .=
'<div class="inline-block valignmiddle marginrightonly">';
119 $out .=
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?action=remove'.$htmlname.
'&token='.
newToken().
'">'.img_delete($langs->trans(
"Delete"),
'',
'marginleftonly').
'</a>';
121 if (file_exists($dirformainimage.
'/'.$subdirformainimage.$fileformainimagesmall)) {
122 $out .=
'<div class="inline-block valignmiddle marginrightonly">';
123 $out .=
'<img id="'.$htmlname.
'" style="'.$max.
'height: '.$imgheight.
'px; '.$max.
'width: '.$imgwidth.
'px;" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&file='.urlencode($subdirformainimage.$fileformainimagesmall).
'">';
125 } elseif (!empty($fileformainimage)) {
127 if (!file_exists($dirformainimage.
'/'.$subdirformainimage.$fileformainimagemini)) {
128 $imgThumbMini =
vignette($dirformainimage.
'/'.$subdirformainimage.$fileformainimage, $maxwidthmini, $maxheightmini,
'_mini', $quality);
130 $imgThumbSmall =
vignette($dirformainimage.
'/'.$subdirformainimage.$fileformainimage, $maxwidthsmall, $maxheightsmall,
'_small', $quality);
131 $out .=
'<div class="inline-block valignmiddle">';
132 $out .=
'<img id="'.$htmlname.
'" style="'.$max.
'height: '.$imgheight.
'px; '.$max.
'width: '.$imgwidth.
'px;" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&file='.urlencode($subdirformainimage.
'thumbs/'.basename($imgThumbSmall)).
'">';
135 } elseif (!empty($fileformainimage)) {
136 if (file_exists($dirformainimage.
'/'.$subdirformainimage.$fileformainimage)) {
137 $out .=
'<div class="inline-block valignmiddle">';
138 $out .=
'<img id="'.$htmlname.
'" style="'.$max.
'height: '.$imgheight.
'px; '.$max.
'width: '.$imgwidth.
'px;" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&file='.urlencode($subdirformainimage.$fileformainimage).
'">';
140 $out .=
'<div class="inline-block valignmiddle marginrightonly"><a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?action=remove'.$htmlname.
'&token='.
newToken().
'">'.img_delete($langs->trans(
"Delete"),
'',
'marginleftonly').
'</a></div>';
142 $out .=
'<div class="inline-block valignmiddle">';
143 $out .=
'<img id="'.$htmlname.
'" height="'.$imgheight.
'" src="'.DOL_URL_ROOT.
'/public/theme/common/nophoto.png" title="File has been removed from disk">';
177 public function form_attach_new_file($url, $title =
'', $addcancel = 0, $sectionid = 0, $perm = 1, $size = 50,
$object =
null, $options =
'', $useajax = 1, $savingdocmask =
'', $linkfiles = 1, $htmlname =
'formuserfile', $accept =
'', $sectiondir =
'', $usewithoutform = 0, $capture = 0, $disablemulti = 0, $nooutput = 0)
180 global
$conf, $langs, $hookmanager;
181 $hookmanager->initHooks(array(
'formfile'));
185 dol_syslog(__METHOD__.
": using 2 for useajax is deprecated and should be not used", LOG_WARNING);
188 if (!empty(
$conf->browser->layout) &&
$conf->browser->layout !=
'classic') {
202 $out =
"\n".
'<!-- Start form attach new file --><div class="formattachnewfile">'.
"\n";
204 if ($nooutput != 2) {
206 $title = $langs->trans(
"AttachANewFile");
208 if ($title !=
'none') {
213 if (empty($usewithoutform)) {
215 $url .= (strpos($url,
'?') ===
false ?
'?' :
'&').
'uploadform=1';
217 $out .=
'<form name="'.$htmlname.
'" id="'.$htmlname.
'" action="'.$url.
'" enctype="multipart/form-data" method="POST">'.
"\n";
219 if (empty($usewithoutform) || $usewithoutform == 2) {
220 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
221 $out .=
'<input type="hidden" id="'.$htmlname.
'_section_dir" name="section_dir" value="'.$sectiondir.
'">'.
"\n";
222 $out .=
'<input type="hidden" id="'.$htmlname.
'_section_id" name="section_id" value="'.$sectionid.
'">'.
"\n";
223 $out .=
'<input type="hidden" name="sortfield" value="'.GETPOST(
'sortfield',
'aZ09comma').
'">'.
"\n";
224 $out .=
'<input type="hidden" name="sortorder" value="'.GETPOST(
'sortorder',
'aZ09comma').
'">'.
"\n";
225 $out .=
'<input type="hidden" name="page_y" value="">'.
"\n";
228 $out .=
'<table class="nobordernopadding centpercent">';
231 if (!empty($options)) {
232 $out .=
'<td>'.$options.
'</td>';
235 $out .=
'<td class="valignmiddle nowrap">';
238 $max = $maxfilesizearray[
'max'];
239 $maxmin = $maxfilesizearray[
'maxmin'];
240 $maxphptoshow = $maxfilesizearray[
'maxphptoshow'];
241 $maxphptoshowparam = $maxfilesizearray[
'maxphptoshowparam'];
243 $out .=
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
245 $out .=
'<input class="flat minwidth400 maxwidth200onsmartphone" type="file"';
246 $out .= ((
getDolGlobalString(
'MAIN_DISABLE_MULTIPLE_FILEUPLOAD') || $disablemulti) ?
' name="userfile"' :
' name="userfile[]" multiple');
248 $out .= (!empty($accept) ?
' accept="'.$accept.
'"' :
' accept=""');
249 $out .= (!empty($capture) ?
' capture="capture"' :
'');
253 $langs->load(
'link');
254 $out .=
'<span class="nowraponsmartphone"><input style="margin-right: 2px;" type="checkbox" id="overwritefile" name="overwritefile" value="1">';
255 $out .=
'<label for="overwritefile" class="opacitylow paddingleft paddingright">'.$langs->trans(
"OverwriteIfExists").
'</label>';
258 $out .=
'<input type="submit" class="button smallpaddingimp reposition" name="sendit" value="'.$langs->trans(
"Upload").
'"';
264 $out .=
'<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
268 if ($perm && empty(
$conf->dol_optimize_smallscreen)) {
269 $langs->load(
'other');
271 $menudolibarrsetupmax = $langs->transnoentitiesnoconv(
"Home").
' - '.$langs->transnoentitiesnoconv(
"Setup").
' - '.$langs->transnoentitiesnoconv(
"Security");
273 $tooltiptext = $langs->trans(
"ThisLimitIsDefinedInSetupAt", $menudolibarrsetupmax, $max, $maxphptoshowparam, $maxphptoshow);
275 $tooltiptext .=
'<br><br>Option to extract the file content in text to save it in database is ON <span class="opacitymedium">('.getDolGlobalString(
'MAIN_SAVE_FILE_CONTENT_AS_TEXT').
')</span>';
279 $out .=
info_admin($tooltiptext, 1, 0,
'1',
'classfortooltip');
282 $out .=
' ('.$langs->trans(
"UploadDisabled").
')';
284 $out .=
"</td></tr>";
286 if ($savingdocmask) {
288 $rename =
getDolGlobalString(
'MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT') ?
'' :
'checked';
291 if (!empty($options)) {
292 $out .=
'<td>'.$options.
'</td>';
294 $out .=
'<td valign="middle" class="nowrap">';
295 $out .=
'<input type="checkbox" '.$rename.
' class="savingdocmask" name="savingdocmask" id="savingdocmask" value="'.dolPrintHTMLForAttribute($savingdocmask).
'"> ';
296 $out .=
'<label class="opacitymedium small" for="savingdocmask">';
297 $out .= $langs->trans(
"SaveUploadedFileWithMask", preg_replace(
'/__file__/', $langs->transnoentitiesnoconv(
"OriginFileName"), $savingdocmask), $langs->transnoentitiesnoconv(
"OriginFileName"));
305 if (empty($usewithoutform)) {
307 if (empty($sectionid)) {
312 $parameters = array(
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'url' => $url,
'perm' => $perm,
'options' => $options);
314 $res = $hookmanager->executeHooks(
'formattachOptionsUpload', $parameters,
$object);
316 $out =
'<div class="'.($usewithoutform ?
'inline-block valignmiddle' : (($nooutput == 2 ?
'' :
'attacharea ').
'attacharea'.$htmlname)).
'">'.$out.
'</div>';
318 $out .= $hookmanager->resPrint;
320 $out .=
"\n</div><!-- End form class=formattachnewfile -->\n";
327 $out2 .=
"\n".
'<!-- Start form link new url --><div class="formlinknewurl">'.
"\n";
328 $langs->load(
'link');
330 if ($nooutput != 2) {
331 $title = $langs->trans(
"LinkANewFile");
335 if (empty($usewithoutform)) {
336 $out2 .=
'<form name="'.$htmlname.
'_link" id="'.$htmlname.
'_link" action="'.$url.
'" method="POST">'.
"\n";
337 $out2 .=
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
338 $out2 .=
'<input type="hidden" id="'.$htmlname.
'_link_section_dir" name="link_section_dir" value="">'.
"\n";
339 $out2 .=
'<input type="hidden" id="'.$htmlname.
'_link_section_id" name="link_section_id" value="'.$sectionid.
'">'.
"\n";
340 $out2 .=
'<input type="hidden" name="page_y" value="">'.
"\n";
343 $out2 .=
'<div class="valignmiddle">';
344 $out2 .=
'<div class="inline-block" style="padding-right: 10px;">';
346 $out2 .=
'<label for="link">'.$langs->trans(
"URLToLink").
':</label> ';
348 $out2 .=
'<input type="text" name="link" class="flat minwidth400imp" id="link" placeholder="'.dol_escape_htmltag($langs->trans(
"URLToLink")).
'">';
350 $out2 .=
'<div class="inline-block" style="padding-right: 10px;">';
352 $out2 .=
'<label for="label">'.$langs->trans(
"Label").
':</label> ';
354 $out2 .=
'<input type="text" class="flat" name="label" id="label" placeholder="'.dol_escape_htmltag($langs->trans(
"Label")).
'">';
355 $out2 .=
'<input type="hidden" name="objecttype" value="'.$object->element.
'">';
356 $out2 .=
'<input type="hidden" name="objectid" value="'.$object->id.
'">';
358 $out2 .=
'<div class="inline-block" style="padding-right: 10px;">';
359 $out2 .=
'<input type="submit" class="button smallpaddingimp reposition" name="linkit" value="'.$langs->trans(
"ToLink").
'"';
364 if (empty($usewithoutform)) {
365 $out2 .=
'<div class="clearboth"></div>';
366 $out2 .=
'</form><br>';
369 $parameters = array(
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'url' => $url,
'perm' => $perm,
'options' => $options);
370 $res = $hookmanager->executeHooks(
'formattachOptions', $parameters,
$object);
372 $out2 =
'<div class="'.($usewithoutform ?
'inline-block valignmiddle' : (($nooutput == 2 ?
'' :
'attacharea ').$htmlname)).
'">'.$out2.
'</div>';
374 $out2 .= $hookmanager->resPrint;
376 $out2 .=
"\n</div><!-- End form class=formlinknewurl -->\n";
380 if ($nooutput == 2) {
381 return array(
'formToUploadAFile' => $out,
'formToAddALink' => $out2);
382 } elseif ($nooutput) {
413 public function show_documents($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed = 0, $modelselected =
'', $allowgenifempty = 1, $forcenomultilang = 0, $iconPDF = 0, $notused = 0, $noform = 0, $param =
'', $title =
'', $buttonlabel =
'', $codelang =
'')
416 $this->numoffiles = 0;
417 print $this->
showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed, $modelselected, $allowgenifempty, $forcenomultilang, $iconPDF, $notused, $noform, $param, $title, $buttonlabel, $codelang);
418 return $this->numoffiles;
448 public function showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed = 0, $modelselected =
'', $allowgenifempty = 1, $forcenomultilang = 0, $iconPDF = 0, $notused = 0, $noform = 0, $param =
'', $title =
'', $buttonlabel =
'', $codelang =
'', $morepicto =
'',
$object =
null, $hideifempty = 0, $removeaction =
'remove_file', $tooltipontemplatecombo =
'')
453 if (!empty($iconPDF)) {
454 dol_syslog(__METHOD__.
": passing iconPDF parameter is deprecated", LOG_WARNING);
457 global $langs,
$conf, $user, $hookmanager;
461 if (is_object($hookmanager)) {
463 'modulepart' => &$modulepart,
464 'modulesubdir' => &$modulesubdir,
465 'filedir' => &$filedir,
466 'urlsource' => &$urlsource,
467 'genallowed' => &$genallowed,
468 'delallowed' => &$delallowed,
469 'modelselected' => &$modelselected,
470 'allowgenifempty' => &$allowgenifempty,
471 'forcenomultilang' => &$forcenomultilang,
472 'noform' => &$noform,
475 'buttonlabel' => &$buttonlabel,
476 'codelang' => &$codelang,
477 'morepicto' => &$morepicto,
478 'hideifempty' => &$hideifempty,
479 'removeaction' => &$removeaction
481 $reshook = $hookmanager->executeHooks(
'showDocuments', $parameters,
$object);
484 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
489 return $hookmanager->resPrint;
492 if (!is_object($form)) {
493 $form =
new Form($this->db);
496 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
499 if (!empty($iconPDF)) {
504 if (!preg_match(
'/entity\=[0-9]+/', $param)) {
505 $param .= ($param ?
'&' :
'').
'entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity);
508 $printer = ($user->hasRight(
'printing',
'read') &&
isModEnabled(
'printing'));
510 $hookmanager->initHooks(array(
'formfile'));
513 $file_list = array();
514 if (!empty($filedir)) {
515 $file_list =
dol_dir_list($filedir,
'files', 0,
'',
'(\.meta|_preview.*.*\.png)$',
'date', SORT_DESC);
517 if ($hideifempty && empty($file_list)) {
522 $forname =
'builddoc';
527 $out .=
"\n".
'<!-- Start show_document -->'.
"\n";
529 if (preg_match(
'/massfilesarea_/', $modulepart)) {
530 $out .=
'<div id="show_files"><br></div>'.
"\n";
531 $title = $langs->trans(
"MassFilesArea").
' <a href="" id="togglemassfilesarea" ref="shown">('.$langs->trans(
"Hide").
')</a>';
532 $title .=
'<script nonce="'.getNonce().
'">
533 jQuery(document).ready(function() {
534 jQuery(\'#togglemassfilesarea\').click(function() {
535 if (jQuery(\'#togglemassfilesarea\').attr(\'ref\') == "shown")
537 jQuery(\'#'.$modulepart.
'_table\').hide();
538 jQuery(\'#togglemassfilesarea\').attr("ref", "hidden");
539 jQuery(\'#togglemassfilesarea\').text(\'('.
dol_escape_js($langs->trans(
"Show")).
')\');
543 jQuery(\'#'.$modulepart.
'_table\').show();
544 jQuery(\'#togglemassfilesarea\').attr("ref","shown");
545 jQuery(\'#togglemassfilesarea\').text(\'('.
dol_escape_js($langs->trans(
"Hide")).
')\');
553 $titletoshow = $langs->trans(
"Documents");
554 if (!empty($title)) {
555 $titletoshow = ($title ==
'none' ?
'' : $title);
558 $submodulepart = $modulepart;
561 $tmp = explode(
':', $modulepart);
562 if (!empty($tmp[1])) {
563 $modulepart = $tmp[0];
564 $submodulepart = $tmp[1];
567 $addcolumforpicto = ($delallowed || $printer || $morepicto);
568 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
573 $modellist = array();
575 if ($modulepart ==
'company') {
577 if (is_array($genallowed)) {
578 $modellist = $genallowed;
580 include_once DOL_DOCUMENT_ROOT.
'/core/modules/societe/modules_societe.class.php';
583 } elseif ($modulepart ==
'propal') {
584 if (is_array($genallowed)) {
585 $modellist = $genallowed;
587 include_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
590 } elseif ($modulepart ==
'supplier_proposal') {
591 if (is_array($genallowed)) {
592 $modellist = $genallowed;
594 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_proposal/modules_supplier_proposal.php';
597 } elseif ($modulepart ==
'commande') {
598 if (is_array($genallowed)) {
599 $modellist = $genallowed;
601 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
604 } elseif ($modulepart ==
'expedition') {
605 if (is_array($genallowed)) {
606 $modellist = $genallowed;
608 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
611 } elseif ($modulepart ==
'reception') {
612 if (is_array($genallowed)) {
613 $modellist = $genallowed;
615 include_once DOL_DOCUMENT_ROOT.
'/core/modules/reception/modules_reception.php';
618 } elseif ($modulepart ==
'delivery') {
619 if (is_array($genallowed)) {
620 $modellist = $genallowed;
622 include_once DOL_DOCUMENT_ROOT.
'/core/modules/delivery/modules_delivery.php';
625 } elseif ($modulepart ==
'ficheinter') {
626 if (is_array($genallowed)) {
627 $modellist = $genallowed;
629 include_once DOL_DOCUMENT_ROOT.
'/core/modules/fichinter/modules_fichinter.php';
632 } elseif ($modulepart ==
'facture') {
633 if (is_array($genallowed)) {
634 $modellist = $genallowed;
636 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
639 } elseif ($modulepart ==
'contract') {
641 if (is_array($genallowed)) {
642 $modellist = $genallowed;
644 include_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
647 } elseif ($modulepart ==
'project') {
648 if (is_array($genallowed)) {
649 $modellist = $genallowed;
651 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/modules_project.php';
654 } elseif ($modulepart ==
'project_task') {
655 if (is_array($genallowed)) {
656 $modellist = $genallowed;
658 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/task/modules_task.php';
661 } elseif ($modulepart ==
'product') {
662 if (is_array($genallowed)) {
663 $modellist = $genallowed;
665 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product/modules_product.class.php';
668 } elseif ($modulepart ==
'product_batch') {
669 if (is_array($genallowed)) {
670 $modellist = $genallowed;
672 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product_batch/modules_product_batch.class.php';
675 } elseif ($modulepart ==
'stock') {
676 if (is_array($genallowed)) {
677 $modellist = $genallowed;
679 include_once DOL_DOCUMENT_ROOT.
'/core/modules/stock/modules_stock.php';
682 } elseif ($modulepart ==
'hrm') {
683 if (is_array($genallowed)) {
684 $modellist = $genallowed;
686 include_once DOL_DOCUMENT_ROOT.
'/core/modules/hrm/modules_evaluation.php';
689 } elseif ($modulepart ==
'movement') {
690 if (is_array($genallowed)) {
691 $modellist = $genallowed;
693 include_once DOL_DOCUMENT_ROOT.
'/core/modules/movement/modules_movement.php';
696 } elseif ($modulepart ==
'export') {
697 if (is_array($genallowed)) {
698 $modellist = $genallowed;
700 include_once DOL_DOCUMENT_ROOT.
'/core/modules/export/modules_export.php';
702 $modellist = array();
704 } elseif ($modulepart ==
'commande_fournisseur' || $modulepart ==
'supplier_order') {
705 if (is_array($genallowed)) {
706 $modellist = $genallowed;
708 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
711 } elseif ($modulepart ==
'facture_fournisseur' || $modulepart ==
'supplier_invoice') {
713 if (is_array($genallowed)) {
714 $modellist = $genallowed;
716 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_invoice/modules_facturefournisseur.php';
719 } elseif ($modulepart ==
'supplier_payment') {
720 if (is_array($genallowed)) {
721 $modellist = $genallowed;
723 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_payment/modules_supplier_payment.php';
726 } elseif ($modulepart ==
'remisecheque') {
727 if (is_array($genallowed)) {
728 $modellist = $genallowed;
730 include_once DOL_DOCUMENT_ROOT.
'/core/modules/cheque/modules_chequereceipts.php';
733 } elseif ($modulepart ==
'donation') {
734 if (is_array($genallowed)) {
735 $modellist = $genallowed;
737 include_once DOL_DOCUMENT_ROOT.
'/core/modules/dons/modules_don.php';
740 } elseif ($modulepart ==
'member') {
741 if (is_array($genallowed)) {
742 $modellist = $genallowed;
744 include_once DOL_DOCUMENT_ROOT.
'/core/modules/member/modules_cards.php';
747 } elseif ($modulepart ==
'agenda' || $modulepart ==
'actions') {
748 if (is_array($genallowed)) {
749 $modellist = $genallowed;
751 include_once DOL_DOCUMENT_ROOT.
'/core/modules/action/modules_action.php';
754 } elseif ($modulepart ==
'expensereport') {
755 if (is_array($genallowed)) {
756 $modellist = $genallowed;
758 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expensereport/modules_expensereport.php';
761 } elseif ($modulepart ==
'unpaid') {
763 } elseif ($modulepart ==
'user') {
764 if (is_array($genallowed)) {
765 $modellist = $genallowed;
767 include_once DOL_DOCUMENT_ROOT.
'/core/modules/user/modules_user.class.php';
770 } elseif ($modulepart ==
'usergroup') {
771 if (is_array($genallowed)) {
772 $modellist = $genallowed;
774 include_once DOL_DOCUMENT_ROOT.
'/core/modules/usergroup/modules_usergroup.class.php';
779 $file =
dol_buildpath(
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
781 if (file_exists($file)) {
782 $res = include_once $file;
785 $file =
dol_buildpath(
'/'.$modulepart.
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
786 $res = include_once $file;
789 $class =
'ModelePDF'.ucfirst($submodulepart);
791 if (class_exists($class)) {
792 $modellist = call_user_func($class.
'::liste_modeles', $this->db);
794 dol_print_error($this->db,
"Bad value for modulepart '".$modulepart.
"' in showdocuments (class ".$class.
" for Doc generation not found)");
802 if (empty($buttonlabel)) {
803 $buttonlabel = $langs->trans(
'Generate');
806 if (
$conf->browser->layout ==
'phone') {
807 $urlsource .=
'#'.$forname.
'_form';
809 if (empty($noform)) {
810 $out .=
'<form action="'.$urlsource.
'" id="'.$forname.
'_form" method="post">';
812 $out .=
'<input type="hidden" name="action" value="builddoc">';
813 $out .=
'<input type="hidden" name="page_y" value="">';
814 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
819 $out .=
'<div class="div-table-responsive-no-min">';
820 $out .=
'<table class="liste formdoc noborder centpercent">';
822 $out .=
'<tr class="liste_titre">';
823 $addcolumforpicto = ($delallowed || $printer || $morepicto);
824 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
827 $out .=
'<th colspan="'.$colspan.
'" class="formdoc liste_titre maxwidthonsmartphone center">';
830 if (!empty($modellist)) {
832 $out .=
'<span class="hideonsmartphone">'.$langs->trans(
'Model').
' </span>';
833 if (is_array($modellist) && count($modellist) == 1) {
834 $arraykeys = array_keys($modellist);
835 $modelselected = $arraykeys[0];
837 $morecss =
'minwidth75 maxwidth200';
838 if (
$conf->browser->layout ==
'phone') {
839 $morecss =
'maxwidth100';
841 $out .= $form->selectarray(
'model', $modellist, $modelselected, $showempty, 0, 0,
'', 0, 0, 0,
'', $morecss, 1,
'', 0, 0);
842 if (
$conf->use_javascript_ajax) {
845 $out .= $form->textwithpicto(
'', $tooltipontemplatecombo, 1,
'help',
'marginrightonly', 0, 3,
'', 0);
847 $out .=
'<div class="float">'.$langs->trans(
"Files").
'</div>';
851 if (($allowgenifempty || (is_array($modellist) && count($modellist) > 0)) &&
getDolGlobalInt(
'MAIN_MULTILANGS') && !$forcenomultilang && (!empty($modellist) || $showempty)) {
852 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formadmin.class.php';
854 $defaultlang = ($codelang && $codelang !=
'auto') ? $codelang : $langs->getDefaultLang();
855 $morecss =
'maxwidth150';
856 if (
$conf->browser->layout ==
'phone') {
857 $morecss =
'maxwidth100';
859 $out .= $formadmin->select_language($defaultlang,
'lang_id', 0, array(), 0, 0, 0, $morecss);
865 $genbutton =
'<input class="button buttongen reposition nomargintop nomarginbottom" id="'.$forname.
'_generatebutton" name="'.$forname.
'_generatebutton"';
866 $genbutton .=
' type="submit" value="'.$buttonlabel.
'"';
867 if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) {
868 $genbutton .=
' disabled';
871 if ($allowgenifempty && !is_array($modellist) && empty($modellist) && empty(
$conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
872 $langs->load(
"errors");
873 $genbutton .=
' '.img_warning($langs->transnoentitiesnoconv(
"WarningNoDocumentModelActivated"));
878 if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty(
$conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
881 if (empty($modellist) && !$showempty && $modulepart !=
'unpaid') {
887 if (!empty($hookmanager->hooks[
'formfile'])) {
888 foreach ($hookmanager->hooks[
'formfile'] as
$module) {
889 if (is_object(
$module) && method_exists(
$module,
'formBuilddocLineOptions')) {
898 $parameters = array(
'colspan' => ($colspan + $colspanmore),
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'modulepart' => $modulepart);
899 if (is_object($hookmanager)) {
900 $reshook = $hookmanager->executeHooks(
'formBuilddocOptions', $parameters, $GLOBALS[
'object']);
901 $out .= $hookmanager->resPrint;
906 if (!empty($filedir)) {
907 $link_list = array();
909 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
910 $link =
new Link($this->db);
911 $sortfield = $sortorder =
'';
912 $res = $link->fetchAll($link_list,
$object->element,
$object->id, $sortfield, $sortorder);
915 $out .=
'<!-- html.formfile::showdocuments -->'.
"\n";
918 if ((!empty($file_list) || !empty($link_list) || preg_match(
'/^massfilesarea/', $modulepart))
921 $out .=
'<div class="titre paddingbottom">'.$titletoshow.
'</div>'.
"\n";
922 $out .=
'<div class="div-table-responsive-no-min">';
923 $out .=
'<table class="noborder centpercent" id="'.$modulepart.
'_table">'.
"\n";
927 if (is_array($file_list)) {
928 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string}> $file_list';
932 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filedir);
933 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
939 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $file_list';
942 if (!empty($sortfield) && !empty($sortorder)) {
947 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $file_list';
949 require_once DOL_DOCUMENT_ROOT .
'/ecm/class/ecmfiles.class.php';
952 foreach ($file_list as $file) {
955 if (!empty($file[
'rowid']) && $user->hasRight(
'ecm',
'read')) {
959 $ecmfile->fetch($file[
'rowid']);
966 $relativepath = (string) $file[
"name"];
968 $relativepath = (string) $modulesubdir.
"/".$file[
"name"];
970 if ($modulepart ==
'export') {
971 $relativepath = (string) $file[
"name"];
974 $tmpout =
'<tr class="oddeven'.((!$genallowed && $i == 1) ?
' trfirstline' :
'').
'">';
976 $documenturl =
getDolGlobalString(
'DOL_URL_ROOT_DOCUMENT_PHP', DOL_URL_ROOT.
'/document.php');
979 $imgpreview = $this->
showPreview($file, $modulepart, $relativepath, 0, $param.
'&preview=1');
980 $tmpout .=
'<td class="minwidth200 tdoverflowmax300">';
982 $tmpout .=
'<span class="spanoverflow widthcentpercentminusx valignmiddle">';
984 $tmpout .=
'<span class="spanoverflow">';
987 $tmpout .= $imgpreview;
990 if (is_object($ecmfile)) {
991 $tmpout .= $ecmfile->getNomUrl(1, $modulepart, 0, 0,
' documentdownload');
994 $tmpout .=
'<a class="documentdownload paddingright" ';
996 $tmpout .=
'target="_blank" ';
998 $tmpout .=
'href="'.$documenturl.
'?modulepart='.$modulepart.
'&file='.urlencode($relativepath).($param ?
'&'.$param :
'').
'"';
1000 if (preg_match(
'/text/', $mime)) {
1001 $tmpout .=
' target="_blank" rel="noopener noreferrer"';
1003 $tmpout .=
' title="'.dol_escape_htmltag($file[
"name"]).
'"';
1005 $tmpout .=
img_mime($file[
"name"], $langs->trans(
"File").
': '.$file[
"name"]);
1006 $tmpout .=
dol_trunc($file[
"name"], 150);
1010 $tmpout .=
'</span>'.
"\n";
1012 $tmpout .= $imgpreview;
1018 $size = (!empty($file[
'size']) ? $file[
'size'] :
dol_filesize($filedir.
"/".$file[
"name"]));
1019 $tmpout .=
'<td class="nowraponall right" title="'.dolPrintHTML($size.
' '.$langs->trans(
"Bytes")).
'">'.
dol_print_size($size, 1, 1).
'</td>';
1022 $date = (!empty($file[
'date']) ? $file[
'date'] :
dol_filemtime($filedir.
"/".$file[
"name"]));
1023 $tmpout .=
'<td class="nowrap right">'.dol_print_date($date,
'dayhour',
'tzuser').
'</td>';
1026 $tmpout .=
'<td class="nowraponall">';
1027 if (!empty($file[
'share'])) {
1029 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
1030 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1034 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1036 if (!empty($file[
'share'])) {
1037 $paramlink .=
'hashp='.$file[
'share'];
1039 if ($forcedownload) {
1040 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1043 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1045 $tmpout .=
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
1046 $tmpout .=
'<input type="text" class="quatrevingtpercentminusx width75 nopadding small downloadexternallink" id="downloadlink'.$file[
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
1054 if ($delallowed || $printer || $morepicto) {
1055 $tmpout .=
'<td class="right nowraponall">';
1057 $tmpurlsource = preg_replace(
'/#[a-zA-Z0-9_]*$/',
'', $urlsource);
1058 $tmpout .=
'<a class="maginleftonly marginrightonly reposition" href="'.$tmpurlsource.((strpos($tmpurlsource,
'?') ===
false) ?
'?' :
'&').
'action='.urlencode($removeaction).
'&token='.
newToken().
'&file='.urlencode($relativepath);
1059 $tmpout .= ($param ?
'&'.$param :
'');
1062 $tmpout .=
'">'.img_picto($langs->trans(
"Delete"),
'delete').
'</a>';
1065 $tmpout .=
'<a class="maginleftonly marginleftonly reposition" href="'.$urlsource.(strpos($urlsource,
'?') ?
'&' :
'?').
'action=print_file&token='.
newToken().
'&printer='.urlencode($modulepart).
'&file='.urlencode($relativepath);
1066 $tmpout .= ($param ?
'&'.$param :
'');
1067 $tmpout .=
'">'.img_picto($langs->trans(
"PrintFile", $relativepath),
'printer').
'</a>';
1070 $morepicto = preg_replace(
'/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto);
1071 $tmpout .= $morepicto;
1076 if (is_object($hookmanager)) {
1077 $addcolumforpicto = ($delallowed || $printer || $morepicto);
1078 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
1079 $parameters = array(
'tmpout' => &$tmpout,
'colspan' => ($colspan + $colspanmore),
'socid' => (isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id' => (isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'modulepart' => $modulepart,
'relativepath' => $relativepath);
1080 $res = $hookmanager->executeHooks(
'formBuilddocLineOptions', $parameters, $file);
1082 $tmpout .= $hookmanager->resPrint;
1085 $tmpout = $hookmanager->resPrint;
1094 $this->numoffiles++;
1097 if (is_array($link_list)) {
1100 foreach ($link_list as $file) {
1101 $out .=
'<tr class="oddeven">';
1102 $out .=
'<td colspan="'.$colspan.
'" class="maxwidhtonsmartphone">';
1103 $out .=
'<a data-ajax="false" href="'.$file->url.
'" target="_blank" rel="noopener noreferrer">';
1104 $out .= $file->label;
1107 $out .=
'<td class="right">';
1111 $out .=
'<td></td>';
1112 if ($delallowed || $printer || $morepicto) {
1113 $out .=
'<td></td>';
1116 $out .=
'<td colspan="'.$colspanmore.
'"></td>';
1118 $out .=
'</tr>'.
"\n";
1120 $this->numoffiles++;
1123 if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
1124 $addcolumforpicto = ($delallowed || $printer || $morepicto);
1125 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
1126 $out .=
'<tr><td colspan="'.($colspan + $colspanmore).
'"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>'.
"\n";
1132 $out .=
"</table>\n";
1135 if (empty($noform)) {
1136 $out .=
'</form>'.
"\n";
1140 $out .=
'<!-- End show_document -->'.
"\n";
1143 jQuery(document).ready(function() {
1144 var selectedValue = $(".selectformat").val();
1146 if (selectedValue === "excel2007" || selectedValue === "tsv") {
1147 $(".forhide").prop("disabled", true).hide();
1149 $(".forhide").prop("disabled", false).show();
1170 public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter =
'', $morecss =
'valignmiddle', $allfiles = 0)
1172 global
$conf, $langs;
1174 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1177 $this->infofiles = array(
'nboffiles' => 0,
'extensions' => array(),
'files' => array());
1184 preg_match(
'/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir,
'/').
'$/', $filedir, $regs);
1185 $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1);
1190 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/');
1192 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/').
'\.';
1194 $file_list =
dol_dir_list($filedir,
'files', 0, $filterforfilesearch,
'\.meta$|\.png$');
1198 $out .=
'<!-- html.formfile::getDocumentsLink -->'.
"\n";
1199 if (!empty($file_list)) {
1200 $out =
'<dl class="dropdown inline-block">
1201 <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto(
'',
'listlight',
'', 0, 0, 0,
'', $morecss).
'</a></dt>
1202 <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1208 foreach ($file_list as $file) {
1210 if ($filter && !preg_match(
'/'.$filter.
'/i', $file[
"name"])) {
1216 $relativepath = $file[
"name"];
1217 if ($modulesubdir) {
1218 $relativepath = (string) $modulesubdir.
"/".$file[
"name"];
1221 if ($modulepart ==
'donation') {
1222 $relativepath = (string)
get_exdir($modulesubdir, 2, 0, 0,
null,
'donation').$file[
"name"];
1224 if ($modulepart ==
'export') {
1225 $relativepath = (string) $file[
"name"];
1228 $this->infofiles[
'nboffiles']++;
1229 $this->infofiles[
'files'][] = $file[
'fullname'];
1230 $ext = (string) pathinfo($file[
'name'], PATHINFO_EXTENSION);
1231 if (!array_key_exists($ext, $this->infofiles[
'extensions'])) {
1232 $this->infofiles[
'extensions'][$ext] = 1;
1234 $this->infofiles[
'extensions'][$ext]++;
1238 if (!empty(
$conf->use_javascript_ajax) && (
$conf->browser->layout !=
'phone')) {
1240 if ($tmparray && $tmparray[
'url']) {
1241 $tmpout .=
'<li><a href="'.$tmparray[
'url'].
'"'.($tmparray[
'css'] ?
' class="'.$tmparray[
'css'].
'"' :
'').($tmparray[
'mime'] ?
' mime="'.$tmparray[
'mime'].
'"' :
'').($tmparray[
'target'] ?
' target="'.$tmparray[
'target'].
'"' :
'').
'>';
1243 $tmpout .= img_picto(
'',
'search-plus',
'class="paddingright"');
1244 $tmpout .= $langs->trans(
"Preview").
' '.$ext.
'</a></li>';
1249 $tmpout .=
'<li class="nowrap"><a class="pictopreview nowrap" ';
1251 $tmpout .=
'target="_blank" ';
1253 $tmpout .=
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&entity='.$entity.
'&file='.urlencode($relativepath).
'"';
1255 if (preg_match(
'/text/', $mime)) {
1256 $tmpout .=
' target="_blank" rel="noopener noreferrer"';
1259 $tmpout .=
img_mime($relativepath, $file[
"name"]);
1260 $tmpout .= $langs->trans(
"Download").
' '.$ext;
1261 $tmpout .=
'</a></li>'.
"\n";
1264 $out .=
'</ul></div></dd>
1313 public function list_of_documents($filearray,
$object, $modulepart, $param =
'', $forcedownload = 0, $relativepath =
'', $permonobject = 1, $useinecm = 0, $textifempty =
'', $maxlength = 0, $title =
'', $url =
'', $showrelpart = 0, $permtoeditline = -1, $upload_dir =
'', $sortfield =
'', $sortorder =
'ASC', $disablemove = 1, $addfilterfields = 0, $disablecrop = -1, $moreattrondiv =
'', $moreoptions = array())
1316 global $user,
$conf, $langs, $hookmanager, $form;
1317 global $sortfield, $sortorder;
1320 if ($disablecrop == -1) {
1323 if (in_array($modulepart, array(
'bank',
'bom',
'expensereport',
'facture',
'facture_fournisseur',
'holiday',
'medias',
'member',
'mrp',
'project',
'product',
'produit',
'propal',
'service',
'societe',
'tax',
'tax-vat',
'ticket',
'user'))) {
1329 if (empty($relativepath)) {
1332 $relativepath = (
$object->id).
'/';
1333 } elseif (!empty(
$object->element) &&
$object->element ==
'invoice_supplier') {
1335 } elseif (!empty(
$object->element) &&
$object->element ==
'project_task') {
1336 $relativepath =
'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1340 if (
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO') && isset($filearray[0]) && $filearray[0][
'level1name'] ==
'photos') {
1341 $relativepath = preg_replace(
'/^.*\/produit\//',
'', $filearray[0][
'path']).
'/';
1347 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dir);
1348 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
1355 $hookmanager->initHooks(array(
'formfile'));
1356 $parameters = array(
1357 'filearray' => $filearray,
1358 'modulepart' => $modulepart,
1360 'forcedownload' => $forcedownload,
1361 'relativepath' => $relativepath,
1362 'relativedir' => $relativedir,
1363 'permtodelete' => $permonobject,
1364 'useinecm' => $useinecm,
1365 'textifempty' => $textifempty,
1366 'maxlength' => $maxlength,
1371 $reshook = $hookmanager->executeHooks(
'showFilesList', $parameters,
$object);
1373 if (!empty($reshook)) {
1376 if (!is_object($form)) {
1377 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
1378 $form =
new Form($this->db);
1381 if (!preg_match(
'/&id=/', $param) && isset(
$object->id)) {
1382 $param .=
'&id='.$object->id;
1384 $relativepathwihtoutslashend = preg_replace(
'/\/$/',
'', $relativepath);
1385 if ($relativepathwihtoutslashend) {
1386 $param .=
'&file='.urlencode($relativepathwihtoutslashend);
1389 if ($permtoeditline < 0) {
1390 $permtoeditline = 0;
1391 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1392 '@phan-var-force Product $object';
1394 $permtoeditline = 1;
1397 $permtoeditline = 1;
1402 $permtoeditline = 0;
1406 $url = $_SERVER[
"PHP_SELF"];
1411 $morehtmlright =
'';
1412 if (!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) {
1413 $tmpurlforbutton =
'javascript:console.log("open add file form"); if (jQuery(".divattachnewfile").is(":hidden")) { jQuery(".divattachnewfile").removeClass("hidden"); jQuery(".divattachnewfile input[type=\'file\']").first().click(); } else { jQuery(".divattachnewfile").addClass("hidden"); } void(0);';
1414 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'New'),
'',
'fa fa-plus-circle', $tmpurlforbutton,
'', $permtoeditline);
1417 if ((empty($useinecm) || $useinecm == 3 || $useinecm == 6) && $title !=
'none') {
1418 print
load_fiche_titre($title ? $title : $langs->trans(
"AttachedFiles"), $morehtmlright,
'file-upload', 0,
'',
'table-list-of-attached-files');
1420 if (!empty($moreoptions) && $moreoptions[
'afteruploadtitle']) {
1421 print
'<!-- Add form from $moreoptions[\'afteruploadtitle\'] -->';
1422 print
'<div class="divattachnewfile'.((!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) ?
' hidden' :
'').
'">'.$moreoptions[
'afteruploadtitle'].
'</div>';
1426 print
'<!-- html.formfile::list_of_documents -->'.
"\n";
1427 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1428 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param.
'" method="POST">';
1429 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1430 print
'<input type="hidden" name="action" value="renamefile">';
1431 print
'<input type="hidden" name="id" value="'.(is_object(
$object) ?
$object->id :
'').
'">';
1432 print
'<input type="hidden" name="modulepart" value="'.$modulepart.
'">';
1435 print
'<div class="div-table-responsive-no-min"'.($moreattrondiv ?
' '.$moreattrondiv :
'').
'>';
1436 print
'<table id="tablelines" class="centpercent liste noborder nobottom">'.
"\n";
1438 if (!empty($addfilterfields)) {
1439 print
'<tr class="liste_titre nodrag nodrop">';
1440 print
'<td><input type="search_doc_ref" value="'.dol_escape_htmltag(
GETPOST(
'search_doc_ref',
'alpha')).
'"></td>';
1443 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1448 if (empty($disablemove) && count($filearray) > 1) {
1457 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $filearray';
1460 if ($sortfield && $sortorder) {
1461 $filearray =
dol_sort_array($filearray, $sortfield, $sortorder, 1);
1465 print
'<tr class="liste_titre nodrag nodrop">';
1473 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1477 if (empty($moreoptions[
'hideshared'])) {
1482 if (!empty($moreoptions[
'buttons'])) {
1487 if (empty($disablemove) && count($filearray) > 1) {
1493 $nboffiles = count($filearray);
1494 if ($nboffiles > 0) {
1495 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
1501 $parametersByDefault = array(
1502 'modulepart' => $modulepart,
1503 'relativepath' => $relativepath,
1504 'permtoedit' => $permtoeditline,
1505 'permonobject' => $permonobject,
1507 foreach ($filearray as $key => $file) {
1508 if ($file[
'name'] !=
'.' && $file[
'name'] !=
'..' && !preg_match(
'/\.meta$/i', $file[
'name'])) {
1509 if (array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) {
1510 $lastrowid = $filearray[$key][
'rowid'];
1515 $modulepart = ($file[
'modulepart'] ?? $parametersByDefault[
'modulepart']);
1516 $relativepath = ($file[
'relativepath'] ?? $parametersByDefault[
'relativepath']);
1517 $permtoeditline = ($file[
'permtoedit'] ?? $parametersByDefault[
'permtoedit']);
1518 $permonobject = ($file[
'permonobject'] ?? $parametersByDefault[
'permonobject']);
1521 if (empty($relativepath) || empty($modulepart)) {
1522 $filepath = $file[
'level1name'].
'/'.$file[
'name'];
1524 $filepath = $relativepath.$file[
'name'];
1526 if (empty($modulepart)) {
1527 $modulepart = basename(dirname($file[
'path']));
1529 if (empty($relativepath)) {
1530 $relativepath = preg_replace(
'/\/(.+)/',
'', $filepath) .
'/';
1535 print
'<!-- Line list_of_documents '.$key.
' relativepath = '.$relativepath.
' -->'.
"\n";
1538 print
'<!-- In database: position='.(array_key_exists(
'position', $filearray[$key]) ? $filearray[$key][
'position'] : 0).
' -->'.
"\n";
1539 print
'<tr class="oddeven" id="row-'.((array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) ? $filearray[$key][
'rowid'] :
'AFTER'.$lastrowid.
'POS'.($i + 1)).
'">';
1543 print
'<td class="minwidth200imp tdoverflowmax300" title="'.dolPrintHTMLForAttribute($file[
'name']).
'">';
1547 print
'<a class="paddingright valignmiddle" ';
1549 print
'target="_blank" ';
1551 print
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.urlencode($modulepart);
1552 if ($forcedownload) {
1553 print
'&attachment=1';
1555 if (!empty(
$object->entity)) {
1556 print
'&entity='.((int)
$object->entity);
1558 print
'&file='.urlencode($filepath);
1560 print
img_mime($file[
'name'], $file[
'name'].
' ('.
dol_print_size($file[
'size'], 0, 0).
')',
'inline-block valignmiddle paddingright');
1561 if ($showrelpart == 1) {
1562 print $relativepath;
1568 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $file[
'name'] == basename(
GETPOST(
'urlfile',
'alpha')) && dirname($filepath) == dirname(
GETPOST(
'urlfile',
'alpha'))) {
1570 $section_dir = dirname(
GETPOST(
'urlfile',
'alpha'));
1571 if (!preg_match(
'/\/$/', $section_dir)) {
1572 $section_dir .=
'/';
1574 print
'<input type="hidden" name="section_dir" value="'.$section_dir.
'">';
1575 print
'<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file[
'name']).
'">';
1576 print
'<input type="text" name="renamefileto" class="centpercentminusx" value="'.dol_escape_htmltag($file[
'name']).
'" spellcheck="false">';
1579 $filenametoshow = preg_replace(
'/\.noexe$/',
'', $file[
'name']);
1580 print dolPrintHTML(
dol_trunc($filenametoshow, 200));
1593 print
'<td class="right nowraponall">';
1594 if ($sizetoshow == $sizetoshowbytes) {
1597 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1602 print
'<td class="center nowraponall">'.dol_print_date($file[
'date'],
"dayhour",
"tzuser").
'</td>';
1605 $fileinfo = pathinfo($file[
'name']);
1606 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1607 print
'<td class="center">';
1609 if ($useinecm == 5 || $useinecm == 6) {
1622 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity));
1623 if (empty($urlforhref)) {
1624 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.urlencode($modulepart).
'&entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
1625 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1627 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
1629 print
'<img class="photo maxwidth200 shadow valignmiddle"';
1630 if ($useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1631 print
' height="20"';
1634 print
' style="max-height: 24px"';
1636 print
' src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.urlencode($modulepart).
'&entity='.(empty(
$object->entity) ?
$conf->entity :
$object->entity).
'&file='.urlencode($relativepath.$smallfile);
1637 if (!empty($filearray[$key][
'date'])) {
1638 print
'&cache='.urlencode((
string) $filearray[$key][
'date']);
1640 print
'" title="">';
1647 if (empty($moreoptions[
'hideshared'])) {
1648 print
'<td class="center nowraponsmartphone">';
1649 if ($relativedir && $filearray[$key][
'rowid'] > 0) {
1651 print
'<label for="idshareenabled'.$key.
'">'.$langs->trans(
"FileSharedViaALink").
'</label> ';
1652 print
'<input class="inline-block" type="checkbox" id="idshareenabled'.$key.
'" name="shareenabled"'.($file[
'share'] ?
' checked="checked"' :
'').
' /> ';
1654 if ($file[
'share']) {
1656 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
1657 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1661 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
1663 if (!empty($file[
'share'])) {
1664 $paramlink .=
'hashp='.$file[
'share'];
1666 if ($forcedownload) {
1667 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1670 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1672 print
'<!-- shared link -->';
1673 print
'<a href="'.$fulllink.
'" target="_blank" rel="noopener" data-showidonhover="downloadlink'.$filearray[$key][
'rowid'].
'">';
1674 print img_picto($langs->trans(
"FileSharedViaALink"),
'collab');
1676 print
'<input type="text" class="centpercentminusx minwidth50imp nopadding small downloadexternallink showonhover" id="downloadlink'.$filearray[$key][
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
1686 if (!empty($moreoptions[
'buttons'])) {
1688 foreach ($moreoptions[
'buttons'] as $moreoptval) {
1689 print
'<a href="'.$moreoptval[
'url'].
'&urlfile='.urlencode($file[
'name']).
'">';
1690 print $moreoptval[
'picto'];
1700 print
'<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1701 if ($useinecm == 1 || $useinecm == 5) {
1703 $newparam = preg_replace(
'/&file=.*$/',
'', $param);
1704 $backtopage = DOL_URL_ROOT.
'/ecm/index.php?§ion_dir='.urlencode($relativepath).$newparam;
1705 print
'<a class="editfielda editfilelink" href="'.DOL_URL_ROOT.
'/ecm/file_card.php?urlfile='.urlencode($file[
'name']).$param.
'&backtopage='.urlencode($backtopage).
'" rel="'.urlencode($file[
'name']).
'">'.img_edit(
'default', 0,
'class="paddingrightonly"').
'</a>';
1708 if (empty($useinecm) || $useinecm == 2 || $useinecm == 3 || $useinecm == 6) {
1709 $newmodulepart = $modulepart;
1710 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1711 $newmodulepart =
'produit|service';
1714 if ($permtoeditline) {
1715 $moreparaminurl =
'';
1717 $moreparaminurl .=
'&id='.$object->id;
1718 } elseif (
GETPOST(
'website',
'alpha')) {
1719 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1722 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1723 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1726 if (!preg_match(
'/\.webp$/i', $file[
'name'])) {
1727 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1728 print
'<a href="'.DOL_URL_ROOT.
'/ecm/index_medias.php?action=confirmconvertimgwebp&token='.
newToken().
'§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 } elseif ($modulepart ==
'medias' &&
GETPOST(
'website')) {
1730 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>';
1736 if ($permtoeditline) {
1738 $moreparaminurl =
'';
1740 $moreparaminurl .=
'&id='.$object->id;
1741 } elseif (
GETPOST(
'website',
'alpha')) {
1742 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1745 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1746 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1749 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/core/photos_resize.php?modulepart='.urlencode($newmodulepart).$moreparaminurl.
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension'])).
'" title="'.
dol_escape_htmltag($langs->trans(
"ResizeOrCrop")).
'">'.img_picto($langs->trans(
"ResizeOrCrop"),
'resize',
'class="paddingrightonly"').
'</a>';
1753 if ($permtoeditline) {
1754 $paramsectiondir = (in_array($modulepart, array(
'medias',
'ecm')) ?
'§ion_dir='.urlencode($relativepath) :
'');
1755 print
'<a class="editfielda reposition editfilelink paddingright marginleftonly" href="'.(($useinecm == 1 || $useinecm == 5) ?
'#' : ($url.
'?action=editfile&urlfile='.urlencode($filepath).$paramsectiondir.$param)).
'" rel="'.$filepath.
'">'.img_edit(
'default', 0,
'class="paddingrightonly"').
'</a>';
1759 if ($permonobject) {
1761 if (!empty(
$conf->dol_use_jmobile)) {
1764 if (empty(
$conf->use_javascript_ajax)) {
1771 print
'<a href="'.((($useinecm && $useinecm != 3 && $useinecm != 6) && $useajax) ?
'#' : ($url.
'?action=deletefile&token='.
newToken().
'&urlfile='.urlencode($filepath).$param)).
'" class="reposition deletefilelink paddingright marginleftonly" rel="'.$filepath.
'">'.img_delete().
'</a>';
1775 if (empty($disablemove) && count($filearray) > 1) {
1776 if ($nboffiles > 1 &&
$conf->browser->layout !=
'phone') {
1777 print
'<td class="linecolmove tdlineupdown center">';
1779 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.
$object->id.
'">'.
img_up(
'default', 0,
'imgupforline').
'</a>';
1781 if ($i < ($nboffiles - 1)) {
1782 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.
$object->id.
'">'.
img_down(
'default', 0,
'imgdownforline').
'</a>';
1786 print
'<td'.(($conf->browser->layout !=
'phone') ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'>';
1791 print
'<td class="right">';
1792 print
'<input type="hidden" name="ecmfileid" value="'.(empty($filearray[$key][
'rowid']) ?
'' : $filearray[$key][
'rowid']).
'">';
1793 print
'<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv(
"Save")).
'">';
1794 print
'<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dolPrintHTMLForAttribute($langs->transnoentitiesnoconv(
"Cancel")).
'">';
1796 if (empty($disablemove) && count($filearray) > 1) {
1797 print
'<td class="right"></td>';
1805 if ($nboffiles == 0) {
1807 if (!empty($moreoptions[
'buttons'])) {
1810 if (!empty($moreoptions[
'hideshared'])) {
1813 if (empty($disablemove) && count($filearray) > 1) {
1816 print
'<tr class="oddeven"><td colspan="'.$colspan.
'">';
1817 if (empty($textifempty)) {
1818 print
'<span class="opacitymedium">'.$langs->trans(
"NoFileFound").
'</span>';
1820 print
'<span class="opacitymedium">'.dolPrintHTML($textifempty).
'</span>';
1828 if ($nboflines > 1 && is_object(
$object)) {
1829 if (!empty(
$conf->use_javascript_ajax) && $permtoeditline) {
1830 $table_element_line =
'ecm_files';
1831 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1837 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1865 public function list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload = 0, $relativepath =
'', $permissiontodelete = 1, $useinecm = 0, $textifempty =
'', $maxlength = 0, $url =
'', $addfilterfields = 0)
1868 global
$conf, $langs, $hookmanager, $form;
1869 global $sortfield, $sortorder;
1870 global $search_doc_ref;
1871 global $search_doc_date_start, $search_doc_date_end;
1874 dol_syslog(get_class($this).
'::list_of_autoecmfiles upload_dir='.$upload_dir.
' modulepart='.$modulepart);
1877 if (empty($useinecm) || $useinecm == 6) {
1881 $url = $_SERVER[
"PHP_SELF"];
1884 $enablebulkdownload = ($modulepart ==
'invoice_supplier');
1886 if (!empty($addfilterfields)) {
1887 print
'<form action="'.dol_escape_htmltag($url).
'" method="'.($enablebulkdownload ?
'POST' :
'GET').
'">';
1888 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1889 print
'<input type="hidden" name="module" value="'.dol_escape_htmltag($modulepart).
'">';
1891 print
'<input type="hidden" name="sortfield" value="'.dol_escape_htmltag($sortfield).
'">';
1894 print
'<input type="hidden" name="sortorder" value="'.dol_escape_htmltag($sortorder).
'">';
1898 print
'<div class="div-table-responsive-no-min">';
1899 print
'<table class="noborder centpercent">'.
"\n";
1901 if (!empty($addfilterfields)) {
1902 print
'<tr class="liste_titre nodrag nodrop">';
1903 if ($enablebulkdownload) {
1904 print
'<td class="liste_titre center">';
1905 print $form->showCheckAddButtons(
'checkforselect', 0);
1909 print
'<td class="liste_titre"></td>';
1911 print
'<td class="liste_titre"><input type="text" class="maxwidth100onsmartphone" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).
'"></td>';
1913 print
'<td class="liste_titre"></td>';
1915 print
'<td class="liste_titre center">';
1916 if ($enablebulkdownload) {
1917 print
'<div class="nowrap">';
1918 print $form->selectDate(!empty($search_doc_date_start) ? $search_doc_date_start :
'',
'search_doc_date_start', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'From'));
1920 print
'<div class="nowrap">';
1921 print $form->selectDate(!empty($search_doc_date_end) ? $search_doc_date_end :
'',
'search_doc_date_end', 0, 0, 1,
'', 1, 0, 0,
'',
'',
'',
'', 1,
'', $langs->trans(
'to'));
1926 print
'<td class="liste_titre right">';
1927 if ($enablebulkdownload) {
1928 print
'<button type="submit" class="button smallpaddingimp marginrightonly" name="action" value="download_selected">';
1929 print img_picto(
'',
'download',
'class="pictofixedwidth"').$langs->trans(
"Download");
1932 $searchpicto = $form->showFilterButtons();
1938 print
'<tr class="liste_titre">';
1939 if ($enablebulkdownload) {
1940 print
'<th class="liste_titre center maxwidthsearch"></th>';
1942 $sortref =
"fullname";
1943 if ($modulepart ==
'invoice_supplier') {
1944 $sortref =
'level1name';
1954 $object_instance =
null;
1955 if ($modulepart ==
'company') {
1956 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
1957 $object_instance =
new Societe($this->db);
1958 } elseif ($modulepart ==
'invoice') {
1959 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
1960 $object_instance =
new Facture($this->db);
1961 } elseif ($modulepart ==
'invoice_supplier') {
1962 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
1964 } elseif ($modulepart ==
'propal') {
1965 include_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
1966 $object_instance =
new Propal($this->db);
1967 } elseif ($modulepart ==
'supplier_proposal') {
1968 include_once DOL_DOCUMENT_ROOT.
'/supplier_proposal/class/supplier_proposal.class.php';
1970 } elseif ($modulepart ==
'order') {
1971 include_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
1972 $object_instance =
new Commande($this->db);
1973 } elseif ($modulepart ==
'order_supplier') {
1974 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1976 } elseif ($modulepart ==
'contract') {
1977 include_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
1978 $object_instance =
new Contrat($this->db);
1979 } elseif ($modulepart ==
'product') {
1980 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
1981 $object_instance =
new Product($this->db);
1982 } elseif ($modulepart ==
'tax') {
1983 include_once DOL_DOCUMENT_ROOT.
'/compta/sociales/class/chargesociales.class.php';
1985 } elseif ($modulepart ==
'tax-vat') {
1986 include_once DOL_DOCUMENT_ROOT.
'/compta/tva/class/tva.class.php';
1987 $object_instance =
new Tva($this->db);
1988 } elseif ($modulepart ==
'salaries') {
1989 include_once DOL_DOCUMENT_ROOT.
'/salaries/class/salary.class.php';
1990 $object_instance =
new Salary($this->db);
1991 } elseif ($modulepart ==
'project') {
1992 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
1993 $object_instance =
new Project($this->db);
1994 } elseif ($modulepart ==
'project_task') {
1995 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
1996 $object_instance =
new Task($this->db);
1997 } elseif ($modulepart ==
'fichinter') {
1998 include_once DOL_DOCUMENT_ROOT.
'/fichinter/class/fichinter.class.php';
1999 $object_instance =
new Fichinter($this->db);
2000 } elseif ($modulepart ==
'user') {
2001 include_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
2002 $object_instance =
new User($this->db);
2003 } elseif ($modulepart ==
'expensereport') {
2004 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
2006 } elseif ($modulepart ==
'holiday') {
2007 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
2008 $object_instance =
new Holiday($this->db);
2009 } elseif ($modulepart ==
'recruitment-recruitmentcandidature') {
2010 include_once DOL_DOCUMENT_ROOT.
'/recruitment/class/recruitmentcandidature.class.php';
2012 } elseif ($modulepart ==
'banque') {
2013 include_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
2014 $object_instance =
new Account($this->db);
2015 } elseif ($modulepart ==
'bank-statement') {
2017 $object_instance =
null;
2018 } elseif ($modulepart ==
'chequereceipt') {
2019 include_once DOL_DOCUMENT_ROOT.
'/compta/paiement/cheque/class/remisecheque.class.php';
2021 } elseif ($modulepart ==
'mrp-mo') {
2022 include_once DOL_DOCUMENT_ROOT.
'/mrp/class/mo.class.php';
2023 $object_instance =
new Mo($this->db);
2025 $parameters = array(
'modulepart' => $modulepart);
2026 $reshook = $hookmanager->executeHooks(
'addSectionECMAuto', $parameters);
2027 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
2028 if (array_key_exists(
'classpath', $hookmanager->resArray) && !empty($hookmanager->resArray[
'classpath'])) {
2030 if (array_key_exists(
'classname', $hookmanager->resArray) && !empty($hookmanager->resArray[
'classname'])) {
2031 $tmpclassname = $hookmanager->resArray[
'classname'];
2032 if (is_string($tmpclassname) && class_exists($tmpclassname)) {
2033 $object_instance =
new $tmpclassname($this->db);
2044 $relativepathfromroot = preg_replace(
'/'.preg_quote(DOL_DATA_ROOT.
'/',
'/').
'/',
'', $upload_dir);
2045 if ($relativepathfromroot) {
2047 '@phan-var-force array<array{name:string,path:string,level1name:string,relativename:string,fullname:string,date:string,size:int,perm:int,type:string,position_name:string,cover:string,keywords:string,acl:string,rowid:int,label:string,share:string}> $filearray';
2050 if ($sortfield && $sortorder) {
2051 $filearray =
dol_sort_array($filearray, $sortfield, $sortorder, 1);
2057 foreach ($filearray as $key => $file) {
2058 if (!is_dir($file[
'name'])
2059 && $file[
'name'] !=
'.'
2060 && $file[
'name'] !=
'..'
2061 && $file[
'name'] !=
'CVS'
2062 && !preg_match(
'/\.meta$/i', $file[
'name'])) {
2064 $relativefile = preg_replace(
'/'.preg_quote($upload_dir.
'/',
'/').
'/',
'', $file[
'fullname']);
2072 if ($modulepart ==
'company' || $modulepart ==
'tax' || $modulepart ==
'tax-vat' || $modulepart ==
'salaries') {
2073 preg_match(
'/(\d+)\/[^\/]+$/', $relativefile, $reg);
2074 $id = (isset($reg[1]) ? $reg[1] :
'');
2075 } elseif ($modulepart ==
'invoice_supplier') {
2076 preg_match(
'/([^\/]+)\/[^\/]+$/', $relativefile, $reg);
2077 $ref = (isset($reg[1]) ? $reg[1] :
'');
2078 if (is_numeric($ref)) {
2082 } elseif ($modulepart ==
'user') {
2084 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
2085 $id = (isset($reg[1]) ? $reg[1] :
'');
2086 } elseif ($modulepart ==
'project_task') {
2088 $reg = explode(
"/", $relativefile);
2089 $ref = (isset($reg[1]) ? $reg[1] :
'');
2090 } elseif (in_array($modulepart, array(
2093 'supplier_proposal',
2102 'recruitment-recruitmentcandidature',
2107 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
2108 $ref = (isset($reg[1]) ? $reg[1] :
'');
2110 $parameters = array(
'modulepart' => $modulepart,
'fileinfo' => $file);
2111 $reshook = $hookmanager->executeHooks(
'addSectionECMAuto', $parameters);
2112 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
2113 if (array_key_exists(
'ref', $hookmanager->resArray) && !empty($hookmanager->resArray[
'ref'])) {
2114 $ref = $hookmanager->resArray[
'ref'];
2116 if (array_key_exists(
'id', $hookmanager->resArray) && !empty($hookmanager->resArray[
'id'])) {
2117 $id = $hookmanager->resArray[
'id'];
2123 if (!
$id && !$ref) {
2128 if (!empty(
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref])) {
2134 if (is_object($object_instance)) {
2135 $object_instance->id = 0;
2136 $object_instance->ref =
'';
2138 $result = $object_instance->fetch(
$id);
2140 $result = $object_instance->fetch(0, $ref);
2142 print $object_instance->error;
2143 } elseif ($result == 0) {
2149 $result = $object_instance->fetchOneLike($ref);
2156 $conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref] = clone $object_instance;
2160 $conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref] =
'notfound';
2161 unset($filearray[$key]);
2165 if ($found <= 0 || !is_object(
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref])) {
2168 if ($modulepart ==
'invoice_supplier' && (
int)
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref]->entity !== (
int)
$conf->entity) {
2172 print
'<!-- Line list_of_autoecmfiles key='.$key.
' -->'.
"\n";
2173 print
'<tr class="oddeven">';
2174 if ($enablebulkdownload) {
2175 print
'<td class="center">';
2176 print
'<input type="checkbox" class="flat checkforselect" name="selectedfiles[]" value="'.dol_escape_htmltag($relativefile).
'">';
2180 print
'<td class="tdoverflowmax150">';
2181 if ($found > 0 && is_object(
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref])) {
2182 $tmpobject =
$conf->cache[
'modulepartobject'][$modulepart.
'_'.
$id.
'_'.$ref];
2184 print $tmpobject->getNomUrl(1,
'document');
2189 print $langs->trans(
"ObjectDeleted", (
$id ?
$id : $ref));
2207 print
'target="_blank" ';
2209 print
'href="'.DOL_URL_ROOT.
'/document.php?modulepart='.urlencode($modulepart);
2210 if ($forcedownload) {
2211 print
'&attachment=1';
2213 print
'&file='.urlencode($relativefile).
'">';
2220 print $this->
showPreview($file, $modulepart, $file[
'relativename']);
2227 print
'<td class="right nowraponall">';
2228 if ($sizetoshow == $sizetoshowbytes) {
2231 print $form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
2236 print
'<td class="center">'.dol_print_date($file[
'date'],
"dayhour").
'</td>';
2239 print
'<td class="right">';
2240 if (!empty($file[
'share'])) {
2242 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim(
$dolibarr_main_url_root));
2243 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
2247 $forcedownload =
getDolGlobalInt(
'MAIN_FORCE_DOWNLOAD_IN_HTML_FORMFILE');
2249 if (!empty($file[
'share'])) {
2250 $paramlink .=
'hashp='.$file[
'share'];
2252 if ($forcedownload) {
2253 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
2256 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
2258 print
'<!-- shared link -->';
2259 print img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
' ';
2260 print
'<input type="text" class="quatrevingtpercent width100 nopadding nopadding small downloadexternallink" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).
'" spellcheck="false">';
2274 if (count($filearray) == 0) {
2275 print
'<tr class="oddeven"><td colspan="'.($enablebulkdownload ?
'6' :
'5').
'">';
2276 if (empty($textifempty)) {
2277 print
'<span class="opacitymedium">'.$langs->trans(
"NoFileFound").
'</span>';
2279 print
'<span class="opacitymedium">'.$textifempty.
'</span>';
2286 if (!empty($addfilterfields)) {
2289 return count($filearray);
2305 public function listOfLinks(
$object, $permissiontodelete = 1, $action =
null, $selected =
null, $param =
'', $htmlname =
'formaddlink', $moreoptions = array())
2307 global
$conf, $langs;
2308 global $sortfield, $sortorder;
2310 $langs->load(
"link");
2312 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
2313 $link =
new Link($this->db);
2315 if ($sortfield ==
"name") {
2316 $sortfield =
"label";
2317 } elseif ($sortfield ==
"date") {
2318 $sortfield =
"datea";
2322 $res = $link->fetchAll($links,
$object->element,
$object->id, $sortfield, $sortorder);
2323 $param .= (isset(
$object->id) && !preg_match(
'/&id='.
$object->id.
'/i', $param) ?
'&id='.$object->id :
'');
2325 $permissiontoedit = $permissiontodelete;
2327 print
'<!-- listOfLinks -->'.
"\n";
2329 $morehtmlright =
'';
2330 if (!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) {
2331 $morehtmlright .=
dolGetButtonTitle($langs->trans(
'New'),
'',
'fa fa-plus-circle',
'javascript:console.log("open addlink form"); if (jQuery(".divlinkfile").is(":hidden")) { jQuery(".divlinkfile").removeClass("hidden"); } else { jQuery(".divlinkfile").addClass("hidden"); } void(0);',
'', $permissiontoedit);
2335 print
load_fiche_titre($langs->trans(
"LinkedFiles"), $morehtmlright,
'link', 0,
'',
'table-list-of-links');
2337 if (!empty($moreoptions) && $moreoptions[
'afterlinktitle']) {
2338 print
'<div class="divlinkfile'.((!empty($moreoptions[
'showhideaddbutton']) &&
$conf->use_javascript_ajax) ?
' hidden' :
'').
'">'.$moreoptions[
'afterlinktitle'].
'</div>';
2341 print
'<form action="'.$_SERVER[
'PHP_SELF'].($param ?
'?'.$param :
'').
'" id="'.$htmlname.
'" method="POST">';
2342 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2343 print
'<div class="div-table-responsive-no-min">';
2345 print
'<table class="liste noborder nobottom centpercent">';
2346 print
'<tr class="liste_titre">';
2348 $langs->trans(
"Links"),
2349 $_SERVER[
'PHP_SELF'],
2370 $langs->trans(
"Date"),
2371 $_SERVER[
'PHP_SELF'],
2382 $_SERVER[
'PHP_SELF'],
2394 $nboflinks = count($links);
2395 if ($nboflinks > 0) {
2396 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2398 foreach ($links as $key => $link) {
2399 print
'<tr class="oddeven">';
2401 if ($action ==
'update' && (
int) $selected === (
int) $link->id && $permissiontoedit) {
2403 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2404 print
'<input type="hidden" name="linkid" value="'.$link->id.
'">';
2405 print
'<input type="hidden" name="action" value="confirm_updateline">';
2406 print $langs->trans(
'Link').
': <input type="text" name="link" value="'.$link->url.
'">';
2409 print $langs->trans(
'Label').
': <input type="text" name="label" value="'.
dol_escape_htmltag($link->label).
'">';
2411 print
'<td class="center">'.dol_print_date(
dol_now(),
"dayhour",
"tzuser").
'</td>';
2412 print
'<td class="right">';
2413 print
'<label for="idshareenabled'.$key.
'">'.$langs->trans(
"LinkSharedViaALink").
'</label> ';
2414 print
'<input class="inline-block" type="checkbox" id="idshareenabled'.$key.
'" name="shareenabled"'.($link->share ?
' checked="checked"' :
'').
' /> ';
2416 print
'<td class="right">';
2417 print
'<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'">';
2418 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'">';
2422 print img_picto(
'',
'globe').
' ';
2423 print
'<a data-ajax="false" href="'.$link->url.
'" target="_blank" rel="noopener noreferrer">';
2427 print
'<td class="right"></td>';
2428 print
'<td class="center">'.dol_print_date($link->datea,
"dayhour",
"tzuser").
'</td>';
2429 print
'<td class="center">';
2432 $urlwithouturlroot = preg_replace(
'/' . preg_quote(DOL_URL_ROOT,
'/') .
'$/i',
'', trim(
$dolibarr_main_url_root));
2433 $urlwithroot = $urlwithouturlroot . DOL_URL_ROOT;
2434 $fulllink = $urlwithroot.
'/document.php?type=link&hashp=' . $link->share;
2436 print
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
2437 print
'<input type="text" class="centpercentminusx minwidth200imp nopadding small downloadexternallink" id="downloadlink'.$link->id.
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"LinkSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'" spellcheck="false">';
2440 print
'<td class="right">';
2441 print
'<a href="'.$_SERVER[
'PHP_SELF'].
'?action=update&linkid='.$link->id.$param.
'&token='.
newToken().
'" class="editfilelink editfielda reposition" >'.img_edit().
'</a>';
2442 if ($permissiontodelete) {
2443 print
' <a class="deletefilelink reposition" href="'.$_SERVER[
'PHP_SELF'].
'?action=deletelink&token='.
newToken().
'&linkid='.((int) $link->id).$param.
'">'.img_delete().
'</a>';
2451 if ($nboflinks == 0) {
2452 print
'<tr class="oddeven"><td colspan="5">';
2453 print
'<span class="opacitymedium">'.$langs->trans(
"NoLinkFound").
'</span>';
2474 public function showPreview($file, $modulepart, $relativepath, $ruleforpicto = 0, $param =
'')
2476 global $langs,
$conf;
2479 if ((
$conf->browser->layout !=
'phone' ||
getDolGlobalString(
'MAIN_SHOW_PREVIEW_PICTO_EVEN_ON_PHONE')) && !empty(
$conf->use_javascript_ajax)) {
2481 if (count($urladvancedpreview)) {
2482 $out .=
'<a class="pictopreview '.$urladvancedpreview[
'css'].
'" href="'.$urladvancedpreview[
'url'].
'"'.(empty($urladvancedpreview[
'mime']) ?
'' :
' mime="'.$urladvancedpreview[
'mime'].
'"').
' '.(empty($urladvancedpreview[
'target']) ?
'' :
' target="'.$urladvancedpreview[
'target'].
'"').
'>';
2484 if (empty($ruleforpicto)) {
2485 $out .= img_picto(
'',
'search-plus',
'class="pictofixedwidth"');
2487 $out .=
img_mime($relativepath, $langs->trans(
'Preview').
' '.$file[
'name'],
'pictofixedwidth');
2491 if ($ruleforpicto < 0) {
2492 $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='', $placeholder='')
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.
if(! $sortfield) if(! $sortorder) $module
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.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
getImageFileNameForSize($file, $extName, $extImgTarget='')
Return the filename of file to get the thumbs.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '...' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='')
Return URL we can use for advanced preview links.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
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.