dolibarr  20.0.0-beta
doc_generic_order_odt.modules.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2010-2012 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es>
4  * Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
5  * Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com>
6  * Copyright (C) 2018-2021 Philippe Grand <philippe.grand@atoo-net.com>
7  * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  * or see https://www.gnu.org/
22  */
23 
30 require_once DOL_DOCUMENT_ROOT.'/core/modules/commande/modules_commande.php';
31 require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
34 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
36 
37 
42 {
47  public $version = 'dolibarr';
48 
49 
55  public function __construct($db)
56  {
57  global $langs, $mysoc;
58 
59  // Load translation files required by the page
60  $langs->loadLangs(array("main", "companies"));
61 
62  $this->db = $db;
63  $this->name = "ODT templates";
64  $this->description = $langs->trans("DocumentModelOdt");
65  $this->scandir = 'COMMANDE_ADDON_PDF_ODT_PATH'; // Name of constant that is used to save list of directories to scan
66 
67  // Page size for A4 format
68  $this->type = 'odt';
69  $this->page_largeur = 0;
70  $this->page_hauteur = 0;
71  $this->format = array($this->page_largeur, $this->page_hauteur);
72  $this->marge_gauche = 0;
73  $this->marge_droite = 0;
74  $this->marge_haute = 0;
75  $this->marge_basse = 0;
76 
77  $this->option_logo = 1; // Display logo
78  $this->option_tva = 0; // Manage the vat option COMMANDE_TVAOPTION
79  $this->option_modereg = 0; // Display payment mode
80  $this->option_condreg = 0; // Display payment terms
81  $this->option_multilang = 1; // Available in several languages
82  $this->option_escompte = 0; // Displays if there has been a discount
83  $this->option_credit_note = 0; // Support credit notes
84  $this->option_freetext = 1; // Support add of a personalised text
85  $this->option_draft_watermark = 0; // Support add of a watermark on drafts
86 
87  // Get source company
88  $this->emetteur = $mysoc;
89  if (!$this->emetteur->country_code) {
90  $this->emetteur->country_code = substr($langs->defaultlang, -2); // By default if not defined
91  }
92  }
93 
94 
101  public function info($langs)
102  {
103  global $conf, $langs;
104 
105  // Load translation files required by the page
106  $langs->loadLangs(array("errors", "companies"));
107 
108  $form = new Form($this->db);
109 
110  $texte = $this->description.".<br>\n";
111  $texte .= '<form action="'.$_SERVER["PHP_SELF"].'" method="POST" enctype="multipart/form-data">';
112  $texte .= '<input type="hidden" name="token" value="'.newToken().'">';
113  $texte .= '<input type="hidden" name="page_y" value="">';
114  $texte .= '<input type="hidden" name="action" value="setModuleOptions">';
115  $texte .= '<input type="hidden" name="param1" value="COMMANDE_ADDON_PDF_ODT_PATH">';
116  $texte .= '<table class="nobordernopadding" width="100%">';
117 
118  // List of directories area
119  $texte .= '<tr><td>';
120  $texttitle = $langs->trans("ListOfDirectories");
121  $listofdir = explode(',', preg_replace('/[\r\n]+/', ',', trim($conf->global->COMMANDE_ADDON_PDF_ODT_PATH)));
122  $listoffiles = array();
123  foreach ($listofdir as $key => $tmpdir) {
124  $tmpdir = trim($tmpdir);
125  $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
126  if (!$tmpdir) {
127  unset($listofdir[$key]);
128  continue;
129  }
130  if (!is_dir($tmpdir)) {
131  $texttitle .= img_warning($langs->trans("ErrorDirNotFound", $tmpdir), 0);
132  } else {
133  $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.(ods|odt)');
134  if (count($tmpfiles)) {
135  $listoffiles = array_merge($listoffiles, $tmpfiles);
136  }
137  }
138  }
139  $texthelp = $langs->trans("ListOfDirectoriesForModelGenODT");
140  $texthelp .= '<br><br><span class="opacitymedium">'.$langs->trans("ExampleOfDirectoriesForModelGen").'</span>';
141  // Add list of substitution keys
142  $texthelp .= '<br>'.$langs->trans("FollowingSubstitutionKeysCanBeUsed").'<br>';
143  $texthelp .= $langs->transnoentitiesnoconv("FullListOnOnlineDocumentation"); // This contains an url, we don't modify it
144 
145  $texte .= $form->textwithpicto($texttitle, $texthelp, 1, 'help', '', 1, 3, $this->name);
146  $texte .= '<div><div style="display: inline-block; min-width: 100px; vertical-align: middle;">';
147  $texte .= '<textarea class="flat" cols="60" name="value1">';
148  $texte .= getDolGlobalString('COMMANDE_ADDON_PDF_ODT_PATH');
149  $texte .= '</textarea>';
150  $texte .= '</div><div style="display: inline-block; vertical-align: middle;">';
151  $texte .= '<input type="submit" class="button button-edit reposition smallpaddingimp" name="modify" value="'.dol_escape_htmltag($langs->trans("Modify")).'">';
152  $texte .= '<br></div></div>';
153 
154  // Scan directories
155  $nbofiles = count($listoffiles);
156  if (getDolGlobalString('COMMANDE_ADDON_PDF_ODT_PATH')) {
157  $texte .= $langs->trans("NumberOfModelFilesFound").': <b>';
158  //$texte.=$nbofiles?'<a id="a_'.get_class($this).'" href="#">':'';
159  $texte .= count($listoffiles);
160  //$texte.=$nbofiles?'</a>':'';
161  $texte .= '</b>';
162  }
163 
164  if ($nbofiles) {
165  $texte .= '<div id="div_'.get_class($this).'" class="hiddenx">';
166  // Show list of found files
167  foreach ($listoffiles as $file) {
168  $texte .= '- '.$file['name'].' <a href="'.DOL_URL_ROOT.'/document.php?modulepart=doctemplates&file=orders/'.urlencode(basename($file['name'])).'">'.img_picto('', 'listlight').'</a>';
169  $texte .= ' &nbsp; <a class="reposition" href="'.$_SERVER["PHP_SELF"].'?modulepart=doctemplates&keyforuploaddir=COMMANDE_ADDON_PDF_ODT_PATH&action=deletefile&token='.newToken().'&file='.urlencode(basename($file['name'])).'">'.img_picto('', 'delete').'</a>';
170  $texte .= '<br>';
171  }
172  $texte .= '</div>';
173  }
174  // Add input to upload a new template file.
175  $texte .= '<div>'.$langs->trans("UploadNewTemplate");
176  $maxfilesizearray = getMaxFileSizeArray();
177  $maxmin = $maxfilesizearray['maxmin'];
178  if ($maxmin > 0) {
179  $texte .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
180  }
181  $texte .= ' <input type="file" name="uploadfile">';
182  $texte .= '<input type="hidden" value="COMMANDE_ADDON_PDF_ODT_PATH" name="keyforuploaddir">';
183  $texte .= '<input type="submit" class="button reposition smallpaddingimp" value="'.dol_escape_htmltag($langs->trans("Upload")).'" name="upload">';
184  $texte .= '</div>';
185 
186  $texte .= '</td>';
187 
188  $texte .= '</tr>';
189 
190  $texte .= '</table>';
191  $texte .= '</form>';
192 
193  return $texte;
194  }
195 
196  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
208  public function write_file($object, $outputlangs, $srctemplatepath, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
209  {
210  // phpcs:enable
211  global $user, $langs, $conf, $mysoc, $hookmanager;
212 
213  if (empty($srctemplatepath)) {
214  dol_syslog("doc_generic_odt::write_file parameter srctemplatepath empty", LOG_WARNING);
215  return -1;
216  }
217 
218  // Add odtgeneration hook
219  if (!is_object($hookmanager)) {
220  include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
221  $hookmanager = new HookManager($this->db);
222  }
223  $hookmanager->initHooks(array('odtgeneration'));
224  global $action;
225 
226  if (!is_object($outputlangs)) {
227  $outputlangs = $langs;
228  }
229  $sav_charset_output = $outputlangs->charset_output;
230  $outputlangs->charset_output = 'UTF-8';
231 
232  // Load translation files required by the page
233  $outputlangs->loadLangs(array("main", "dict", "companies", "bills"));
234 
235  if ($conf->commande->dir_output) {
236  // If $object is id instead of object
237  if (!is_object($object)) {
238  $id = $object;
239  $object = new Commande($this->db);
240  $result = $object->fetch($id);
241  if ($result < 0) {
242  dol_print_error($this->db, $object->error);
243  return -1;
244  }
245  }
246 
247  $object->fetch_thirdparty();
248 
249  $dir = $conf->commande->multidir_output[$object->entity];
250  $objectref = dol_sanitizeFileName($object->ref);
251  if (!preg_match('/specimen/i', $objectref)) {
252  $dir .= "/".$objectref;
253  }
254  $file = $dir."/".$objectref.".odt";
255 
256  if (!file_exists($dir)) {
257  if (dol_mkdir($dir) < 0) {
258  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
259  return -1;
260  }
261  }
262 
263  if (file_exists($dir)) {
264  //print "srctemplatepath=".$srctemplatepath; // Src filename
265  $newfile = basename($srctemplatepath);
266  $newfiletmp = preg_replace('/\.od[ts]/i', '', $newfile);
267  $newfiletmp = preg_replace('/template_/i', '', $newfiletmp);
268  $newfiletmp = preg_replace('/modele_/i', '', $newfiletmp);
269  $newfiletmp = $objectref . '_' . $newfiletmp;
270 
271  // Get extension (ods or odt)
272  $newfileformat = substr($newfile, strrpos($newfile, '.') + 1);
273  if (getDolGlobalString('MAIN_DOC_USE_TIMING')) {
274  $format = getDolGlobalString('MAIN_DOC_USE_TIMING');
275  if ($format == '1') {
276  $format = '%Y%m%d%H%M%S';
277  }
278  $filename = $newfiletmp . '-' . dol_print_date(dol_now(), $format) . '.' . $newfileformat;
279  } else {
280  $filename = $newfiletmp . '.' . $newfileformat;
281  }
282  $file = $dir . '/' . $filename;
283  //print "newdir=".$dir;
284  //print "newfile=".$newfile;
285  //print "file=".$file;
286  //print "conf->societe->dir_temp=".$conf->societe->dir_temp;
287 
288  dol_mkdir($conf->commande->dir_temp);
289  if (!is_writable($conf->commande->dir_temp)) {
290  $this->error = $langs->transnoentities("ErrorFailedToWriteInTempDirectory", $conf->commande->dir_temp);
291  dol_syslog('Error in write_file: ' . $this->error, LOG_ERR);
292  return -1;
293  }
294 
295  // If CUSTOMER contact defined on order, we use it
296  $usecontact = false;
297  $arrayidcontact = $object->getIdContact('external', 'CUSTOMER');
298  if (count($arrayidcontact) > 0) {
299  $usecontact = true;
300  $result = $object->fetch_contact($arrayidcontact[0]);
301  }
302 
303  // Recipient name
304  $contactobject = null;
305  if (!empty($usecontact)) {
306  // We can use the company of contact instead of thirdparty company
307  if ($object->contact->socid != $object->thirdparty->id && (!isset($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT) || getDolGlobalString('MAIN_USE_COMPANY_NAME_OF_CONTACT'))) {
308  $object->contact->fetch_thirdparty();
309  $socobject = $object->contact->thirdparty;
310  $contactobject = $object->contact;
311  } else {
312  $socobject = $object->thirdparty;
313  // if we have a CUSTOMER contact and we don't use it as thirdparty recipient we store the contact object for later use
314  $contactobject = $object->contact;
315  }
316  } else {
317  $socobject = $object->thirdparty;
318  }
319 
320  // Make substitution
321  $substitutionarray = array(
322  '__FROM_NAME__' => $this->emetteur->name,
323  '__FROM_EMAIL__' => $this->emetteur->email,
324  '__TOTAL_TTC__' => $object->total_ttc,
325  '__TOTAL_HT__' => $object->total_ht,
326  '__TOTAL_VAT__' => $object->total_tva
327  );
328  complete_substitutions_array($substitutionarray, $langs, $object);
329  // Call the ODTSubstitution hook
330  $parameters = array('file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$substitutionarray);
331  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
332 
333  // Line of free text
334  $newfreetext = '';
335  $paramfreetext = 'ORDER_FREE_TEXT';
336  if (!empty($conf->global->$paramfreetext)) {
337  $newfreetext = make_substitutions(getDolGlobalString($paramfreetext), $substitutionarray);
338  }
339 
340  // Open and load template
341  require_once ODTPHP_PATH.'odf.php';
342  try {
343  $odfHandler = new Odf(
344  $srctemplatepath,
345  array(
346  'PATH_TO_TMP' => $conf->commande->dir_temp,
347  'ZIP_PROXY' => 'PclZipProxy', // PhpZipProxy or PclZipProxy. Got "bad compression method" error when using PhpZipProxy.
348  'DELIMITER_LEFT' => '{',
349  'DELIMITER_RIGHT' => '}'
350  )
351  );
352  } catch (Exception $e) {
353  $this->error = $e->getMessage();
354  dol_syslog($e->getMessage(), LOG_INFO);
355  return -1;
356  }
357  // After construction $odfHandler->contentXml contains content and
358  // [!-- BEGIN row.lines --]*[!-- END row.lines --] has been replaced by
359  // [!-- BEGIN lines --]*[!-- END lines --]
360  //print html_entity_decode($odfHandler->__toString());
361  //print exit;
362 
363 
364  // Make substitutions into odt of freetext
365  try {
366  $odfHandler->setVars('free_text', $newfreetext, true, 'UTF-8');
367  } catch (OdfException $e) {
368  dol_syslog($e->getMessage(), LOG_INFO);
369  }
370 
371  // Define substitution array
372  $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
373  $array_object_from_properties = $this->get_substitutionarray_each_var_object($object, $outputlangs);
374  $array_objet = $this->get_substitutionarray_object($object, $outputlangs);
375  $array_user = $this->get_substitutionarray_user($user, $outputlangs);
376  $array_soc = $this->get_substitutionarray_mysoc($mysoc, $outputlangs);
377  $array_thirdparty = $this->get_substitutionarray_thirdparty($socobject, $outputlangs);
378  $array_other = $this->get_substitutionarray_other($outputlangs);
379  // retrieve contact information for use in object as contact_xxx tags
380  $array_thirdparty_contact = array();
381 
382  if ($usecontact && is_object($contactobject)) {
383  $array_thirdparty_contact = $this->get_substitutionarray_contact($contactobject, $outputlangs, 'contact');
384  }
385 
386  $tmparray = array_merge($substitutionarray, $array_object_from_properties, $array_user, $array_soc, $array_thirdparty, $array_objet, $array_other, $array_thirdparty_contact);
387  complete_substitutions_array($tmparray, $outputlangs, $object);
388 
389  // Call the ODTSubstitution hook
390  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
391  $reshook = $hookmanager->executeHooks('ODTSubstitution', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
392 
393  foreach ($tmparray as $key => $value) {
394  try {
395  if (preg_match('/logo$/', $key)) { // Image
396  if (file_exists($value)) {
397  $odfHandler->setImage($key, $value);
398  } else {
399  $odfHandler->setVars($key, 'ErrorFileNotFound', true, 'UTF-8');
400  }
401  } else { // Text
402  $odfHandler->setVars($key, $value, true, 'UTF-8');
403  }
404  } catch (OdfException $e) {
405  dol_syslog($e->getMessage(), LOG_INFO);
406  }
407  }
408  // Replace tags of lines
409  try {
410  $foundtagforlines = 1;
411  try {
412  $listlines = $odfHandler->setSegment('lines');
413  } catch (OdfExceptionSegmentNotFound $e) {
414  // We may arrive here if tags for lines not present into template
415  $foundtagforlines = 0;
416  dol_syslog($e->getMessage(), LOG_INFO);
417  } catch (OdfException $e) {
418  $foundtagforlines = 0;
419  dol_syslog($e->getMessage(), LOG_INFO);
420  }
421  if ($foundtagforlines) {
422  $linenumber = 0;
423  foreach ($object->lines as $line) {
424  $linenumber++;
425  $tmparray = $this->get_substitutionarray_lines($line, $outputlangs, $linenumber);
426  complete_substitutions_array($tmparray, $outputlangs, $object, $line, "completesubstitutionarray_lines");
427  // Call the ODTSubstitutionLine hook
428  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray, 'line'=>$line);
429  $reshook = $hookmanager->executeHooks('ODTSubstitutionLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
430  foreach ($tmparray as $key => $val) {
431  try {
432  $listlines->setVars($key, $val, true, 'UTF-8');
433  } catch (OdfException $e) {
434  dol_syslog($e->getMessage(), LOG_INFO);
435  } catch (SegmentException $e) {
436  dol_syslog($e->getMessage(), LOG_INFO);
437  }
438  }
439  $listlines->merge();
440  }
441  $odfHandler->mergeSegment($listlines);
442  }
443  } catch (OdfException $e) {
444  $this->error = $e->getMessage();
445  dol_syslog($this->error, LOG_WARNING);
446  return -1;
447  }
448 
449  // Replace labels translated
450  $tmparray = $outputlangs->get_translations_for_substitutions();
451  foreach ($tmparray as $key => $value) {
452  try {
453  $odfHandler->setVars($key, $value, true, 'UTF-8');
454  } catch (OdfException $e) {
455  dol_syslog($e->getMessage(), LOG_INFO);
456  }
457  }
458 
459  // Call the beforeODTSave hook
460  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
461  $reshook = $hookmanager->executeHooks('beforeODTSave', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
462 
463  // Write new file
464  if (getDolGlobalString('MAIN_ODT_AS_PDF')) {
465  try {
466  $odfHandler->exportAsAttachedPDF($file);
467  } catch (Exception $e) {
468  $this->error = $e->getMessage();
469  dol_syslog($e->getMessage(), LOG_INFO);
470  return -1;
471  }
472  } else {
473  try {
474  $odfHandler->saveToDisk($file);
475  } catch (Exception $e) {
476  $this->error = $e->getMessage();
477  dol_syslog($e->getMessage(), LOG_INFO);
478  return -1;
479  }
480  }
481 
482  $parameters = array('odfHandler'=>&$odfHandler, 'file'=>$file, 'object'=>$object, 'outputlangs'=>$outputlangs, 'substitutionarray'=>&$tmparray);
483  $reshook = $hookmanager->executeHooks('afterODTCreation', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
484 
485  dolChmod($file);
486 
487  $odfHandler = null; // Destroy object
488 
489  $this->result = array('fullpath'=>$file);
490 
491  return 1; // Success
492  } else {
493  $this->error = $langs->transnoentities("ErrorCanNotCreateDir", $dir);
494  return -1;
495  }
496  }
497 
498  return -1;
499  }
500 }
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
Class to manage customers orders.
get_substitutionarray_each_var_object(&$object, $outputlangs, $recursive=1)
Define array with couple substitution key => substitution value.
get_substitutionarray_mysoc($mysoc, $outputlangs)
Define array with couple substitution key => substitution value.
get_substitutionarray_contact($object, $outputlangs, $array_key='object')
Define array with couple substitution key => substitution value.
get_substitutionarray_other($outputlangs)
Define array with couple substitution key => substitution value.
get_substitutionarray_lines($line, $outputlangs, $linenumber=0)
Define array with couple substitution key => substitution value Note that vars into substitutions arr...
get_substitutionarray_thirdparty($object, $outputlangs, $array_key='company')
Define array with couple substitution key => substitution value For example {company_name},...
get_substitutionarray_user($user, $outputlangs)
Define array with couple substitution key => substitution value.
Class to manage generation of HTML components Only common components must be here.
Class to manage hooks.
Parent class for orders models.
Class to build documents using ODF templates generator.
write_file($object, $outputlangs, $srctemplatepath, $hidedetails=0, $hidedesc=0, $hideref=0)
Function to build a document on disk using the generic odt module.
info($langs)
Return description of a module.
print *****$script_file(".$version.") pid cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
Definition: files.lib.php:63
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition: repair.php:123
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition: repair.php:126
getMaxFileSizeArray()
Return the max allowed for file upload.