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