57 $this->numoffiles = 0;
86 public function form_attach_new_file($url, $title =
'', $addcancel = 0, $sectionid = 0, $perm = 1, $size = 50, $object =
'', $options =
'', $useajax = 1, $savingdocmask =
'', $linkfiles = 1, $htmlname =
'formuserfile', $accept =
'', $sectiondir =
'', $usewithoutform = 0, $capture = 0, $disablemulti = 0, $nooutput = 0)
89 global $conf, $langs, $hookmanager;
90 $hookmanager->initHooks(array(
'formfile'));
94 dol_syslog(__METHOD__.
": using 2 for useajax is deprecated and should be not used", LOG_WARNING);
97 if (!empty($conf->browser->layout) && $conf->browser->layout !=
'classic') {
101 if ((!empty($conf->global->MAIN_USE_JQUERY_FILEUPLOAD) && $useajax) || ($useajax == 2)) {
108 return 'Feature too bugged so removed';
111 if (!$perm && !empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED)) {
119 $out =
"\n\n".
'<!-- Start form attach new file --><div class="formattachnewfile">'.
"\n";
122 $title = $langs->trans(
"AttachANewFile");
124 if ($title !=
'none') {
128 if (empty($usewithoutform)) {
130 $url .= (strpos($url,
'?') ===
false ?
'?' :
'&').
'uploadform=1';
132 $out .=
'<form name="'.$htmlname.
'" id="'.$htmlname.
'" action="'.$url.
'" enctype="multipart/form-data" method="POST">'.
"\n";
134 if (empty($usewithoutform) || $usewithoutform == 2) {
135 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
136 $out .=
'<input type="hidden" id="'.$htmlname.
'_section_dir" name="section_dir" value="'.$sectiondir.
'">'.
"\n";
137 $out .=
'<input type="hidden" id="'.$htmlname.
'_section_id" name="section_id" value="'.$sectionid.
'">'.
"\n";
138 $out .=
'<input type="hidden" name="sortfield" value="'.GETPOST(
'sortfield',
'aZ09comma').
'">'.
"\n";
139 $out .=
'<input type="hidden" name="sortorder" value="'.GETPOST(
'sortorder',
'aZ09comma').
'">'.
"\n";
140 $out .=
'<input type="hidden" name="page_y" value="">'.
"\n";
143 $out .=
'<table class="nobordernopadding centpercent">';
146 if (!empty($options)) {
147 $out .=
'<td>'.$options.
'</td>';
150 $out .=
'<td class="valignmiddle nowrap">';
153 $max = $maxfilesizearray[
'max'];
154 $maxmin = $maxfilesizearray[
'maxmin'];
155 $maxphptoshow = $maxfilesizearray[
'maxphptoshow'];
156 $maxphptoshowparam = $maxfilesizearray[
'maxphptoshowparam'];
158 $out .=
'<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).
'">';
160 $out .=
'<input class="flat minwidth400 maxwidth200onsmartphone" type="file"';
161 $out .= ((!empty($conf->global->MAIN_DISABLE_MULTIPLE_FILEUPLOAD) || $disablemulti) ?
' name="userfile"' :
' name="userfile[]" multiple');
162 $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ?
' disabled' :
'');
163 $out .= (!empty($accept) ?
' accept="'.$accept.
'"' :
' accept=""');
164 $out .= (!empty($capture) ?
' capture="capture"' :
'');
168 $langs->load(
'link');
169 $out .=
'<span class="nowraponsmartphone"><input style="margin-right: 2px;" type="checkbox" id="overwritefile" name="overwritefile" value="1"><label for="overwritefile">'.$langs->trans(
"OverwriteIfExists").
'</label></span>';
171 $out .=
'<input type="submit" class="button small reposition" name="sendit" value="'.$langs->trans(
"Upload").
'"';
172 $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ?
' disabled' :
'');
177 $out .=
'<input type="submit" class="button small button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
180 if (!empty($conf->global->MAIN_UPLOAD_DOC)) {
182 $menudolibarrsetupmax = $langs->transnoentitiesnoconv(
"Home").
' - '.$langs->transnoentitiesnoconv(
"Setup").
' - '.$langs->transnoentitiesnoconv(
"Security");
183 $langs->load(
'other');
185 $out .=
info_admin($langs->trans(
"ThisLimitIsDefinedInSetupAt", $menudolibarrsetupmax, $max, $maxphptoshowparam, $maxphptoshow), 1);
188 $out .=
' ('.$langs->trans(
"UploadDisabled").
')';
190 $out .=
"</td></tr>";
192 if ($savingdocmask) {
194 $rename = (empty($conf->global->MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT) ?
'checked' :
'');
197 if (!empty($options)) {
198 $out .=
'<td>'.$options.
'</td>';
200 $out .=
'<td valign="middle" class="nowrap">';
201 $out .=
'<input type="checkbox" '.$rename.
' class="savingdocmask" name="savingdocmask" id="savingdocmask" value="'.
dol_escape_js($savingdocmask).
'"> ';
202 $out .=
'<label class="opacitymedium small" for="savingdocmask">';
203 $out .= $langs->trans(
"SaveUploadedFileWithMask", preg_replace(
'/__file__/', $langs->transnoentitiesnoconv(
"OriginFileName"), $savingdocmask), $langs->transnoentitiesnoconv(
"OriginFileName"));
211 if (empty($usewithoutform)) {
213 if (empty($sectionid)) {
218 $out .=
"\n</div><!-- End form attach new file -->\n";
221 $out .=
"\n".
'<!-- Start form link new url --><div class="formlinknewurl">'.
"\n";
222 $langs->load(
'link');
223 $title = $langs->trans(
"LinkANewFile");
226 if (empty($usewithoutform)) {
227 $out .=
'<form name="'.$htmlname.
'_link" id="'.$htmlname.
'_link" action="'.$url.
'" method="POST">'.
"\n";
228 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">'.
"\n";
229 $out .=
'<input type="hidden" id="'.$htmlname.
'_link_section_dir" name="link_section_dir" value="">'.
"\n";
230 $out .=
'<input type="hidden" id="'.$htmlname.
'_link_section_id" name="link_section_id" value="'.$sectionid.
'">'.
"\n";
231 $out .=
'<input type="hidden" name="page_y" value="">'.
"\n";
234 $out .=
'<div class="valignmiddle">';
235 $out .=
'<div class="inline-block" style="padding-right: 10px;">';
236 if (!empty($conf->global->OPTIMIZEFORTEXTBROWSER)) {
237 $out .=
'<label for="link">'.$langs->trans(
"URLToLink").
':</label> ';
239 $out .=
'<input type="text" name="link" class="flat minwidth400imp" id="link" placeholder="'.dol_escape_htmltag($langs->trans(
"URLToLink")).
'">';
241 $out .=
'<div class="inline-block" style="padding-right: 10px;">';
242 if (!empty($conf->global->OPTIMIZEFORTEXTBROWSER)) {
243 $out .=
'<label for="label">'.$langs->trans(
"Label").
':</label> ';
245 $out .=
'<input type="text" class="flat" name="label" id="label" placeholder="'.dol_escape_htmltag($langs->trans(
"Label")).
'">';
246 $out .=
'<input type="hidden" name="objecttype" value="'.$object->element.
'">';
247 $out .=
'<input type="hidden" name="objectid" value="'.$object->id.
'">';
249 $out .=
'<div class="inline-block" style="padding-right: 10px;">';
250 $out .=
'<input type="submit" class="button small reposition" name="linkit" value="'.$langs->trans(
"ToLink").
'"';
251 $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm) ?
' disabled' :
'');
255 if (empty($usewithoutform)) {
256 $out .=
'<div class="clearboth"></div>';
257 $out .=
'</form><br>';
260 $out .=
"\n</div><!-- End form link new url -->\n";
263 $parameters = array(
'socid'=>(isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id'=>(isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'url'=>$url,
'perm'=>$perm,
'options'=>$options);
264 $res = $hookmanager->executeHooks(
'formattachOptions', $parameters, $object);
266 $out =
'<div class="'.($usewithoutform ?
'inline-block valignmiddle' :
'attacharea attacharea'.$htmlname).
'">'.$out.
'</div>';
268 $out .= $hookmanager->resPrint;
302 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 =
'')
305 $this->numoffiles = 0;
306 print $this->
showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed, $modelselected, $allowgenifempty, $forcenomultilang, $iconPDF, $notused, $noform, $param, $title, $buttonlabel, $codelang);
307 return $this->numoffiles;
337 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 =
'')
339 global $dolibarr_main_url_root;
342 if (!empty($iconPDF)) {
343 dol_syslog(__METHOD__.
": passing iconPDF parameter is deprecated", LOG_WARNING);
346 global $langs, $conf, $user, $hookmanager;
350 if (is_object($hookmanager)) {
352 'modulepart'=>&$modulepart,
353 'modulesubdir'=>&$modulesubdir,
354 'filedir'=>&$filedir,
355 'urlsource'=>&$urlsource,
356 'genallowed'=>&$genallowed,
357 'delallowed'=>&$delallowed,
358 'modelselected'=>&$modelselected,
359 'allowgenifempty'=>&$allowgenifempty,
360 'forcenomultilang'=>&$forcenomultilang,
364 'buttonlabel'=>&$buttonlabel,
365 'codelang'=>&$codelang,
366 'morepicto'=>&$morepicto,
367 'hideifempty'=>&$hideifempty,
368 'removeaction'=>&$removeaction
370 $reshook = $hookmanager->executeHooks(
'showDocuments', $parameters, $object);
378 return $hookmanager->resPrint;
381 if (!is_object(
$form)) {
385 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
388 if (!empty($iconPDF)) {
393 if (!preg_match(
'/entity\=[0-9]+/', $param)) {
394 $param .= ($param ?
'&' :
'').
'entity='.(!empty($object->entity) ? $object->entity : $conf->entity);
399 if (in_array($modulepart, array(
'contract',
'facture',
'supplier_proposal',
'propal',
'proposal',
'order',
'commande',
'expedition',
'commande_fournisseur',
'expensereport',
'delivery',
'ticket'))) {
400 $printer = (!empty($user->rights->printing->read) && !empty($conf->printing->enabled)) ?
true:
false;
403 $hookmanager->initHooks(array(
'formfile'));
407 if (!empty($filedir)) {
408 $file_list =
dol_dir_list($filedir,
'files', 0,
'',
'(\.meta|_preview.*.*\.png)$',
'date', SORT_DESC);
410 if ($hideifempty && empty($file_list)) {
415 $forname =
'builddoc';
420 $out .=
"\n".
'<!-- Start show_document -->'.
"\n";
423 if (preg_match(
'/massfilesarea_/', $modulepart)) {
424 $out .=
'<div id="show_files"><br></div>'.
"\n";
425 $title = $langs->trans(
"MassFilesArea").
' <a href="" id="togglemassfilesarea" ref="shown">('.$langs->trans(
"Hide").
')</a>';
426 $title .=
'<script nonce="'.getNonce().
'">
427 jQuery(document).ready(function() {
428 jQuery(\'#togglemassfilesarea\').click(function() {
429 if (jQuery(\'#togglemassfilesarea\').attr(\'ref\') == "shown")
431 jQuery(\'#'.$modulepart.
'_table\').hide();
432 jQuery(\'#togglemassfilesarea\').attr("ref", "hidden");
433 jQuery(\'#togglemassfilesarea\').text("('.
dol_escape_js($langs->trans(
"Show")).
')");
437 jQuery(\'#'.$modulepart.
'_table\').show();
438 jQuery(\'#togglemassfilesarea\').attr("ref","shown");
439 jQuery(\'#togglemassfilesarea\').text("('.
dol_escape_js($langs->trans(
"Hide")).
')");
447 $titletoshow = $langs->trans(
"Documents");
448 if (!empty($title)) {
449 $titletoshow = ($title ==
'none' ?
'' : $title);
452 $submodulepart = $modulepart;
455 $tmp = explode(
':', $modulepart);
456 if (!empty($tmp[1])) {
457 $modulepart = $tmp[0];
458 $submodulepart = $tmp[1];
461 $addcolumforpicto = ($delallowed || $printer || $morepicto);
462 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
467 $modellist = array();
469 if ($modulepart ==
'company') {
471 if (is_array($genallowed)) {
472 $modellist = $genallowed;
474 include_once DOL_DOCUMENT_ROOT.
'/core/modules/societe/modules_societe.class.php';
477 } elseif ($modulepart ==
'propal') {
478 if (is_array($genallowed)) {
479 $modellist = $genallowed;
481 include_once DOL_DOCUMENT_ROOT.
'/core/modules/propale/modules_propale.php';
484 } elseif ($modulepart ==
'supplier_proposal') {
485 if (is_array($genallowed)) {
486 $modellist = $genallowed;
488 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_proposal/modules_supplier_proposal.php';
491 } elseif ($modulepart ==
'commande') {
492 if (is_array($genallowed)) {
493 $modellist = $genallowed;
495 include_once DOL_DOCUMENT_ROOT.
'/core/modules/commande/modules_commande.php';
498 } elseif ($modulepart ==
'expedition') {
499 if (is_array($genallowed)) {
500 $modellist = $genallowed;
502 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
505 } elseif ($modulepart ==
'reception') {
506 if (is_array($genallowed)) {
507 $modellist = $genallowed;
509 include_once DOL_DOCUMENT_ROOT.
'/core/modules/reception/modules_reception.php';
512 } elseif ($modulepart ==
'delivery') {
513 if (is_array($genallowed)) {
514 $modellist = $genallowed;
516 include_once DOL_DOCUMENT_ROOT.
'/core/modules/delivery/modules_delivery.php';
519 } elseif ($modulepart ==
'ficheinter') {
520 if (is_array($genallowed)) {
521 $modellist = $genallowed;
523 include_once DOL_DOCUMENT_ROOT.
'/core/modules/fichinter/modules_fichinter.php';
526 } elseif ($modulepart ==
'facture') {
527 if (is_array($genallowed)) {
528 $modellist = $genallowed;
530 include_once DOL_DOCUMENT_ROOT.
'/core/modules/facture/modules_facture.php';
533 } elseif ($modulepart ==
'contract') {
535 if (is_array($genallowed)) {
536 $modellist = $genallowed;
538 include_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
541 } elseif ($modulepart ==
'project') {
542 if (is_array($genallowed)) {
543 $modellist = $genallowed;
545 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/modules_project.php';
548 } elseif ($modulepart ==
'project_task') {
549 if (is_array($genallowed)) {
550 $modellist = $genallowed;
552 include_once DOL_DOCUMENT_ROOT.
'/core/modules/project/task/modules_task.php';
555 } elseif ($modulepart ==
'product') {
556 if (is_array($genallowed)) {
557 $modellist = $genallowed;
559 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product/modules_product.class.php';
562 } elseif ($modulepart ==
'product_batch') {
563 if (is_array($genallowed)) {
564 $modellist = $genallowed;
566 include_once DOL_DOCUMENT_ROOT.
'/core/modules/product_batch/modules_product_batch.class.php';
569 } elseif ($modulepart ==
'stock') {
570 if (is_array($genallowed)) {
571 $modellist = $genallowed;
573 include_once DOL_DOCUMENT_ROOT.
'/core/modules/stock/modules_stock.php';
576 } elseif ($modulepart ==
'movement') {
577 if (is_array($genallowed)) {
578 $modellist = $genallowed;
580 include_once DOL_DOCUMENT_ROOT.
'/core/modules/stock/modules_movement.php';
583 } elseif ($modulepart ==
'export') {
584 if (is_array($genallowed)) {
585 $modellist = $genallowed;
587 include_once DOL_DOCUMENT_ROOT.
'/core/modules/export/modules_export.php';
588 $modellist = ModeleExports::liste_modeles($this->db);
590 } elseif ($modulepart ==
'commande_fournisseur' || $modulepart ==
'supplier_order') {
591 if (is_array($genallowed)) {
592 $modellist = $genallowed;
594 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
597 } elseif ($modulepart ==
'facture_fournisseur' || $modulepart ==
'supplier_invoice') {
599 if (is_array($genallowed)) {
600 $modellist = $genallowed;
602 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_invoice/modules_facturefournisseur.php';
605 } elseif ($modulepart ==
'supplier_payment') {
606 if (is_array($genallowed)) {
607 $modellist = $genallowed;
609 include_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_payment/modules_supplier_payment.php';
612 } elseif ($modulepart ==
'remisecheque') {
613 if (is_array($genallowed)) {
614 $modellist = $genallowed;
616 include_once DOL_DOCUMENT_ROOT.
'/core/modules/cheque/modules_chequereceipts.php';
619 } elseif ($modulepart ==
'donation') {
620 if (is_array($genallowed)) {
621 $modellist = $genallowed;
623 include_once DOL_DOCUMENT_ROOT.
'/core/modules/dons/modules_don.php';
626 } elseif ($modulepart ==
'member') {
627 if (is_array($genallowed)) {
628 $modellist = $genallowed;
630 include_once DOL_DOCUMENT_ROOT.
'/core/modules/member/modules_cards.php';
633 } elseif ($modulepart ==
'agenda' || $modulepart ==
'actions') {
634 if (is_array($genallowed)) {
635 $modellist = $genallowed;
637 include_once DOL_DOCUMENT_ROOT.
'/core/modules/action/modules_action.php';
640 } elseif ($modulepart ==
'expensereport') {
641 if (is_array($genallowed)) {
642 $modellist = $genallowed;
644 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expensereport/modules_expensereport.php';
647 } elseif ($modulepart ==
'unpaid') {
649 } elseif ($modulepart ==
'user') {
650 if (is_array($genallowed)) {
651 $modellist = $genallowed;
653 include_once DOL_DOCUMENT_ROOT.
'/core/modules/user/modules_user.class.php';
656 } elseif ($modulepart ==
'usergroup') {
657 if (is_array($genallowed)) {
658 $modellist = $genallowed;
660 include_once DOL_DOCUMENT_ROOT.
'/core/modules/usergroup/modules_usergroup.class.php';
665 $file =
dol_buildpath(
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
666 if (file_exists($file)) {
667 $res = include_once $file;
670 $file =
dol_buildpath(
'/'.$modulepart.
'/core/modules/'.$modulepart.
'/modules_'.strtolower($submodulepart).
'.php', 0);
671 $res = include_once $file;
674 $class =
'ModelePDF'.ucfirst($submodulepart);
676 if (class_exists($class)) {
677 $modellist = call_user_func($class.
'::liste_modeles', $this->db);
679 dol_print_error($this->db,
"Bad value for modulepart '".$modulepart.
"' in showdocuments (class ".$class.
" for Doc generation not found)");
687 if (empty($buttonlabel)) {
688 $buttonlabel = $langs->trans(
'Generate');
691 if ($conf->browser->layout ==
'phone') {
692 $urlsource .=
'#'.$forname.
'_form';
694 if (empty($noform)) {
695 $out .=
'<form action="'.$urlsource.
'" id="'.$forname.
'_form" method="post">';
697 $out .=
'<input type="hidden" name="action" value="builddoc">';
698 $out .=
'<input type="hidden" name="page_y" value="">';
699 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
702 $out .=
'<div class="div-table-responsive-no-min">';
703 $out .=
'<table class="liste formdoc noborder centpercent">';
705 $out .=
'<tr class="liste_titre">';
707 $out .=
'<th colspan="'.$colspan.
'" class="formdoc liste_titre maxwidthonsmartphone center">';
710 if (!empty($modellist)) {
712 $out .=
'<span class="hideonsmartphone">'.$langs->trans(
'Model').
' </span>';
713 if (is_array($modellist) && count($modellist) == 1) {
714 $arraykeys = array_keys($modellist);
715 $modelselected = $arraykeys[0];
717 $morecss =
'minwidth75 maxwidth200';
718 if ($conf->browser->layout ==
'phone') {
719 $morecss =
'maxwidth100';
721 $out .=
$form->selectarray(
'model', $modellist, $modelselected, $showempty, 0, 0,
'', 0, 0, 0,
'', $morecss);
722 if ($conf->use_javascript_ajax) {
725 $out .=
$form->textwithpicto(
'', $tooltipontemplatecombo, 1,
'help',
'marginrightonly', 0, 3,
'', 0);
727 $out .=
'<div class="float">'.$langs->trans(
"Files").
'</div>';
731 if (($allowgenifempty || (is_array($modellist) && count($modellist) > 0)) &&
getDolGlobalInt(
'MAIN_MULTILANGS') && !$forcenomultilang && (!empty($modellist) || $showempty)) {
732 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formadmin.class.php';
734 $defaultlang = ($codelang && $codelang !=
'auto') ? $codelang : $langs->getDefaultLang();
735 $morecss =
'maxwidth150';
736 if ($conf->browser->layout ==
'phone') {
737 $morecss =
'maxwidth100';
739 $out .= $formadmin->select_language($defaultlang,
'lang_id', 0,
null, 0, 0, 0, $morecss);
745 $genbutton =
'<input class="button buttongen reposition nomargintop nomarginbottom" id="'.$forname.
'_generatebutton" name="'.$forname.
'_generatebutton"';
746 $genbutton .=
' type="submit" value="'.$buttonlabel.
'"';
747 if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) {
748 $genbutton .=
' disabled';
751 if ($allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
752 $langs->load(
"errors");
753 $genbutton .=
' '.img_warning($langs->transnoentitiesnoconv(
"WarningNoDocumentModelActivated"));
755 if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart !=
'unpaid') {
758 if (empty($modellist) && !$showempty && $modulepart !=
'unpaid') {
764 if (!empty($hookmanager->hooks[
'formfile'])) {
765 foreach ($hookmanager->hooks[
'formfile'] as $module) {
766 if (method_exists($module,
'formBuilddocLineOptions')) {
775 $parameters = array(
'colspan'=>($colspan + $colspanmore),
'socid'=>(isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id'=>(isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'modulepart'=>$modulepart);
776 if (is_object($hookmanager)) {
777 $reshook = $hookmanager->executeHooks(
'formBuilddocOptions', $parameters, $GLOBALS[
'object']);
778 $out .= $hookmanager->resPrint;
783 if (!empty($filedir)) {
784 $link_list = array();
785 if (is_object($object)) {
786 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
787 $link =
new Link($this->db);
788 $sortfield = $sortorder =
null;
789 $res = $link->fetchAll($link_list, $object->element, $object->id, $sortfield, $sortorder);
792 $out .=
'<!-- html.formfile::showdocuments -->'.
"\n";
795 if ((!empty($file_list) || !empty($link_list) || preg_match(
'/^massfilesarea/', $modulepart))
798 $out .=
'<div class="titre">'.$titletoshow.
'</div>'.
"\n";
799 $out .=
'<div class="div-table-responsive-no-min">';
800 $out .=
'<table class="noborder centpercent" id="'.$modulepart.
'_table">'.
"\n";
804 if (is_array($file_list)) {
808 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $filedir);
809 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
817 if (!empty($sortfield) && !empty($sortorder)) {
822 foreach ($file_list as $file) {
824 $relativepath = $file[
"name"];
826 $relativepath = $modulesubdir.
"/".$file[
"name"];
828 if ($modulepart ==
'export') {
829 $relativepath = $file[
"name"];
832 $out .=
'<tr class="oddeven">';
834 $documenturl = DOL_URL_ROOT.
'/document.php';
835 if (isset($conf->global->DOL_URL_ROOT_DOCUMENT_PHP)) {
836 $documenturl = $conf->global->DOL_URL_ROOT_DOCUMENT_PHP;
840 $imgpreview = $this->
showPreview($file, $modulepart, $relativepath, 0, $param);
842 $out .=
'<td class="minwidth200 tdoverflowmax300">';
844 $out .=
'<span class="spanoverflow widthcentpercentminusx valignmiddle">';
846 $out .=
'<span class="spanoverflow">';
848 $out .=
'<a class="documentdownload paddingright" href="'.$documenturl.
'?modulepart='.$modulepart.
'&file='.urlencode($relativepath).($param ?
'&'.$param :
'').
'"';
851 if (preg_match(
'/text/', $mime)) {
852 $out .=
' target="_blank" rel="noopener noreferrer"';
854 $out .=
' title="'.dol_escape_htmltag($file[
"name"]).
'"';
856 $out .=
img_mime($file[
"name"], $langs->trans(
"File").
': '.$file[
"name"]);
859 $out .=
'</span>'.
"\n";
864 $size = (!empty($file[
'size']) ? $file[
'size'] :
dol_filesize($filedir.
"/".$file[
"name"]));
865 $out .=
'<td class="nowraponall right">'.dol_print_size($size, 1, 1).
'</td>';
868 $date = (!empty($file[
'date']) ? $file[
'date'] :
dol_filemtime($filedir.
"/".$file[
"name"]));
869 $out .=
'<td class="nowrap right">'.dol_print_date($date,
'dayhour',
'tzuser').
'</td>';
872 $out .=
'<td class="nowraponall">';
873 if (!empty($file[
'share'])) {
875 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
876 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
882 if (!empty($file[
'share'])) {
883 $paramlink .= ($paramlink ?
'&' :
'').
'hashp='.$file[
'share'];
885 if ($forcedownload) {
886 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
889 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
891 $out .=
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
892 $out .=
'<input type="text" class="quatrevingtpercentminusx width75 nopadding small" id="downloadlink'.$file[
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'">';
900 if ($delallowed || $printer || $morepicto) {
901 $out .=
'<td class="right nowraponall">';
903 $tmpurlsource = preg_replace(
'/#[a-zA-Z0-9_]*$/',
'', $urlsource);
904 $out .=
'<a class="reposition" href="'.$tmpurlsource.((strpos($tmpurlsource,
'?') ===
false) ?
'?' :
'&').
'action='.urlencode($removeaction).
'&token='.
newToken().
'&file='.urlencode($relativepath);
905 $out .= ($param ?
'&'.$param :
'');
908 $out .=
'">'.img_picto($langs->trans(
"Delete"),
'delete').
'</a>';
911 $out .=
'<a class="marginleftonly reposition" href="'.$urlsource.(strpos($urlsource,
'?') ?
'&' :
'?').
'action=print_file&token='.
newToken().
'&printer='.urlencode($modulepart).
'&file='.urlencode($relativepath);
912 $out .= ($param ?
'&'.$param :
'');
913 $out .=
'">'.img_picto($langs->trans(
"PrintFile", $relativepath),
'printer.png').
'</a>';
916 $morepicto = preg_replace(
'/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto);
922 if (is_object($hookmanager)) {
923 $addcolumforpicto = ($delallowed || $printer || $morepicto);
924 $colspan = (4 + ($addcolumforpicto ? 1 : 0));
926 $parameters = array(
'colspan'=>($colspan + $colspanmore),
'socid'=>(isset($GLOBALS[
'socid']) ? $GLOBALS[
'socid'] :
''),
'id'=>(isset($GLOBALS[
'id']) ? $GLOBALS[
'id'] :
''),
'modulepart'=>$modulepart,
'relativepath'=>$relativepath);
927 $res = $hookmanager->executeHooks(
'formBuilddocLineOptions', $parameters, $file);
929 $out .= $hookmanager->resPrint;
932 $out = $hookmanager->resPrint;
940 if (is_array($link_list)) {
943 foreach ($link_list as $file) {
944 $out .=
'<tr class="oddeven">';
945 $out .=
'<td colspan="'.$colspan.
'" class="maxwidhtonsmartphone">';
946 $out .=
'<a data-ajax="false" href="'.$file->url.
'" target="_blank" rel="noopener noreferrer">';
947 $out .= $file->label;
950 $out .=
'<td class="right">';
955 if ($delallowed || $printer || $morepicto) {
958 $out .=
'</tr>'.
"\n";
963 if (count($file_list) == 0 && count($link_list) == 0 && $headershown) {
964 $out .=
'<tr><td colspan="'.(3 + ($addcolumforpicto ? 1 : 0)).
'"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td></tr>'.
"\n";
970 $out .=
"</table>\n";
973 if (empty($noform)) {
974 $out .=
'</form>'.
"\n";
978 $out .=
'<!-- End show_document -->'.
"\n";
996 public function getDocumentsLink($modulepart, $modulesubdir, $filedir, $filter =
'', $morecss =
'valignmiddle', $allfiles = 0)
998 global $conf, $langs;
1000 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1003 $this->infofiles = array(
'nboffiles'=>0,
'extensions'=>array(),
'files'=>array());
1010 preg_match(
'/\/([0-9]+)\/[^\/]+\/'.preg_quote($modulesubdir,
'/').
'$/', $filedir, $regs);
1011 $entity = ((!empty($regs[1]) && $regs[1] > 1) ? $regs[1] : 1);
1015 if ($allfiles || !empty($conf->global->MAIN_SHOW_ALL_FILES_ON_DOCUMENT_TOOLTIP)) {
1016 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/');
1018 $filterforfilesearch =
'^'.preg_quote(basename($modulesubdir),
'/').
'\.';
1020 $file_list =
dol_dir_list($filedir,
'files', 0, $filterforfilesearch,
'\.meta$|\.png$');
1024 $out .=
'<!-- html.formfile::getDocumentsLink -->'.
"\n";
1025 if (!empty($file_list)) {
1026 $out =
'<dl class="dropdown inline-block">
1027 <dt><a data-ajax="false" href="#" onClick="return false;">'.img_picto(
'',
'listlight',
'', 0, 0, 0,
'', $morecss).
'</a></dt>
1028 <dd><div class="multichoicedoc" style="position:absolute;left:100px;" ><ul class="ulselectedfields">';
1034 foreach ($file_list as $file) {
1036 if ($filter && !preg_match(
'/'.$filter.
'/i', $file[
"name"])) {
1042 $relativepath = $file[
"name"];
1043 if ($modulesubdir) {
1044 $relativepath = $modulesubdir.
"/".$file[
"name"];
1047 if ($modulepart ==
'donation') {
1048 $relativepath =
get_exdir($modulesubdir, 2, 0, 0,
null,
'donation').$file[
"name"];
1050 if ($modulepart ==
'export') {
1051 $relativepath = $file[
"name"];
1054 $this->infofiles[
'nboffiles']++;
1055 $this->infofiles[
'files'][] = $file[
'fullname'];
1056 $ext = pathinfo($file[
"name"], PATHINFO_EXTENSION);
1057 if (empty($this->infofiles[$ext])) {
1058 $this->infofiles[
'extensions'][$ext] = 1;
1060 $this->infofiles[
'extensions'][$ext]++;
1064 if (!empty($conf->use_javascript_ajax) && ($conf->browser->layout !=
'phone')) {
1066 if ($tmparray && $tmparray[
'url']) {
1067 $tmpout .=
'<li><a href="'.$tmparray[
'url'].
'"'.($tmparray[
'css'] ?
' class="'.$tmparray[
'css'].
'"' :
'').($tmparray[
'mime'] ?
' mime="'.$tmparray[
'mime'].
'"' :
'').($tmparray[
'target'] ?
' target="'.$tmparray[
'target'].
'"' :
'').
'>';
1069 $tmpout .=
'<i class="fa fa-search-plus paddingright" style="color: gray"></i>';
1070 $tmpout .= $langs->trans(
"Preview").
' '.$ext.
'</a></li>';
1075 $tmpout .=
'<li class="nowrap"><a class="pictopreview nowrap" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&entity='.$entity.
'&file='.urlencode($relativepath).
'"';
1077 if (preg_match(
'/text/', $mime)) {
1078 $tmpout .=
' target="_blank" rel="noopener noreferrer"';
1081 $tmpout .=
img_mime($relativepath, $file[
"name"]);
1082 $tmpout .= $langs->trans(
"Download").
' '.$ext;
1083 $tmpout .=
'</a></li>'.
"\n";
1086 $out .=
'</ul></div></dd>
1135 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 =
'')
1138 global $user, $conf, $langs, $hookmanager,
$form;
1139 global $sortfield, $sortorder, $maxheightmini;
1140 global $dolibarr_main_url_root;
1142 if ($disablecrop == -1) {
1145 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'))) {
1151 if (empty($relativepath)) {
1153 if (!empty($object->element) && $object->element ==
'invoice_supplier') {
1154 $relativepath =
get_exdir($object->id, 2, 0, 0, $object,
'invoice_supplier').$relativepath;
1156 if (!empty($object->element) && $object->element ==
'project_task') {
1157 $relativepath =
'Call_not_supported_._Call_function_using_a_defined_relative_path_.';
1161 if (
getDolGlobalInt(
'PRODUCT_USE_OLD_PATH_FOR_PHOTO') && $filearray[0][
'level1name'] ==
'photos') {
1162 $relativepath = preg_replace(
'/^.*\/produit\//',
'', $filearray[0][
'path']).
'/';
1168 $relativedir = preg_replace(
'/^'.preg_quote(DOL_DATA_ROOT,
'/').
'/',
'', $upload_dir);
1169 $relativedir = preg_replace(
'/^[\\/]/',
'', $relativedir);
1174 $hookmanager->initHooks(array(
'formfile'));
1175 $parameters = array(
1176 'filearray' => $filearray,
1177 'modulepart'=> $modulepart,
1179 'forcedownload' => $forcedownload,
1180 'relativepath' => $relativepath,
1181 'relativedir' => $relativedir,
1182 'permtodelete' => $permonobject,
1183 'useinecm' => $useinecm,
1184 'textifempty' => $textifempty,
1185 'maxlength' => $maxlength,
1189 $reshook = $hookmanager->executeHooks(
'showFilesList', $parameters, $object);
1191 if (!empty($reshook)) {
1194 if (!is_object(
$form)) {
1195 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.form.class.php';
1199 if (!preg_match(
'/&id=/', $param) && isset($object->id)) {
1200 $param .=
'&id='.$object->id;
1202 $relativepathwihtoutslashend = preg_replace(
'/\/$/',
'', $relativepath);
1203 if ($relativepathwihtoutslashend) {
1204 $param .=
'&file='.urlencode($relativepathwihtoutslashend);
1207 if ($permtoeditline < 0) {
1208 $permtoeditline = 0;
1209 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1211 $permtoeditline = 1;
1214 $permtoeditline = 1;
1218 if (empty($conf->global->MAIN_UPLOAD_DOC)) {
1219 $permtoeditline = 0;
1224 if ((empty($useinecm) || $useinecm == 6) && $title !=
'none') {
1225 print
load_fiche_titre($title ? $title : $langs->trans(
"AttachedFiles"),
'',
'file-upload', 0,
'',
'table-list-of-attached-files');
1228 $url = $_SERVER[
"PHP_SELF"];
1231 print
'<!-- html.formfile::list_of_documents -->'.
"\n";
1232 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1233 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'?'.$param.
'" method="POST">';
1234 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1235 print
'<input type="hidden" name="action" value="renamefile">';
1236 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
1237 print
'<input type="hidden" name="modulepart" value="'.$modulepart.
'">';
1240 print
'<div class="div-table-responsive-no-min"'.($moreattrondiv ?
' '.$moreattrondiv :
'').
'>';
1241 print
'<table id="tablelines" class="centpercent liste noborder nobottom">'.
"\n";
1243 if (!empty($addfilterfields)) {
1244 print
'<tr class="liste_titre nodrag nodrop">';
1245 print
'<td><input type="search_doc_ref" value="'.dol_escape_htmltag(
GETPOST(
'search_doc_ref',
'alpha')).
'"></td>';
1248 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1253 if (empty($disablemove) && count($filearray) > 1) {
1264 if ($sortfield && $sortorder) {
1269 print
'<tr class="liste_titre nodrag nodrop">';
1274 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1281 if (empty($disablemove) && count($filearray) > 1) {
1286 $nboffiles = count($filearray);
1287 if ($nboffiles > 0) {
1288 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
1294 foreach ($filearray as $key => $file) {
1295 if ($file[
'name'] !=
'.'
1296 && $file[
'name'] !=
'..'
1297 && !preg_match(
'/\.meta$/i', $file[
'name'])) {
1298 if (array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) {
1299 $lastrowid = $filearray[$key][
'rowid'];
1301 $filepath = $relativepath.$file[
'name'];
1305 print
'<!-- Line list_of_documents '.$key.
' relativepath = '.$relativepath.
' -->'.
"\n";
1308 print
'<!-- In database: position='.(array_key_exists(
'position', $filearray[$key]) ? $filearray[$key][
'position'] : 0).
' -->'.
"\n";
1309 print
'<tr class="oddeven" id="row-'.((array_key_exists(
'rowid', $filearray[$key]) && $filearray[$key][
'rowid'] > 0) ? $filearray[$key][
'rowid'] :
'AFTER'.$lastrowid.
'POS'.($i + 1)).
'">';
1313 print
'<td class="minwith200 tdoverflowmax500">';
1317 print
'<a class="paddingright valignmiddle" href="'.DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart;
1318 if ($forcedownload) {
1319 print
'&attachment=1';
1321 if (!empty($object->entity)) {
1322 print
'&entity='.$object->entity;
1324 print
'&file='.urlencode($filepath);
1326 print
img_mime($file[
'name'], $file[
'name'].
' ('.
dol_print_size($file[
'size'], 0, 0).
')',
'inline-block valignmiddle paddingright');
1327 if ($showrelpart == 1) {
1328 print $relativepath;
1331 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $file[
'name'] == basename(
GETPOST(
'urlfile',
'alpha'))) {
1333 $section_dir = dirname(
GETPOST(
'urlfile',
'alpha'));
1334 if (!preg_match(
'/\/$/', $section_dir)) {
1335 $section_dir .=
'/';
1337 print
'<input type="hidden" name="section_dir" value="'.$section_dir.
'">';
1338 print
'<input type="hidden" name="renamefilefrom" value="'.dol_escape_htmltag($file[
'name']).
'">';
1339 print
'<input type="text" name="renamefileto" class="quatrevingtpercent" value="'.dol_escape_htmltag($file[
'name']).
'">';
1342 $filenametoshow = preg_replace(
'/\.noexe$/',
'', $file[
'name']);
1348 print $this->
showPreview($file, $modulepart, $filepath, 0,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
1356 print
'<td class="right nowraponall">';
1357 if ($sizetoshow == $sizetoshowbytes) {
1360 print
$form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1365 print
'<td class="center nowraponall">'.dol_print_date($file[
'date'],
"dayhour",
"tzuser").
'</td>';
1368 if (empty($useinecm) || $useinecm == 4 || $useinecm == 5 || $useinecm == 6) {
1369 $fileinfo = pathinfo($file[
'name']);
1370 print
'<td class="center">';
1372 if ($useinecm == 5 || $useinecm == 6) {
1382 $urlforhref =
getAdvancedPreviewUrl($modulepart, $relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']), 1,
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity));
1383 if (empty($urlforhref)) {
1384 $urlforhref = DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).
'&file='.urlencode($relativepath.$fileinfo[
'filename'].
'.'.strtolower($fileinfo[
'extension']));
1385 print
'<a href="'.$urlforhref.
'" class="aphoto" target="_blank" rel="noopener noreferrer">';
1387 print
'<a href="'.$urlforhref[
'url'].
'" class="'.$urlforhref[
'css'].
'" target="'.$urlforhref[
'target'].
'" mime="'.$urlforhref[
'mime'].
'">';
1389 print
'<img class="photo maxwidth200 shadow valignmiddle" height="'.(($useinecm == 4 || $useinecm == 5 || $useinecm == 6) ?
'20' : $maxheightmini).
'" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart='.$modulepart.
'&entity='.(!empty($object->entity) ? $object->entity : $conf->entity).
'&file='.urlencode($relativepath.$smallfile).
'" title="">';
1398 print
'<td class="center">';
1399 if ($relativedir && $filearray[$key][
'rowid'] > 0) {
1401 print
'<label for="idshareenabled'.$key.
'">'.$langs->trans(
"FileSharedViaALink").
'</label> ';
1402 print
'<input class="inline-block" type="checkbox" id="idshareenabled'.$key.
'" name="shareenabled"'.($file[
'share'] ?
' checked="checked"' :
'').
' /> ';
1404 if ($file[
'share']) {
1406 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
1407 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1413 if (!empty($file[
'share'])) {
1414 $paramlink .= ($paramlink ?
'&' :
'').
'hashp='.$file[
'share'];
1416 if ($forcedownload) {
1417 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1420 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1422 print
'<a href="'.$fulllink.
'" target="_blank" rel="noopener">'.
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
'</a> ';
1423 print
'<input type="text" class="quatrevingtpercent minwidth200imp nopadding small" id="downloadlink'.$filearray[$key][
'rowid'].
'" name="downloadexternallink" title="'.
dol_escape_htmltag($langs->trans(
"FileSharedViaALink")).
'" value="'.
dol_escape_htmltag($fulllink).
'">';
1435 print
'<td class="valignmiddle right actionbuttons nowraponall"><!-- action on files -->';
1436 if ($useinecm == 1 || $useinecm == 5) {
1438 $newparam = preg_replace(
'/&file=.*$/',
'', $param);
1439 $backtopage = DOL_URL_ROOT.
'/ecm/index.php?§ion_dir='.urlencode($relativepath).$newparam;
1440 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>';
1443 if (empty($useinecm) || $useinecm == 2 || $useinecm == 6) {
1444 $newmodulepart = $modulepart;
1445 if (in_array($modulepart, array(
'product',
'produit',
'service'))) {
1446 $newmodulepart =
'produit|service';
1449 if ($permtoeditline) {
1450 $moreparaminurl =
'';
1451 if (!empty($object->id) && $object->id > 0) {
1452 $moreparaminurl .=
'&id='.$object->id;
1453 } elseif (
GETPOST(
'website',
'alpha')) {
1454 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1457 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1458 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1461 if (!preg_match(
'/\.webp$/i', $file[
'name'])) {
1462 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1463 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>';
1464 } elseif ($modulepart ==
'medias' &&
GETPOST(
'website')) {
1465 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>';
1471 if ($permtoeditline) {
1473 $moreparaminurl =
'';
1474 if (!empty($object->id) && $object->id > 0) {
1475 $moreparaminurl .=
'&id='.$object->id;
1476 } elseif (
GETPOST(
'website',
'alpha')) {
1477 $moreparaminurl .=
'&website='.GETPOST(
'website',
'alpha');
1480 if ($modulepart ==
'medias' && !
GETPOST(
'website')) {
1481 $moreparaminurl .=
'&backtourl='.urlencode(DOL_URL_ROOT.
'/ecm/index_medias.php?file_manager=1&modulepart='.$modulepart.
'§ion_dir='.$relativepath);
1484 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>';
1488 if ($permtoeditline) {
1489 $paramsectiondir = (in_array($modulepart, array(
'medias',
'ecm')) ?
'§ion_dir='.urlencode($relativepath) :
'');
1490 print
'<a class="editfielda reposition editfilelink" href="'.(($useinecm == 1 || $useinecm == 5) ?
'#' : ($url.
'?action=editfile&token='.
newToken().
'&urlfile='.urlencode($filepath).$paramsectiondir.$param)).
'" rel="'.$filepath.
'">'.
img_edit(
'default', 0,
'class="paddingrightonly"').
'</a>';
1494 if ($permonobject) {
1496 if (!empty($conf->dol_use_jmobile)) {
1499 if (empty($conf->use_javascript_ajax)) {
1502 if (!empty($conf->global->MAIN_ECM_DISABLE_JS)) {
1505 print
'<a href="'.((($useinecm && $useinecm != 6) && $useajax) ?
'#' : ($url.
'?action=deletefile&token='.
newToken().
'&urlfile='.urlencode($filepath).$param)).
'" class="reposition deletefilelink" rel="'.$filepath.
'">'.
img_delete().
'</a>';
1509 if (empty($disablemove) && count($filearray) > 1) {
1510 if ($nboffiles > 1 && $conf->browser->layout !=
'phone') {
1511 print
'<td class="linecolmove tdlineupdown center">';
1513 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=up&rowid='.$object->id.
'">'.
img_up(
'default', 0,
'imgupforline').
'</a>';
1515 if ($i < ($nboffiles - 1)) {
1516 print
'<a class="lineupdown" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=down&rowid='.$object->id.
'">'.
img_down(
'default', 0,
'imgdownforline').
'</a>';
1520 print
'<td'.(($conf->browser->layout !=
'phone') ?
' class="linecolmove tdlineupdown center"' :
' class="linecolmove center"').
'>';
1525 print
'<td class="right">';
1526 print
'<input type="hidden" name="ecmfileid" value="'.$filearray[$key][
'rowid'].
'">';
1527 print
'<input type="submit" class="button button-save smallpaddingimp" name="renamefilesave" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'">';
1528 print
'<input type="submit" class="button button-cancel smallpaddingimp" name="cancel" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'">';
1530 if (empty($disablemove) && count($filearray) > 1) {
1531 print
'<td class="right"></td>';
1539 if ($nboffiles == 0) {
1541 if (empty($disablemove) && count($filearray) > 1) {
1544 print
'<tr class="oddeven"><td colspan="'.$colspan.
'">';
1545 if (empty($textifempty)) {
1546 print
'<span class="opacitymedium">'.$langs->trans(
"NoFileFound").
'</span>';
1548 print
'<span class="opacitymedium">'.$textifempty.
'</span>';
1556 if ($nboflines > 1 && is_object($object)) {
1557 if (!empty($conf->use_javascript_ajax) && $permtoeditline) {
1558 $table_element_line =
'ecm_files';
1559 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
1565 if (
GETPOST(
'action',
'aZ09') ==
'editfile' && $permtoeditline) {
1593 public function list_of_autoecmfiles($upload_dir, $filearray, $modulepart, $param, $forcedownload = 0, $relativepath =
'', $permissiontodelete = 1, $useinecm = 0, $textifempty =
'', $maxlength = 0, $url =
'', $addfilterfields = 0)
1596 global $user, $conf, $langs, $hookmanager,
$form;
1597 global $sortfield, $sortorder;
1598 global $search_doc_ref;
1599 global $dolibarr_main_url_root;
1601 dol_syslog(get_class($this).
'::list_of_autoecmfiles upload_dir='.$upload_dir.
' modulepart='.$modulepart);
1604 if (empty($useinecm) || $useinecm == 6) {
1608 $url = $_SERVER[
"PHP_SELF"];
1611 if (!empty($addfilterfields)) {
1612 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'">';
1613 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1614 print
'<input type="hidden" name="module" value="'.$modulepart.
'">';
1617 print
'<div class="div-table-responsive-no-min">';
1618 print
'<table width="100%" class="noborder">'.
"\n";
1620 if (!empty($addfilterfields)) {
1621 print
'<tr class="liste_titre nodrag nodrop">';
1622 print
'<td class="liste_titre"></td>';
1623 print
'<td class="liste_titre"><input type="text" class="maxwidth100onsmartphone" name="search_doc_ref" value="'.dol_escape_htmltag($search_doc_ref).
'"></td>';
1624 print
'<td class="liste_titre"></td>';
1625 print
'<td class="liste_titre"></td>';
1627 print
'<td class="liste_titre right">';
1628 $searchpicto =
$form->showFilterButtons();
1634 print
'<tr class="liste_titre">';
1635 $sortref =
"fullname";
1636 if ($modulepart ==
'invoice_supplier') {
1637 $sortref =
'level1name';
1647 $object_instance =
null;
1648 if ($modulepart ==
'company') {
1649 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
1650 $object_instance =
new Societe($this->db);
1651 } elseif ($modulepart ==
'invoice') {
1652 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
1653 $object_instance =
new Facture($this->db);
1654 } elseif ($modulepart ==
'invoice_supplier') {
1655 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
1657 } elseif ($modulepart ==
'propal') {
1658 include_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
1659 $object_instance =
new Propal($this->db);
1660 } elseif ($modulepart ==
'supplier_proposal') {
1661 include_once DOL_DOCUMENT_ROOT.
'/supplier_proposal/class/supplier_proposal.class.php';
1663 } elseif ($modulepart ==
'order') {
1664 include_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
1665 $object_instance =
new Commande($this->db);
1666 } elseif ($modulepart ==
'order_supplier') {
1667 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
1669 } elseif ($modulepart ==
'contract') {
1670 include_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
1671 $object_instance =
new Contrat($this->db);
1672 } elseif ($modulepart ==
'product') {
1673 include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
1674 $object_instance =
new Product($this->db);
1675 } elseif ($modulepart ==
'tax') {
1676 include_once DOL_DOCUMENT_ROOT.
'/compta/sociales/class/chargesociales.class.php';
1678 } elseif ($modulepart ==
'tax-vat') {
1679 include_once DOL_DOCUMENT_ROOT.
'/compta/tva/class/tva.class.php';
1680 $object_instance =
new Tva($this->db);
1681 } elseif ($modulepart ==
'salaries') {
1682 include_once DOL_DOCUMENT_ROOT.
'/salaries/class/salary.class.php';
1683 $object_instance =
new Salary($this->db);
1684 } elseif ($modulepart ==
'project') {
1685 include_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
1686 $object_instance =
new Project($this->db);
1687 } elseif ($modulepart ==
'project_task') {
1688 include_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
1689 $object_instance =
new Task($this->db);
1690 } elseif ($modulepart ==
'fichinter') {
1691 include_once DOL_DOCUMENT_ROOT.
'/fichinter/class/fichinter.class.php';
1692 $object_instance =
new Fichinter($this->db);
1693 } elseif ($modulepart ==
'user') {
1694 include_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
1695 $object_instance =
new User($this->db);
1696 } elseif ($modulepart ==
'expensereport') {
1697 include_once DOL_DOCUMENT_ROOT.
'/expensereport/class/expensereport.class.php';
1699 } elseif ($modulepart ==
'holiday') {
1700 include_once DOL_DOCUMENT_ROOT.
'/holiday/class/holiday.class.php';
1701 $object_instance =
new Holiday($this->db);
1702 } elseif ($modulepart ==
'recruitment-recruitmentcandidature') {
1703 include_once DOL_DOCUMENT_ROOT.
'/recruitment/class/recruitmentcandidature.class.php';
1705 } elseif ($modulepart ==
'banque') {
1706 include_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
1707 $object_instance =
new Account($this->db);
1708 } elseif ($modulepart ==
'chequereceipt') {
1709 include_once DOL_DOCUMENT_ROOT.
'/compta/paiement/cheque/class/remisecheque.class.php';
1711 } elseif ($modulepart ==
'mrp-mo') {
1712 include_once DOL_DOCUMENT_ROOT.
'/mrp/class/mo.class.php';
1713 $object_instance =
new Mo($this->db);
1715 $parameters = array(
'modulepart'=>$modulepart);
1716 $reshook = $hookmanager->executeHooks(
'addSectionECMAuto', $parameters);
1717 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
1718 if (array_key_exists(
'classpath', $hookmanager->resArray) && !empty($hookmanager->resArray[
'classpath'])) {
1720 if (array_key_exists(
'classname', $hookmanager->resArray) && !empty($hookmanager->resArray[
'classname'])) {
1721 if (class_exists($hookmanager->resArray[
'classname'])) {
1722 $tmpclassname = $hookmanager->resArray[
'classname'];
1723 $object_instance =
new $tmpclassname($this->db);
1734 $relativepathfromroot = preg_replace(
'/'.preg_quote(DOL_DATA_ROOT.
'/',
'/').
'/',
'', $upload_dir);
1735 if ($relativepathfromroot) {
1739 if ($sortfield && $sortorder) {
1740 $filearray =
dol_sort_array($filearray, $sortfield, $sortorder, 1);
1746 foreach ($filearray as $key => $file) {
1747 if (!is_dir($file[
'name'])
1748 && $file[
'name'] !=
'.'
1749 && $file[
'name'] !=
'..'
1750 && $file[
'name'] !=
'CVS'
1751 && !preg_match(
'/\.meta$/i', $file[
'name'])) {
1753 $relativefile = preg_replace(
'/'.preg_quote($upload_dir.
'/',
'/').
'/',
'', $file[
'fullname']);
1761 if ($modulepart ==
'company' || $modulepart ==
'tax' || $modulepart ==
'tax-vat' || $modulepart ==
'salaries') {
1762 preg_match(
'/(\d+)\/[^\/]+$/', $relativefile, $reg);
1763 $id = (isset($reg[1]) ? $reg[1] :
'');
1764 } elseif ($modulepart ==
'invoice_supplier') {
1765 preg_match(
'/([^\/]+)\/[^\/]+$/', $relativefile, $reg);
1766 $ref = (isset($reg[1]) ? $reg[1] :
'');
1767 if (is_numeric($ref)) {
1771 } elseif ($modulepart ==
'user') {
1773 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1774 $id = (isset($reg[1]) ? $reg[1] :
'');
1775 } elseif ($modulepart ==
'project_task') {
1777 $reg = explode(
"/", $relativefile);
1778 $ref = (isset($reg[1]) ? $reg[1] :
'');
1779 } elseif (in_array($modulepart, array(
1782 'supplier_proposal',
1791 'recruitment-recruitmentcandidature',
1796 preg_match(
'/(.*)\/[^\/]+$/', $relativefile, $reg);
1797 $ref = (isset($reg[1]) ? $reg[1] :
'');
1799 $parameters = array(
'modulepart'=>$modulepart,
'fileinfo'=>$file);
1800 $reshook = $hookmanager->executeHooks(
'addSectionECMAuto', $parameters);
1801 if ($reshook > 0 && is_array($hookmanager->resArray) && count($hookmanager->resArray) > 0) {
1802 if (array_key_exists(
'ref', $hookmanager->resArray) && !empty($hookmanager->resArray[
'ref'])) {
1803 $ref = $hookmanager->resArray[
'ref'];
1805 if (array_key_exists(
'id', $hookmanager->resArray) && !empty($hookmanager->resArray[
'id'])) {
1806 $id = $hookmanager->resArray[
'id'];
1812 if (!$id && !$ref) {
1817 if (!empty($this->cache_objects[$modulepart.
'_'.$id.
'_'.$ref])) {
1823 if (is_object($object_instance)) {
1824 $object_instance->id = 0;
1825 $object_instance->ref =
'';
1827 $result = $object_instance->fetch($id);
1829 if (!($result = $object_instance->fetch(
'', $ref))) {
1835 $result = $object_instance->fetchOneLike($ref);
1842 $this->cache_objects[$modulepart.
'_'.$id.
'_'.$ref] = clone $object_instance;
1846 $this->cache_objects[$modulepart.
'_'.$id.
'_'.$ref] =
'notfound';
1847 unset($filearray[$key]);
1851 if ($found <= 0 || !is_object($this->cache_objects[$modulepart.
'_'.$id.
'_'.$ref])) {
1855 print
'<!-- Line list_of_autoecmfiles key='.$key.
' -->'.
"\n";
1856 print
'<tr class="oddeven">';
1858 if ($found > 0 && is_object($this->cache_objects[$modulepart.
'_'.$id.
'_'.$ref])) {
1859 $tmpobject = $this->cache_objects[$modulepart.
'_'.$id.
'_'.$ref];
1861 print $tmpobject->getNomUrl(1,
'document');
1866 print $langs->trans(
"ObjectDeleted", ($id ? $id : $ref));
1882 print
'<a href="'.DOL_URL_ROOT.
'/document.php?modulepart='.urlencode($modulepart);
1883 if ($forcedownload) {
1884 print
'&attachment=1';
1886 print
'&file='.urlencode($relativefile).
'">';
1888 print
dol_trunc($file[
'name'], $maxlength,
'middle');
1893 print $this->
showPreview($file, $modulepart, $file[
'relativename']);
1900 print
'<td class="right nowraponall">';
1901 if ($sizetoshow == $sizetoshowbytes) {
1904 print
$form->textwithpicto($sizetoshow, $sizetoshowbytes, -1);
1909 print
'<td class="center">'.dol_print_date($file[
'date'],
"dayhour").
'</td>';
1912 print
'<td class="right">';
1913 if (!empty($file[
'share'])) {
1915 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
1916 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1922 if (!empty($file[
'share'])) {
1923 $paramlink .= ($paramlink ?
'&' :
'').
'hashp='.$file[
'share'];
1925 if ($forcedownload) {
1926 $paramlink .= ($paramlink ?
'&' :
'').
'attachment=1';
1929 $fulllink = $urlwithroot.
'/document.php'.($paramlink ?
'?'.$paramlink :
'');
1931 print
img_picto($langs->trans(
"FileSharedViaALink"),
'globe').
' ';
1932 print
'<input type="text" class="quatrevingtpercent width100 nopadding nopadding small" id="downloadlink" name="downloadexternallink" value="'.dol_escape_htmltag($fulllink).
'">';
1946 if (count($filearray) == 0) {
1947 print
'<tr class="oddeven"><td colspan="5">';
1948 if (empty($textifempty)) {
1949 print
'<span class="opacitymedium">'.$langs->trans(
"NoFileFound").
'</span>';
1951 print
'<span class="opacitymedium">'.$textifempty.
'</span>';
1958 if (!empty($addfilterfields)) {
1961 return count($filearray);
1975 public function listOfLinks($object, $permissiontodelete = 1, $action =
null, $selected =
null, $param =
'')
1977 global $user, $conf, $langs, $user;
1978 global $sortfield, $sortorder;
1980 $langs->load(
"link");
1982 require_once DOL_DOCUMENT_ROOT.
'/core/class/link.class.php';
1983 $link =
new Link($this->db);
1985 if ($sortfield ==
"name") {
1986 $sortfield =
"label";
1987 } elseif ($sortfield ==
"date") {
1988 $sortfield =
"datea";
1992 $res = $link->fetchAll($links, $object->element, $object->id, $sortfield, $sortorder);
1993 $param .= (isset($object->id) ?
'&id='.$object->id :
'');
1995 print
'<!-- listOfLinks -->'.
"\n";
1998 print
load_fiche_titre($langs->trans(
"LinkedFiles"),
'',
'link', 0,
'',
'table-list-of-links');
2000 print
'<form action="'.$_SERVER[
'PHP_SELF'].($param ?
'?'.$param :
'').
'" method="POST">';
2001 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2003 print
'<table class="liste noborder nobottom centpercent">';
2004 print
'<tr class="liste_titre">';
2006 $langs->trans(
"Links"),
2007 $_SERVER[
'PHP_SELF'],
2028 $langs->trans(
"Date"),
2029 $_SERVER[
'PHP_SELF'],
2040 $_SERVER[
'PHP_SELF'],
2051 $nboflinks = count($links);
2052 if ($nboflinks > 0) {
2053 include_once DOL_DOCUMENT_ROOT.
'/core/lib/images.lib.php';
2056 foreach ($links as $link) {
2057 print
'<tr class="oddeven">';
2059 if ($action ==
'update' && $selected === $link->id) {
2061 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2062 print
'<input type="hidden" name="linkid" value="'.$link->id.
'">';
2063 print
'<input type="hidden" name="action" value="confirm_updateline">';
2064 print $langs->trans(
'Link').
': <input type="text" name="link" value="'.$link->url.
'">';
2067 print $langs->trans(
'Label').
': <input type="text" name="label" value="'.
dol_escape_htmltag($link->label).
'">';
2069 print
'<td class="center">'.dol_print_date(
dol_now(),
"dayhour",
"tzuser").
'</td>';
2070 print
'<td class="right"></td>';
2071 print
'<td class="right">';
2072 print
'<input type="submit" class="button button-save" name="save" value="'.dol_escape_htmltag($langs->trans(
"Save")).
'">';
2073 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.dol_escape_htmltag($langs->trans(
"Cancel")).
'">';
2078 print
'<a data-ajax="false" href="'.$link->url.
'" target="_blank" rel="noopener noreferrer">';
2082 print
'<td class="right"></td>';
2083 print
'<td class="center">'.dol_print_date($link->datea,
"dayhour",
"tzuser").
'</td>';
2084 print
'<td class="center"></td>';
2085 print
'<td class="right">';
2086 print
'<a href="'.$_SERVER[
'PHP_SELF'].
'?action=update&linkid='.$link->id.$param.
'&token='.
newToken().
'" class="editfilelink editfielda reposition" >'.
img_edit().
'</a>';
2087 if ($permissiontodelete) {
2088 print
' <a class="deletefilelink reposition" href="'.$_SERVER[
'PHP_SELF'].
'?action=deletelink&token='.
newToken().
'&linkid='.((int) $link->id).$param.
'">'.
img_delete().
'</a>';
2096 if ($nboflinks == 0) {
2097 print
'<tr class="oddeven"><td colspan="5">';
2098 print
'<span class="opacitymedium">'.$langs->trans(
"NoLinkFound").
'</span>';
2119 public function showPreview($file, $modulepart, $relativepath, $ruleforpicto = 0, $param =
'')
2121 global $langs, $conf;
2124 if ($conf->browser->layout !=
'phone' && !empty($conf->use_javascript_ajax)) {
2126 if (count($urladvancedpreview)) {
2127 $out .=
'<a class="pictopreview '.$urladvancedpreview[
'css'].
'" href="'.$urladvancedpreview[
'url'].
'"'.(empty($urladvancedpreview[
'mime']) ?
'' :
' mime="'.$urladvancedpreview[
'mime'].
'"').
' '.(empty($urladvancedpreview[
'target']) ?
'' :
' target="'.$urladvancedpreview[
'target'].
'"').
'>';
2129 if (empty($ruleforpicto)) {
2131 $out .=
'<span class="fa fa-search-plus pictofixedwidth" style="color: gray"></span>';
2133 $out .=
img_mime($relativepath, $langs->trans(
'Preview').
' '.$file[
'name'],
'pictofixedwidth');
2137 if ($ruleforpicto < 0) {
2138 $out .=
img_picto(
'',
'generic',
'',
false, 0, 0,
'',
'paddingright pictofixedwidth');