$original_file_osencoded = dol_osencode($original_file); // New file name encoded in OS encoding charset // This test if file exists should be useless. We keep it to find bug more easily if (!file_exists($original_file_osencoded)) { dol_print_error(0, $langs->trans("ErrorFileDoesNotExists", $original_file)); exit; } // Permissions are ok and file found, so we return it header('Content-Description: File Transfer'); if ($encoding) { header('Content-Encoding: ' . $encoding); } if ($type) { header('Content-Type: ' . $type . (preg_match('/text/', $type) ? '; charset="' . $conf->file->character_set_client : '')); } // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, atachment=need user action to open) if ($attachment) { header('Content-Disposition: attachment; filename="' . $filename . '"'); } else { header('Content-Disposition: inline; filename="' . $filename . '"'); } header('Content-Length: ' . dol_filesize($original_file)); // Ajout directives pour resoudre bug IE header('Cache-Control: Public, must-revalidate'); header('Pragma: public'); //ob_clean(); //flush(); readfile($original_file_osencoded); if (is_object($db)) { $db->close(); }
/** * Return a string to show the box with list of available documents for object. * This also set the property $this->numoffiles * * @param string $modulepart Module the files are related to ('propal', 'facture', 'facture_fourn', 'mymodule', 'mymodule_temp', ...) * @param string $modulesubdir Existing (so sanitized) sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if file is not into subdir of module. * @param string $filedir Directory to scan * @param string $urlsource Url of origin page (for return) * @param int $genallowed Generation is allowed (1/0 or array list of templates) * @param int $delallowed Remove is allowed (1/0) * @param string $modelselected Model to preselect by default * @param string $allowgenifempty Allow generation even if list of template ($genallowed) is empty (show however a warning) * @param string $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param int $iconPDF Deprecated, see getDocumentsLink * @param int $maxfilenamelength Max length for filename shown * @param string $noform Do not output html form tags * @param string $param More param on http links * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button * @param string $codelang Default language code to use on lang combo box if multilang is enabled * @param string $morepicto Add more HTML content into cell with picto * @return string Output string with HTML array of documents (might be empty string) */ function showdocuments($modulepart, $modulesubdir, $filedir, $urlsource, $genallowed, $delallowed = 0, $modelselected = '', $allowgenifempty = 1, $forcenomultilang = 0, $iconPDF = 0, $maxfilenamelength = 28, $noform = 0, $param = '', $title = '', $buttonlabel = '', $codelang = '', $morepicto = '') { // Deprecation warning if (0 !== $iconPDF) { dol_syslog(__METHOD__ . ": passing iconPDF parameter is deprecated", LOG_WARNING); } global $langs, $conf, $user, $hookmanager; global $form, $bc; if (!is_object($form)) { $form = new Form($this->db); } include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; // For backward compatibility if (!empty($iconPDF)) { return $this->getDocumentsLink($modulepart, $modulesubdir, $filedir); } $printer = 0; if (in_array($modulepart, array('facture', 'supplier_proposal', 'propal', 'proposal', 'order', 'commande', 'expedition', 'commande_fournisseur'))) { $printer = !empty($user->rights->printing->read) && !empty($conf->printing->enabled) ? true : false; } $hookmanager->initHooks(array('formfile')); $forname = 'builddoc'; $out = ''; $var = true; $headershown = 0; $showempty = 0; $i = 0; $titletoshow = $langs->trans("Documents"); if (!empty($title)) { $titletoshow = $title; } $out .= "\n" . '<!-- Start show_document -->' . "\n"; //print 'filedir='.$filedir; // Show table if ($genallowed) { $modellist = array(); if ($modulepart == 'company') { $showempty = 1; if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/societe/modules_societe.class.php'; $modellist = ModeleThirdPartyDoc::liste_modeles($this->db); } } else { if ($modulepart == 'propal') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/propale/modules_propale.php'; $modellist = ModelePDFPropales::liste_modeles($this->db); } } else { if ($modulepart == 'supplier_proposal') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/supplier_proposal/modules_supplier_proposal.php'; $modellist = ModelePDFSupplierProposal::liste_modeles($this->db); } } else { if ($modulepart == 'commande') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/commande/modules_commande.php'; $modellist = ModelePDFCommandes::liste_modeles($this->db); } } elseif ($modulepart == 'expedition') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/expedition/modules_expedition.php'; $modellist = ModelePDFExpedition::liste_modeles($this->db); } } elseif ($modulepart == 'livraison') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/livraison/modules_livraison.php'; $modellist = ModelePDFDeliveryOrder::liste_modeles($this->db); } } else { if ($modulepart == 'ficheinter') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/fichinter/modules_fichinter.php'; $modellist = ModelePDFFicheinter::liste_modeles($this->db); } } elseif ($modulepart == 'facture') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/facture/modules_facture.php'; $modellist = ModelePDFFactures::liste_modeles($this->db); } } elseif ($modulepart == 'contract') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/contract/modules_contract.php'; $modellist = ModelePDFContract::liste_modeles($this->db); } } elseif ($modulepart == 'project') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/project/modules_project.php'; $modellist = ModelePDFProjects::liste_modeles($this->db); } } elseif ($modulepart == 'project_task') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/project/task/modules_task.php'; $modellist = ModelePDFTask::liste_modeles($this->db); } } elseif ($modulepart == 'export') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/export/modules_export.php'; $modellist = ModeleExports::liste_modeles($this->db); } } else { if ($modulepart == 'commande_fournisseur') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/supplier_order/modules_commandefournisseur.php'; $modellist = ModelePDFSuppliersOrders::liste_modeles($this->db); } } else { if ($modulepart == 'facture_fournisseur') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/supplier_invoice/modules_facturefournisseur.php'; $modellist = ModelePDFSuppliersInvoices::liste_modeles($this->db); } } else { if ($modulepart == 'remisecheque') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/cheque/pdf/modules_chequereceipts.php'; $modellist = ModeleChequeReceipts::liste_modeles($this->db); } } elseif ($modulepart == 'donation') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/dons/modules_don.php'; $modellist = ModeleDon::liste_modeles($this->db); } } else { if ($modulepart == 'unpaid') { $modellist = ''; } else { if ($modulepart != 'agenda') { // For normalized standard modules $file = dol_buildpath('/core/modules/' . $modulepart . '/modules_' . $modulepart . '.php', 0); if (file_exists($file)) { $res = (include_once $file); } else { $file = dol_buildpath('/' . $modulepart . '/core/modules/' . $modulepart . '/modules_' . $modulepart . '.php', 0); $res = (include_once $file); } $class = 'Modele' . ucfirst($modulepart); if (class_exists($class)) { $modellist = call_user_func($class . '::liste_modeles', $this->db); } else { dol_print_error($this->db, 'Bad value for modulepart'); return -1; } } } } } } } } } } } $headershown = 1; $buttonlabeltoshow = $buttonlabel; if (empty($buttonlabel)) { $buttonlabel = $langs->trans('Generate'); } if (empty($noform)) { $out .= '<form action="' . $urlsource . (empty($conf->global->MAIN_JUMP_TAG) ? '' : '#builddoc') . '" name="' . $forname . '" id="' . $forname . '_form" method="post">'; } $out .= '<input type="hidden" name="action" value="builddoc">'; $out .= '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">'; $out .= load_fiche_titre($titletoshow, '', ''); $out .= '<table class="liste formdoc noborder" summary="listofdocumentstable" width="100%">'; $out .= '<tr class="liste_titre">'; // Model if (!empty($modellist)) { $out .= '<th align="center" class="formdoc liste_titre maxwidthonsmartphone">'; $out .= '<span class="hideonsmartphone">' . $langs->trans('Model') . ' </span>'; if (is_array($modellist) && count($modellist) == 1) { $arraykeys = array_keys($modellist); $modelselected = $arraykeys[0]; } $out .= $form->selectarray('model', $modellist, $modelselected, $showempty, 0, 0, '', 0, 0, 0, '', ''); $out .= '</th>'; } else { $out .= '<th align="left" class="formdoc liste_titre">'; $out .= $langs->trans("Files"); $out .= '</th>'; } // Language code (if multilang) $out .= '<th align="center" class="formdoc liste_titre maxwidthonsmartphone">'; if (($allowgenifempty || is_array($modellist) && count($modellist) > 0) && $conf->global->MAIN_MULTILANGS && !$forcenomultilang && (!empty($modellist) || $showempty)) { include_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php'; $formadmin = new FormAdmin($this->db); $defaultlang = $codelang ? $codelang : $langs->getDefaultLang(); $morecss = 'maxwidth150'; if (!empty($conf->browser->phone)) { $morecss = 'maxwidth100'; } $out .= $formadmin->select_language($defaultlang, 'lang_id', 0, 0, 0, 0, 0, $morecss); } else { $out .= ' '; } $out .= '</th>'; // Button $addcolumforpicto = $delallowed || $printer || $morepicto; $out .= '<th align="center" colspan="' . ($addcolumforpicto ? '2' : '1') . '" class="formdocbutton liste_titre maxwidthonsmartphone">'; $genbutton = '<input class="button" id="' . $forname . '_generatebutton" name="' . $forname . '_generatebutton"'; $genbutton .= ' type="submit" value="' . $buttonlabel . '"'; if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) { $genbutton .= ' disabled'; } $genbutton .= '>'; if ($allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') { $langs->load("errors"); $genbutton .= ' ' . img_warning($langs->transnoentitiesnoconv("WarningNoDocumentModelActivated")); } if (!$allowgenifempty && !is_array($modellist) && empty($modellist) && empty($conf->dol_no_mouse_hover) && $modulepart != 'unpaid') { $genbutton = ''; } if (empty($modellist) && !$showempty && $modulepart != 'unpaid') { $genbutton = ''; } $out .= $genbutton; $out .= '</th>'; if (!empty($hookmanager->hooks['formfile'])) { foreach ($hookmanager->hooks['formfile'] as $module) { if (method_exists($module, 'formBuilddocLineOptions')) { $out .= '<th></th>'; } } } $out .= '</tr>'; // Execute hooks $parameters = array('socid' => isset($GLOBALS['socid']) ? $GLOBALS['socid'] : '', 'id' => isset($GLOBALS['id']) ? $GLOBALS['id'] : '', 'modulepart' => $modulepart); if (is_object($hookmanager)) { $reshook = $hookmanager->executeHooks('formBuilddocOptions', $parameters, $GLOBALS['object']); $out .= $hookmanager->resPrint; } } // Get list of files if (!empty($filedir)) { $file_list = dol_dir_list($filedir, 'files', 0, '', '(\\.meta|_preview\\.png)$', 'date', SORT_DESC); // Affiche en-tete tableau si non deja affiche if (!empty($file_list) && !$headershown) { $headershown = 1; $out .= '<div class="titre">' . $titletoshow . '</div>'; $out .= '<table class="border" summary="listofdocumentstable" width="100%">'; } // Loop on each file found if (is_array($file_list)) { foreach ($file_list as $file) { $var = !$var; // Define relative path for download link (depends on module) $relativepath = $file["name"]; // Cas general if ($modulesubdir) { $relativepath = $modulesubdir . "/" . $file["name"]; } // Cas propal, facture... if ($modulepart == 'export') { $relativepath = $file["name"]; } // Other case $out .= "<tr " . $bc[$var] . ">"; $documenturl = DOL_URL_ROOT . '/document.php'; if (isset($conf->global->DOL_URL_ROOT_DOCUMENT_PHP)) { $documenturl = $conf->global->DOL_URL_ROOT_DOCUMENT_PHP; } // Show file name with link to download $out .= '<td class="nowrap">'; $out .= '<a data-ajax="false" href="' . $documenturl . '?modulepart=' . $modulepart . '&file=' . urlencode($relativepath) . '"'; $mime = dol_mimetype($relativepath, '', 0); if (preg_match('/text/', $mime)) { $out .= ' target="_blank"'; } $out .= ' target="_blank">'; $out .= img_mime($file["name"], $langs->trans("File") . ': ' . $file["name"]) . ' ' . dol_trunc($file["name"], $maxfilenamelength); $out .= '</a>' . "\n"; $out .= '</td>'; // Show file size $size = !empty($file['size']) ? $file['size'] : dol_filesize($filedir . "/" . $file["name"]); $out .= '<td align="right" class="nowrap">' . dol_print_size($size) . '</td>'; // Show file date $date = !empty($file['date']) ? $file['date'] : dol_filemtime($filedir . "/" . $file["name"]); $out .= '<td align="right" class="nowrap">' . dol_print_date($date, 'dayhour', 'tzuser') . '</td>'; if ($delallowed || $printer || $morepicto) { $out .= '<td align="right">'; if ($delallowed) { $out .= '<a href="' . $urlsource . (strpos($urlsource, '?') ? '&' : '?') . 'action=remove_file&file=' . urlencode($relativepath); $out .= $param ? '&' . $param : ''; //$out.= '&modulepart='.$modulepart; // TODO obsolete ? //$out.= '&urlsource='.urlencode($urlsource); // TODO obsolete ? $out .= '">' . img_picto($langs->trans("Delete"), 'delete.png') . '</a>'; //$out.='</td>'; } if ($printer) { //$out.= '<td align="right">'; $out .= ' <a href="' . $urlsource . (strpos($urlsource, '?') ? '&' : '?') . 'action=print_file&printer=' . $modulepart . '&file=' . urlencode($relativepath); $out .= $param ? '&' . $param : ''; $out .= '">' . img_picto($langs->trans("PrintFile", $relativepath), 'printer.png') . '</a>'; } if ($morepicto) { $morepicto = preg_replace('/__FILENAMEURLENCODED__/', urlencode($relativepath), $morepicto); $out .= $morepicto; } $out .= '</td>'; } if (is_object($hookmanager)) { $parameters = array('socid' => isset($GLOBALS['socid']) ? $GLOBALS['socid'] : '', 'id' => isset($GLOBALS['id']) ? $GLOBALS['id'] : '', 'modulepart' => $modulepart, 'relativepath' => $relativepath); $res = $hookmanager->executeHooks('formBuilddocLineOptions', $parameters, $file); if (empty($res)) { $out .= $hookmanager->resPrint; // Complete line $out .= '</tr>'; } else { $out = $hookmanager->resPrint; } // Replace line } } if (count($file_list) == 0 && $headershown) { $out .= '<tr ' . $bc[0] . '><td colspan="3">' . $langs->trans("None") . '</td></tr>'; } $this->numoffiles++; } } if ($headershown) { // Affiche pied du tableau $out .= "</table>\n"; if ($genallowed) { if (empty($noform)) { $out .= '</form>' . "\n"; } } } $out .= '<!-- End show_document -->' . "\n"; //return ($i?$i:$headershown); return $out; }
$obj = $db->fetch_object($resql); if ($obj) { $var = !$var; print "<tr " . $bc[$var] . ">"; print "<td>" . $obj->df . "</td>\n"; print '<td align="center">' . $obj->cc . '</td>'; print '<td align="center">'; print '<a href="' . $_SERVER["PHP_SELF"] . '?action=builddoc&page=' . $page . '&month=' . $obj->month . '&year=' . $obj->year . '">' . img_picto($langs->trans('GenerateReport'), 'filenew') . '</a>'; print '</td>'; $name = "actions-" . $obj->month . "-" . $obj->year . ".pdf"; $relativepath = $name; $file = $conf->agenda->dir_temp . "/" . $name; if (file_exists($file)) { print '<td align="center"><a data-ajax="false" href="' . DOL_URL_ROOT . '/document.php?page=' . $page . '&file=' . urlencode($relativepath) . '&modulepart=actionsreport">' . img_pdf() . '</a></td>'; print '<td align="center">' . dol_print_date(dol_filemtime($file), 'dayhour') . '</td>'; print '<td align="center">' . dol_print_size(dol_filesize($file)) . '</td>'; } else { print '<td> </td>'; print '<td> </td>'; print '<td> </td>'; } print "</tr>\n"; } $i++; } print "</table>"; $db->free($resql); } else { dol_print_error($db); } llxFooter();
$relativepathdetail = $objectref . '/' . $objectref . '-detail.pdf'; // Define path to preview pdf file (preview precompiled "file.ext" are "file.ext_preview.png") $fileimage = $file . '_preview.png'; // If PDF has 1 page $fileimagebis = $file . '_preview-0.pdf.png'; // If PDF has more than one page $relativepathimage = $relativepath . '_preview.png'; $var = true; // Si fichier PDF existe if (file_exists($file)) { $encfile = urlencode($file); print '<table class="nobordernopadding" width="100%">'; print '<tr class="liste_titre"><td colspan="4">' . $langs->trans("Documents") . '</td></tr>'; print '<tr ' . $bc[$var] . '><td>' . $langs->trans("Proposal") . ' PDF</td>'; print '<td><a data-ajax="false" href="' . DOL_URL_ROOT . '/document.php?modulepart=propal&file=' . urlencode($relativepath) . '">' . $object->ref . '.pdf</a></td>'; print '<td align="right">' . dol_print_size(dol_filesize($file)) . '</td>'; print '<td align="right">' . dol_print_date(dol_filemtime($file), 'dayhour') . '</td>'; print '</tr>'; print "</table>\n"; // Conversion du PDF en image png si fichier png non existant if (!file_exists($fileimage) && !file_exists($fileimagebis) || filemtime($fileimage) < filemtime($file)) { if (class_exists("Imagick")) { $ret = dol_convert_file($file, 'png', $fileimage); if ($ret < 0) { $error++; } } else { $langs->load("errors"); print '<font class="error">' . $langs->trans("ErrorNoImagickReadimage") . '</font>'; } }
} } // Construit liste des fichiers clearstatcache(); $totalsize = 0; $filearray = array(); $errorlevel = error_reporting(); error_reporting(0); $handle = opendir($upload_dir); error_reporting($errorlevel); if (is_resource($handle)) { $i = 0; while (($file = readdir($handle)) !== false) { if (!is_dir($dir . $file) && substr($file, 0, 1) != '.' && substr($file, 0, 3) != 'CVS') { $filearray[$i]->name = $file; $filearray[$i]->size = dol_filesize($upload_dir . "/" . $file); $filearray[$i]->date = dol_filemtime($upload_dir . "/" . $file); $totalsize += $filearray[$i]->size; $i++; } } closedir($handle); } else { // print '<div class="error">'.$langs->trans("ErrorCanNotReadDir",$upload_dir).'</div>'; } /* print '<table class="border"width="100%">'; // Nbre fichiers print '<tr><td>'.$langs->trans("NbOfAttachedFiles").'</td><td colspan="3">'.count($filearray).'</td></tr>'; //Total taille print '<tr><td>'.$langs->trans("TotalSizeOfAttachedFiles").'</td><td colspan="3">'.$totalsize.' '.$langs->trans("bytes").'</td></tr>';
print '<td>' . $langs->trans("FilesUpdated") . '</td>'; print '<td align="center">' . $langs->trans("ExpectedChecksum") . '</td>'; print '<td align="center">' . $langs->trans("CurrentChecksum") . '</td>'; print '<td align="right">' . $langs->trans("Size") . '</td>'; print '<td align="right">' . $langs->trans("DateModification") . '</td>'; print '</tr>' . "\n"; $var = true; $tmpfilelist = dol_sort_array($file_list['updated'], 'filename'); if (is_array($tmpfilelist) && count($tmpfilelist)) { foreach ($tmpfilelist as $file) { $var = !$var; print '<tr ' . $bc[$var] . '>'; print '<td>' . $file['filename'] . '</td>' . "\n"; print '<td align="center">' . $file['expectedmd5'] . '</td>' . "\n"; print '<td align="center">' . $file['md5'] . '</td>' . "\n"; print '<td align="right">' . dol_print_size(dol_filesize(DOL_DOCUMENT_ROOT . '/' . $file['filename'])) . '</td>' . "\n"; print '<td align="right">' . dol_print_date(dol_filemtime(DOL_DOCUMENT_ROOT . '/' . $file['filename']), 'dayhour') . '</td>' . "\n"; print "</tr>\n"; } } else { print '<tr ' . $bc[false] . '><td colspan="5">' . $langs->trans("None") . '</td></tr>'; } print '</table>'; } else { print 'Error: Failed to found dolibarr_htdocs_dir into XML file ' . $xmlfile; $error++; } } else { print 'Error: Failed to parse XML for input file ' . $xmlfile; $error++; }
/** * Scan a directory and return a list of files/directories. * Content for string is UTF8 and dir separator is "/". * * @param string $path Starting path from which to search * @param string $types Can be "directories", "files", or "all" * @param int $recursive Determines whether subdirectories are searched * @param string $filter Regex filter to restrict list. This regex value must be escaped for '/', since this char is used for preg_match function * @param array $excludefilter Array of Regex for exclude filter (example: array('(\.meta|_preview\.png)$','^\.')) * @param string $sortcriteria Sort criteria ("","fullname","name","date","size") * @param string $sortorder Sort order (SORT_ASC, SORT_DESC) * @param int $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower), 2=Force load of date only, 3=Force load of size only * @param int $nohook Disable all hooks * @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file') */ function dol_dir_list($path, $types = "all", $recursive = 0, $filter = "", $excludefilter = "", $sortcriteria = "name", $sortorder = SORT_ASC, $mode = 0, $nohook = false) { global $db, $hookmanager; global $object; dol_syslog("files.lib.php::dol_dir_list path=" . $path . " types=" . $types . " recursive=" . $recursive . " filter=" . $filter . " excludefilter=" . json_encode($excludefilter)); //print 'xxx'."files.lib.php::dol_dir_list path=".$path." types=".$types." recursive=".$recursive." filter=".$filter." excludefilter=".json_encode($excludefilter); $loaddate = $mode == 1 || $mode == 2 ? true : false; $loadsize = $mode == 1 || $mode == 3 ? true : false; // Clean parameters $path = preg_replace('/([\\/]+)$/i', '', $path); $newpath = dol_osencode($path); if (!$nohook) { $hookmanager->initHooks(array('fileslib')); $parameters = array('path' => $newpath, 'types' => $types, 'recursive' => $recursive, 'filter' => $filter, 'excludefilter' => $excludefilter, 'sortcriteria' => $sortcriteria, 'sortorder' => $sortorder, 'loaddate' => $loaddate, 'loadsize' => $loadsize, 'mode' => $mode); $reshook = $hookmanager->executeHooks('getNodesList', $parameters, $object); } // $reshook may contain returns stacked by other modules // $reshook is always empty with an array for can not lose returns stacked with other modules // $hookmanager->resArray may contain array stacked by other modules if (!$nohook && !empty($hookmanager->resArray)) { return $hookmanager->resArray['nodes']; } else { if (!is_dir($newpath)) { return array(); } if ($dir = opendir($newpath)) { $filedate = ''; $filesize = ''; $file_list = array(); while (false !== ($file = readdir($dir))) { if (!utf8_check($file)) { $file = utf8_encode($file); } // To be sure data is stored in utf8 in memory $qualified = 1; // Define excludefilterarray $excludefilterarray = array('^\\.'); if (is_array($excludefilter)) { $excludefilterarray = array_merge($excludefilterarray, $excludefilter); } else { if ($excludefilter) { $excludefilterarray[] = $excludefilter; } } // Check if file is qualified foreach ($excludefilterarray as $filt) { if (preg_match('/' . $filt . '/i', $file)) { $qualified = 0; break; } } if ($qualified) { $isdir = is_dir(dol_osencode($path . "/" . $file)); // Check whether this is a file or directory and whether we're interested in that type if ($isdir && ($types == "directories" || $types == "all" || $recursive)) { // Add entry into file_list array if ($types == "directories" || $types == "all") { if ($loaddate || $sortcriteria == 'date') { $filedate = dol_filemtime($path . "/" . $file); } if ($loadsize || $sortcriteria == 'size') { $filesize = dol_filesize($path . "/" . $file); } if (!$filter || preg_match('/' . $filter . '/i', $file)) { preg_match('/([^\\/]+)\\/[^\\/]+$/', $path . '/' . $file, $reg); $level1name = isset($reg[1]) ? $reg[1] : ''; $file_list[] = array("name" => $file, "path" => $path, "level1name" => $level1name, "fullname" => $path . '/' . $file, "date" => $filedate, "size" => $filesize, "type" => 'dir'); } } // if we're in a directory and we want recursive behavior, call this function again if ($recursive) { $file_list = array_merge($file_list, dol_dir_list($path . "/" . $file, $types, $recursive, $filter, $excludefilter, $sortcriteria, $sortorder, $mode, $nohook)); } } else { if (!$isdir && ($types == "files" || $types == "all")) { // Add file into file_list array if ($loaddate || $sortcriteria == 'date') { $filedate = dol_filemtime($path . "/" . $file); } if ($loadsize || $sortcriteria == 'size') { $filesize = dol_filesize($path . "/" . $file); } if (!$filter || preg_match('/' . $filter . '/i', $file)) { preg_match('/([^\\/]+)\\/[^\\/]+$/', $path . '/' . $file, $reg); $level1name = isset($reg[1]) ? $reg[1] : ''; $file_list[] = array("name" => $file, "path" => $path, "level1name" => $level1name, "fullname" => $path . '/' . $file, "date" => $filedate, "size" => $filesize, "type" => 'file'); } } } } } closedir($dir); // Obtain a list of columns if (!empty($sortcriteria)) { $myarray = array(); foreach ($file_list as $key => $row) { $myarray[$key] = isset($row[$sortcriteria]) ? $row[$sortcriteria] : ''; } // Sort the data if ($sortorder) { array_multisort($myarray, $sortorder, $file_list); } } return $file_list; } else { return array(); } } }
/** * Scan a directory and return a list of files/directories. * Content for string is UTF8 and dir separator is "/". * @param $path Starting path from which to search * @param $types Can be "directories", "files", or "all" * @param $recursive Determines whether subdirectories are searched * @param $filter Regex for include filter * @param $excludefilter Array of Regex for exclude filter (example: array('\.meta$','^\.') * @param $sortcriteria Sort criteria ("","name","date","size") * @param $sortorder Sort order (SORT_ASC, SORT_DESC) * @param $mode 0=Return array minimum keys loaded (faster), 1=Force all keys like date and size to be loaded (slower), 2=Force load of date only, 3=Force load of size only * @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file') */ function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0) { dol_syslog("files.lib.php::dol_dir_list path=".$path." types=".$types." recursive=".$recursive." filter=".$filter." excludefilter=".$excludefilter); $loaddate=($mode==1||$mode==2)?true:false; $loadsize=($mode==1||$mode==3)?true:false; // Clean parameters $path=preg_replace('/([\\/]+)$/i','',$path); $newpath=dol_osencode($path); if (! is_dir($newpath)) return array(); if ($dir = opendir($newpath)) { $file_list = array(); while (false !== ($file = readdir($dir))) { if (! utf8_check($file)) $file=utf8_encode($file); // To be sure data is stored in utf8 in memory $qualified=1; // Define excludefilterarray $excludefilterarray=array('^\.'); if (is_array($excludefilter)) { $excludefilterarray=array_merge($excludefilterarray,$excludefilter); } else if ($excludefilter) $excludefilterarray[]=$excludefilter; // Check if file is qualified foreach($excludefilterarray as $filt) { if (preg_match('/'.$filt.'/i',$file)) { $qualified=0; break; } } if ($qualified) { $isdir=is_dir(dol_osencode($path."/".$file)); // Check whether this is a file or directory and whether we're interested in that type if ($isdir && (($types=="directories") || ($types=="all") || $recursive)) { // Add entry into file_list array if (($types=="directories") || ($types=="all")) { if ($loaddate || $sortcriteria == 'date') $filedate=dol_filemtime($path."/".$file); if ($loadsize || $sortcriteria == 'size') $filesize=dol_filesize($path."/".$file); if (! $filter || preg_match('/'.$filter.'/i',$path.'/'.$file)) { $file_list[] = array( "name" => $file, "fullname" => $path.'/'.$file, "date" => $filedate, "size" => $filesize, "type" => 'dir' ); } } // if we're in a directory and we want recursive behavior, call this function again if ($recursive) { $file_list = array_merge($file_list,dol_dir_list($path."/".$file, $types, $recursive, $filter, $excludefilter, $sortcriteria, $sortorder, $mode)); } } else if (! $isdir && (($types == "files") || ($types == "all"))) { // Add file into file_list array if ($loaddate || $sortcriteria == 'date') $filedate=dol_filemtime($path."/".$file); if ($loadsize || $sortcriteria == 'size') $filesize=dol_filesize($path."/".$file); if (! $filter || preg_match('/'.$filter.'/i',$path.'/'.$file)) { $file_list[] = array( "name" => $file, "fullname" => $path.'/'.$file, "date" => $filedate, "size" => $filesize, "type" => 'file' ); } } } } closedir($dir); // Obtain a list of columns $myarray=array(); foreach ($file_list as $key => $row) { $myarray[$key] = $row[$sortcriteria]; } // Sort the data if ($sortorder) array_multisort($myarray, $sortorder, $file_list); return $file_list; } else { return array(); } }
/** * Return a string to show the box with list of available documents for object. * This also set the property $this->numoffiles * * @param string $modulepart propal, facture, facture_fourn, ... * @param string $filename Sub-directory to scan (Example: '0/1/10', 'FA/DD/MM/YY/9999'). Use '' if $filedir is already complete) * @param string $filedir Directory to scan * @param string $urlsource Url of origin page (for return) * @param int $genallowed Generation is allowed (1/0 or array list of templates) * @param int $delallowed Remove is allowed (1/0) * @param string $modelselected Model to preselect by default * @param string $allowgenifempty Allow generation even if list of template ($genallowed) is empty (show however a warning) * @param string $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param int $iconPDF Show only PDF icon with link (1/0) * @param int $maxfilenamelength Max length for filename shown * @param string $noform Do not output html form tags * @param string $param More param on http links * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button * @param string $codelang Default language code to use on lang combo box if multilang is enabled * @param HookManager $hookmanager Object hookmanager with instance of external modules hook classes * @return string Output string with HTML array of documents (might be empty string) */ function showdocuments($modulepart, $filename, $filedir, $urlsource, $genallowed, $delallowed = 0, $modelselected = '', $allowgenifempty = 1, $forcenomultilang = 0, $iconPDF = 0, $maxfilenamelength = 28, $noform = 0, $param = '', $title = '', $buttonlabel = '', $codelang = '', $hookmanager = false) { // filedir = conf->...dir_ouput."/".get_exdir(id) include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; global $langs, $bc, $conf; $forname = 'builddoc'; $out = ''; $var = true; // Clean paramaters if ($iconPDF == 1) { $genallowed = ''; $delallowed = 0; $modelselected = ''; $forcenomultilang = 0; } //$filename = dol_sanitizeFileName($filename); //Must be sanitized before calling show_documents $headershown = 0; $showempty = 0; $i = 0; $titletoshow = $langs->trans("Documents"); if (!empty($title)) { $titletoshow = $title; } $out .= "\n" . '<!-- Start show_document -->' . "\n"; //print 'filedir='.$filedir; // Affiche en-tete tableau if ($genallowed) { $modellist = array(); if ($modulepart == 'company') { $showempty = 1; if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/societe/modules_societe.class.php'; $modellist = ModeleThirdPartyDoc::liste_modeles($this->db); } } else { if ($modulepart == 'propal') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/propale/modules_propale.php'; $modellist = ModelePDFPropales::liste_modeles($this->db); } } else { if ($modulepart == 'commande') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/commande/modules_commande.php'; $modellist = ModelePDFCommandes::liste_modeles($this->db); } } elseif ($modulepart == 'expedition') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/expedition/modules_expedition.php'; $modellist = ModelePDFExpedition::liste_modeles($this->db); } } elseif ($modulepart == 'livraison') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/livraison/modules_livraison.php'; $modellist = ModelePDFDeliveryOrder::liste_modeles($this->db); } } else { if ($modulepart == 'ficheinter') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/fichinter/modules_fichinter.php'; $modellist = ModelePDFFicheinter::liste_modeles($this->db); } } elseif ($modulepart == 'facture') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/facture/modules_facture.php'; $modellist = ModelePDFFactures::liste_modeles($this->db); } } elseif ($modulepart == 'project') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/project/modules_project.php'; $modellist = ModelePDFProjects::liste_modeles($this->db); } } elseif ($modulepart == 'export') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/export/modules_export.php'; $modellist = ModeleExports::liste_modeles($this->db); } } else { if ($modulepart == 'commande_fournisseur') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/supplier_order/modules_commandefournisseur.php'; $modellist = ModelePDFSuppliersOrders::liste_modeles($this->db); } } else { if ($modulepart == 'facture_fournisseur') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/supplier_invoice/modules_facturefournisseur.php'; $modellist = ModelePDFSuppliersInvoices::liste_modeles($this->db); } } else { if ($modulepart == 'remisecheque') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/cheque/pdf/modules_chequereceipts.php'; $modellist = ModeleChequeReceipts::liste_modeles($this->db); } } elseif ($modulepart == 'donation') { if (is_array($genallowed)) { $modellist = $genallowed; } else { include_once DOL_DOCUMENT_ROOT . '/core/modules/dons/modules_don.php'; $modellist = ModeleDon::liste_modeles($this->db); } } else { if ($modulepart == 'unpaid') { $modellist = ''; } else { // Generic feature, for external modules $file = dol_buildpath('/core/modules/' . $modulepart . '/modules_' . $modulepart . '.php', 0); if (file_exists($file)) { $res = (include_once $file); } $class = 'Modele' . ucfirst($modulepart); if (class_exists($class)) { $modellist = call_user_func($class . '::liste_modeles', $this->db); } else { dol_print_error($this->db, 'Bad value for modulepart'); return -1; } } } } } } } } } $headershown = 1; $form = new Form($this->db); $buttonlabeltoshow = $buttonlabel; if (empty($buttonlabel)) { $buttonlabel = $langs->trans('Generate'); } if (empty($noform)) { $out .= '<form action="' . $urlsource . (empty($conf->global->MAIN_JUMP_TAG) ? '' : '#builddoc') . '" name="' . $forname . '" id="' . $forname . '_form" method="post">'; } $out .= '<input type="hidden" name="action" value="builddoc">'; $out .= '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">'; $out .= '<div class="titre">' . $titletoshow . '</div>'; $out .= '<table class="liste formdoc" summary="listofdocumentstable" width="100%">'; $out .= '<tr class="liste_titre">'; // Model if (!empty($modellist)) { $out .= '<th align="center" class="formdoc liste_titre">'; $out .= $langs->trans('Model') . ' '; if (is_array($modellist) && count($modellist) == 1) { $arraykeys = array_keys($modellist); $modelselected = $arraykeys[0]; } $out .= $form->selectarray('model', $modellist, $modelselected, $showempty, 0, 0); $out .= '</th>'; } else { $out .= '<th align="left" class="formdoc liste_titre">'; $out .= $langs->trans("Files"); $out .= '</th>'; } // Language code (if multilang) $out .= '<th align="center" class="formdoc liste_titre">'; if (($allowgenifempty || is_array($modellist) && count($modellist) > 0) && $conf->global->MAIN_MULTILANGS && !$forcenomultilang) { include_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php'; $formadmin = new FormAdmin($this->db); $defaultlang = $codelang ? $codelang : $langs->getDefaultLang(); $out .= $formadmin->select_language($defaultlang); } else { $out .= ' '; } $out .= '</th>'; // Button $out .= '<th align="center" colspan="' . ($delallowed ? '2' : '1') . '" class="formdocbutton liste_titre">'; $out .= '<input class="button" id="' . $forname . '_generatebutton"'; $out .= ' type="submit" value="' . $buttonlabel . '"'; if (!$allowgenifempty && !is_array($modellist) && empty($modellist)) { $out .= ' disabled="disabled"'; } $out .= '>'; if ($allowgenifempty && !is_array($modellist) && empty($modellist) && $modulepart != 'unpaid') { $langs->load("errors"); $out .= ' ' . img_warning($langs->transnoentitiesnoconv("WarningNoDocumentModelActivated")); } $out .= '</th>'; $out .= '</tr>'; // Execute hooks $parameters = array('socid' => isset($GLOBALS['socid']) ? $GLOBALS['socid'] : '', 'id' => isset($GLOBALS['id']) ? $GLOBALS['id'] : '', 'modulepart' => $modulepart); if (is_object($hookmanager)) { $out .= $hookmanager->executeHooks('formBuilddocOptions', $parameters, $GLOBALS['object']); } } // Get list of files if ($filedir) { $png = ''; $filter = ''; if ($iconPDF == 1) { $png = '\\.png$'; $filter = $filename . '.pdf'; } $file_list = dol_dir_list($filedir, 'files', 0, $filter, '\\.meta$' . ($png ? '|' . $png : ''), 'date', SORT_DESC); // Affiche en-tete tableau si non deja affiche if (!empty($file_list) && !$headershown && !$iconPDF) { $headershown = 1; $out .= '<div class="titre">' . $titletoshow . '</div>'; $out .= '<table class="border" summary="listofdocumentstable" width="100%">'; } else { if (empty($file_list) && !empty($iconPDF)) { // For ajax treatment $out .= '<div id="gen_pdf_' . $filename . '" class="linkobject hideobject">' . img_picto('', 'refresh') . '</div>' . "\n"; } } // Loop on each file found foreach ($file_list as $file) { $var = !$var; // Define relative path for download link (depends on module) $relativepath = $file["name"]; // Cas general if ($filename) { $relativepath = $filename . "/" . $file["name"]; } // Cas propal, facture... // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($filename, 2) . $file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } if (!$iconPDF) { $out .= "<tr " . $bc[$var] . ">"; } // Show file name with link to download if (!$iconPDF) { $out .= '<td nowrap="nowrap">'; } $out .= '<a href="' . DOL_URL_ROOT . '/document.php?modulepart=' . $modulepart . '&file=' . urlencode($relativepath) . '"'; $mime = dol_mimetype($relativepath, '', 0); if (preg_match('/text/', $mime)) { $out .= ' target="_blank"'; } $out .= '>'; if (!$iconPDF) { $out .= img_mime($file["name"], $langs->trans("File") . ': ' . $file["name"]) . ' ' . dol_trunc($file["name"], $maxfilenamelength); } else { $out .= img_pdf($file["name"], 2); } $out .= '</a>' . "\n"; if (!$iconPDF) { $out .= '</td>'; // Show file size $out .= '<td align="right" nowrap="nowrap">' . dol_print_size(dol_filesize($filedir . "/" . $file["name"])) . '</td>'; // Show file date $out .= '<td align="right" nowrap="nowrap">' . dol_print_date(dol_filemtime($filedir . "/" . $file["name"]), 'dayhour') . '</td>'; } if ($delallowed) { $out .= '<td align="right">'; //$out.= '<a href="'.DOL_URL_ROOT.'/document.php?action=remove_file&modulepart='.$modulepart.'&file='.urlencode($relativepath); $out .= '<a href="' . $urlsource . '&action=remove_file&modulepart=' . $modulepart . '&file=' . urlencode($relativepath); $out .= $param ? '&' . $param : ''; $out .= '&urlsource=' . urlencode($urlsource); $out .= '">' . img_delete() . '</a></td>'; } if (!$iconPDF) { $out .= '</tr>'; } $this->numoffiles++; } } if ($headershown) { // Affiche pied du tableau $out .= "</table>\n"; if ($genallowed) { if (empty($noform)) { $out .= '</form>' . "\n"; } } } $out .= '<!-- End show_document -->' . "\n"; //return ($i?$i:$headershown); return $out; }