dolibarr 19.0.3
printsheet.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2006-2017 Laurent Destailleur <eldy@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
26if (!empty($_POST['mode']) && $_POST['mode'] === 'label') { // Page is called to build a PDF and output, we must not renew the token.
27 if (!defined('NOTOKENRENEWAL')) {
28 define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
29 }
30}
31
32// Load Dolibarr environment
33require '../main.inc.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/format_cards.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/modules/printsheet/modules_labels.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/genericobject.class.php';
38
39// Load translation files required by the page
40$langs->loadLangs(array('admin', 'members', 'errors'));
41
42// Choice of print year or current year.
43$now = dol_now();
44$year = dol_print_date($now, '%Y');
45$month = dol_print_date($now, '%m');
46$day = dol_print_date($now, '%d');
47$forbarcode = GETPOST('forbarcode', 'alphanohtml');
48$fk_barcode_type = GETPOST('fk_barcode_type', 'int');
49$mode = GETPOST('mode', 'aZ09');
50$modellabel = GETPOST("modellabel", 'aZ09'); // Doc template to use
51$numberofsticker = GETPOST('numberofsticker', 'int');
52
53$mesg = '';
54
55$action = GETPOST('action', 'aZ09');
56
57$producttmp = new Product($db);
58$thirdpartytmp = new Societe($db);
59
60// Security check (enable the most restrictive one)
61//if ($user->socid > 0) accessforbidden();
62//if ($user->socid > 0) $socid = $user->socid;
63if (!isModEnabled('barcode')) {
64 accessforbidden('Module not enabled');
65}
66if (!$user->hasRight('barcode', 'read')) {
68}
69restrictedArea($user, 'barcode');
70
71
72/*
73 * Actions
74 */
75
76if (GETPOST('submitproduct') && GETPOST('submitproduct')) {
77 $action = ''; // We reset because we don't want to build doc
78 if (GETPOST('productid', 'int') > 0) {
79 $result = $producttmp->fetch(GETPOST('productid', 'int'));
80 if ($result < 0) {
81 setEventMessage($producttmp->error, 'errors');
82 }
83 $forbarcode = $producttmp->barcode;
84 $fk_barcode_type = $producttmp->barcode_type;
85
86 if (empty($fk_barcode_type) && getDolGlobalString('PRODUIT_DEFAULT_BARCODE_TYPE')) {
87 $fk_barcode_type = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
88 }
89
90 if (empty($forbarcode) || empty($fk_barcode_type)) {
91 setEventMessages($langs->trans("DefinitionOfBarCodeForProductNotComplete", $producttmp->getNomUrl()), null, 'warnings');
92 }
93 }
94}
95if (GETPOST('submitthirdparty') && GETPOST('submitthirdparty')) {
96 $action = ''; // We reset because we don't want to build doc
97 if (GETPOST('socid', 'int') > 0) {
98 $thirdpartytmp->fetch(GETPOST('socid', 'int'));
99 $forbarcode = $thirdpartytmp->barcode;
100 $fk_barcode_type = $thirdpartytmp->barcode_type_code;
101
102 if (empty($fk_barcode_type) && getDolGlobalString('GENBARCODE_BARCODETYPE_THIRDPARTY')) {
103 $fk_barcode_type = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
104 }
105
106 if (empty($forbarcode) || empty($fk_barcode_type)) {
107 setEventMessages($langs->trans("DefinitionOfBarCodeForThirdpartyNotComplete", $thirdpartytmp->getNomUrl()), null, 'warnings');
108 }
109 }
110}
111
112if ($action == 'builddoc') {
113 $result = 0;
114 $error = 0;
115
116 if (empty($forbarcode)) { // barcode value
117 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("BarcodeValue")), null, 'errors');
118 $error++;
119 }
120 $MAXLENGTH = 51200; // Limit set to 50Ko
121 if (dol_strlen($forbarcode) > $MAXLENGTH) { // barcode value
122 setEventMessages($langs->trans("ErrorFieldTooLong", $langs->transnoentitiesnoconv("BarcodeValue")).' ('.$langs->trans("RequireXStringMax", $MAXLENGTH).')', null, 'errors');
123 $error++;
124 }
125 if (empty($fk_barcode_type)) { // barcode type = barcode encoding
126 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("BarcodeType")), null, 'errors');
127 $error++;
128 }
129
130 if (!$error) {
131 // Get encoder (barcode_type_coder) from barcode type id (barcode_type)
132 $stdobject = new GenericObject($db);
133 $stdobject->barcode_type = $fk_barcode_type;
134 $result = $stdobject->fetch_barcode();
135 if ($result <= 0) {
136 $error++;
137 setEventMessages('Failed to get bar code type information '.$stdobject->error, $stdobject->errors, 'errors');
138 }
139 }
140
141 if (!$error) {
142 $code = $forbarcode;
143 $generator = $stdobject->barcode_type_coder; // coder (loaded by fetch_barcode). Engine.
144 $encoding = strtoupper($stdobject->barcode_type_code); // code (loaded by fetch_barcode). Example 'ean', 'isbn', ...
145
146 $diroutput = $conf->barcode->dir_temp;
147 dol_mkdir($diroutput);
148
149 // Generate barcode
150 $dirbarcode = array_merge(array("/core/modules/barcode/doc/"), $conf->modules_parts['barcode']);
151
152 foreach ($dirbarcode as $reldir) {
153 $dir = dol_buildpath($reldir, 0);
154 $newdir = dol_osencode($dir);
155
156 // Check if directory exists (we do not use dol_is_dir to avoid loading files.lib.php)
157 if (!is_dir($newdir)) {
158 continue;
159 }
160
161 $result = @include_once $newdir.$generator.'.modules.php';
162 if ($result) {
163 break;
164 }
165 }
166
167 // Load barcode class for generating barcode image
168 $classname = "mod".ucfirst($generator);
169 $module = new $classname($db);
170 if ($generator != 'tcpdfbarcode') {
171 // May be phpbarcode
172 $template = 'standardlabel';
173 $is2d = false;
174 if ($module->encodingIsSupported($encoding)) {
175 $barcodeimage = $conf->barcode->dir_temp.'/barcode_'.$code.'_'.$encoding.'.png';
176 dol_delete_file($barcodeimage);
177 // File is created with full name $barcodeimage = $conf->barcode->dir_temp.'/barcode_'.$code.'_'.$encoding.'.png';
178 $result = $module->writeBarCode($code, $encoding, 'Y', 4, 1);
179 if ($result <= 0 || !dol_is_file($barcodeimage)) {
180 $error++;
181 setEventMessages('Failed to generate image file of barcode for code='.$code.' encoding='.$encoding.' file='.basename($barcodeimage), null, 'errors');
182 setEventMessages($module->error, null, 'errors');
183 }
184 } else {
185 $error++;
186 setEventMessages("Error, encoding ".$encoding." is not supported by encoder ".$generator.'. You must choose another barcode type or install a barcode generation engine that support '.$encoding, null, 'errors');
187 }
188 } else {
189 $template = 'tcpdflabel';
190 $encoding = $module->getTcpdfEncodingType($encoding); //convert to TCPDF compatible encoding types
191 $is2d = $module->is2d;
192 }
193 }
194
195 if (!$error) {
196 // List of values to scan for a replacement
197 $substitutionarray = array(
198 '%LOGIN%' => $user->login,
199 '%COMPANY%' => $mysoc->name,
200 '%ADDRESS%' => $mysoc->address,
201 '%ZIP%' => $mysoc->zip,
202 '%TOWN%' => $mysoc->town,
203 '%COUNTRY%' => $mysoc->country,
204 '%COUNTRY_CODE%' => $mysoc->country_code,
205 '%EMAIL%' => $mysoc->email,
206 '%YEAR%' => $year,
207 '%MONTH%' => $month,
208 '%DAY%' => $day,
209 '%DOL_MAIN_URL_ROOT%' => DOL_MAIN_URL_ROOT,
210 '%SERVER%' => "http://".$_SERVER["SERVER_NAME"]."/",
211 );
212 complete_substitutions_array($substitutionarray, $langs);
213
214 // For labels
215 if ($mode == 'label') {
216 $txtforsticker = "%PHOTO%"; // Photo will be barcode image, %BARCODE% posible when using TCPDF generator
217 $textleft = make_substitutions((!getDolGlobalString('BARCODE_LABEL_LEFT_TEXT') ? $txtforsticker : $conf->global->BARCODE_LABEL_LEFT_TEXT), $substitutionarray);
218 $textheader = make_substitutions((!getDolGlobalString('BARCODE_LABEL_HEADER_TEXT') ? '' : $conf->global->BARCODE_LABEL_HEADER_TEXT), $substitutionarray);
219 $textfooter = make_substitutions((!getDolGlobalString('BARCODE_LABEL_FOOTER_TEXT') ? '' : $conf->global->BARCODE_LABEL_FOOTER_TEXT), $substitutionarray);
220 $textright = make_substitutions((!getDolGlobalString('BARCODE_LABEL_RIGHT_TEXT') ? '' : $conf->global->BARCODE_LABEL_RIGHT_TEXT), $substitutionarray);
221 $forceimgscalewidth = (!getDolGlobalString('BARCODE_FORCEIMGSCALEWIDTH') ? 1 : $conf->global->BARCODE_FORCEIMGSCALEWIDTH);
222 $forceimgscaleheight = (!getDolGlobalString('BARCODE_FORCEIMGSCALEHEIGHT') ? 1 : $conf->global->BARCODE_FORCEIMGSCALEHEIGHT);
223
224 $MAXSTICKERS = 1000;
225 if ($numberofsticker <= $MAXSTICKERS) {
226 for ($i = 0; $i < $numberofsticker; $i++) {
227 $arrayofrecords[] = array(
228 'textleft'=>$textleft,
229 'textheader'=>$textheader,
230 'textfooter'=>$textfooter,
231 'textright'=>$textright,
232 'code'=>$code,
233 'encoding'=>$encoding,
234 'is2d'=>$is2d,
235 'photo'=>!empty($barcodeimage) ? $barcodeimage : '' // Photo must be a file that exists with format supported by TCPDF
236 );
237 }
238 } else {
239 $mesg = $langs->trans("ErrorQuantityIsLimitedTo", $MAXSTICKERS);
240 $error++;
241 }
242 }
243
244 $i++;
245
246 // Build and output PDF
247 if (!$error && $mode == 'label') {
248 if (!count($arrayofrecords)) {
249 $mesg = $langs->trans("ErrorRecordNotFound");
250 }
251 if (empty($modellabel) || $modellabel == '-1') {
252 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DescADHERENT_ETIQUETTE_TYPE"));
253 }
254
255 $outfile = $langs->trans("BarCode").'_sheets_'.dol_print_date(dol_now(), 'dayhourlog').'.pdf';
256
257 if (!$mesg) {
258 $outputlangs = $langs;
259 $previousConf = getDolGlobalInt('TCPDF_THROW_ERRORS_INSTEAD_OF_DIE');
260 $conf->global->TCPDF_THROW_ERRORS_INSTEAD_OF_DIE = 1;
261
262
263 // This generates and send PDF to output
264 // TODO Move
265 try {
266 $result = doc_label_pdf_create($db, $arrayofrecords, $modellabel, $outputlangs, $diroutput, $template, dol_sanitizeFileName($outfile));
267 } catch (Exception $e) {
268 $mesg = $langs->trans('ErrorGeneratingBarcode');
269 }
270 $conf->global->TCPDF_THROW_ERRORS_INSTEAD_OF_DIE = $previousConf;
271 }
272 }
273
274 if ($result <= 0 || $mesg || $error) {
275 if (empty($mesg)) {
276 $mesg = 'Error '.$result;
277 }
278
279 setEventMessages($mesg, null, 'errors');
280 } else {
281 $db->close();
282 exit;
283 }
284 }
285}
286
287
288/*
289 * View
290 */
291
292$form = new Form($db);
293
294llxHeader('', $langs->trans("BarCodePrintsheet"));
295
296print load_fiche_titre($langs->trans("BarCodePrintsheet"), '', 'barcode');
297print '<br>';
298
299print '<span class="opacitymedium">'.$langs->trans("PageToGenerateBarCodeSheets", $langs->transnoentitiesnoconv("BuildPageToPrint")).'</span><br>';
300print '<br>';
301
302//print img_picto('','puce').' '.$langs->trans("PrintsheetForOneBarCode").'<br>';
303//print '<br>';
304
305print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">'; // The target is for brothers that open the file instead of downloading it
306print '<input type="hidden" name="mode" value="label">';
307print '<input type="hidden" name="action" value="builddoc">';
308print '<input type="hidden" name="token" value="'.currentToken().'">'; // The page will not renew the token but force download of a file, so we must use here currentToken
309
310print '<div class="tagtable">';
311
312// Sheet format
313print ' <div class="tagtr">';
314print ' <div class="tagtd">';
315print $langs->trans("DescADHERENT_ETIQUETTE_TYPE").' &nbsp; ';
316print '</div><div class="tagtd maxwidthonsmartphone" style="overflow: hidden; white-space: nowrap;">';
317// List of possible labels (defined into $_Avery_Labels variable set into core/lib/format_cards.lib.php)
318$arrayoflabels = array();
319foreach (array_keys($_Avery_Labels) as $codecards) {
320 $labeltoshow = $_Avery_Labels[$codecards]['name'];
321 //$labeltoshow.=' ('.$_Avery_Labels[$row['code']]['paper-size'].')';
322 $arrayoflabels[$codecards] = $labeltoshow;
323}
324asort($arrayoflabels);
325print $form->selectarray('modellabel', $arrayoflabels, (GETPOST('modellabel') ? GETPOST('modellabel') : getDolGlobalString('ADHERENT_ETIQUETTE_TYPE')), 1, 0, 0, '', 0, 0, 0, '', '', 1);
326print '</div></div>';
327
328// Number of stickers to print
329print ' <div class="tagtr">';
330print ' <div class="tagtd">';
331print $langs->trans("NumberOfStickers").' &nbsp; ';
332print '</div><div class="tagtd maxwidthonsmartphone" style="overflow: hidden; white-space: nowrap;">';
333print '<input size="4" type="text" name="numberofsticker" value="'.(GETPOST('numberofsticker') ? GETPOST('numberofsticker', 'int') : 10).'">';
334print '</div></div>';
335
336print '</div>';
337
338
339print '<br>';
340
341
342// Add javascript to make choice dynamic
343print '<script type="text/javascript">
344jQuery(document).ready(function() {
345 function init_selectors()
346 {
347 if (jQuery("#fillmanually:checked").val() == "fillmanually")
348 {
349 jQuery("#submitproduct").prop("disabled", true);
350 jQuery("#submitthirdparty").prop("disabled", true);
351 jQuery("#search_productid").prop("disabled", true);
352 jQuery("#socid").prop("disabled", true);
353 jQuery(".showforproductselector").hide();
354 jQuery(".showforthirdpartyselector").hide();
355 }
356 if (jQuery("#fillfromproduct:checked").val() == "fillfromproduct")
357 {
358 jQuery("#submitproduct").removeAttr("disabled");
359 jQuery("#submitthirdparty").prop("disabled", true);
360 jQuery("#search_productid").removeAttr("disabled");
361 jQuery("#socid").prop("disabled", true);
362 jQuery(".showforproductselector").show();
363 jQuery(".showforthirdpartyselector").hide();
364 }
365 if (jQuery("#fillfromthirdparty:checked").val() == "fillfromthirdparty")
366 {
367 jQuery("#submitproduct").prop("disabled", true);
368 jQuery("#submitthirdparty").removeAttr("disabled");
369 jQuery("#search_productid").prop("disabled", true);
370 jQuery("#socid").removeAttr("disabled");
371 jQuery(".showforproductselector").hide();
372 jQuery(".showforthirdpartyselector").show();
373 }
374 }
375 init_selectors();
376 jQuery(".radiobarcodeselect").click(function() {
377 init_selectors();
378 });
379
380 function init_gendoc_button()
381 {
382 if (jQuery("#select_fk_barcode_type").val() > 0 && jQuery("#forbarcode").val())
383 {
384 jQuery("#submitformbarcodegen").removeAttr("disabled");
385 }
386 else
387 {
388 jQuery("#submitformbarcodegen").prop("disabled", true);
389 }
390 }
391 init_gendoc_button();
392 jQuery("#select_fk_barcode_type").change(function() {
393 init_gendoc_button();
394 });
395 jQuery("#forbarcode").keyup(function() {
396 init_gendoc_button()
397 });
398});
399</script>';
400
401// Checkbox to select from free text
402print '<input id="fillmanually" type="radio" '.((!GETPOST("selectorforbarcode") || GETPOST("selectorforbarcode") == 'fillmanually') ? 'checked ' : '').'name="selectorforbarcode" value="fillmanually" class="radiobarcodeselect"><label for="fillmanually"> '.$langs->trans("FillBarCodeTypeAndValueManually").'</label>';
403print '<br>';
404
405if ($user->hasRight('produit', 'lire') || $user->hasRight('service', 'lire')) {
406 print '<input id="fillfromproduct" type="radio" '.((GETPOST("selectorforbarcode") == 'fillfromproduct') ? 'checked ' : '').'name="selectorforbarcode" value="fillfromproduct" class="radiobarcodeselect"><label for="fillfromproduct"> '.$langs->trans("FillBarCodeTypeAndValueFromProduct").'</label>';
407 print '<br>';
408 print '<div class="showforproductselector">';
409 $form->select_produits(GETPOST('productid', 'int'), 'productid', '', '', 0, -1, 2, '', 0, array(), 0, '1', 0, 'minwidth400imp', 1);
410 print ' &nbsp; <input type="submit" class="button small" id="submitproduct" name="submitproduct" value="'.(dol_escape_htmltag($langs->trans("GetBarCode"))).'">';
411 print '</div>';
412}
413
414if ($user->hasRight('societe', 'lire')) {
415 print '<input id="fillfromthirdparty" type="radio" '.((GETPOST("selectorforbarcode") == 'fillfromthirdparty') ? 'checked ' : '').'name="selectorforbarcode" value="fillfromthirdparty" class="radiobarcodeselect"><label for="fillfromthirdparty"> '.$langs->trans("FillBarCodeTypeAndValueFromThirdParty").'</label>';
416 print '<br>';
417 print '<div class="showforthirdpartyselector">';
418 print $form->select_company(GETPOST('socid', 'int'), 'socid', '', 'SelectThirdParty', 0, 0, array(), 0, 'minwidth300');
419 print ' &nbsp; <input type="submit" id="submitthirdparty" name="submitthirdparty" class="button showforthirdpartyselector small" value="'.(dol_escape_htmltag($langs->trans("GetBarCode"))).'">';
420 print '</div>';
421}
422
423print '<br>';
424
425if ($producttmp->id > 0) {
426 print $langs->trans("BarCodeDataForProduct", '').' '.$producttmp->getNomUrl(1).'<br>';
427}
428if ($thirdpartytmp->id > 0) {
429 print $langs->trans("BarCodeDataForThirdparty", '').' '.$thirdpartytmp->getNomUrl(1).'<br>';
430}
431
432print '<div class="tagtable">';
433
434// Barcode type
435print ' <div class="tagtr">';
436print ' <div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
437print $langs->trans("BarcodeType").' &nbsp; ';
438print '</div><div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
439require_once DOL_DOCUMENT_ROOT.'/core/class/html.formbarcode.class.php';
440$formbarcode = new FormBarCode($db);
441print $formbarcode->selectBarcodeType($fk_barcode_type, 'fk_barcode_type', 1);
442print '</div></div>';
443
444// Barcode value
445print ' <div class="tagtr">';
446print ' <div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
447print $langs->trans("BarcodeValue").' &nbsp; ';
448print '</div><div class="tagtd" style="overflow: hidden; white-space: nowrap; max-width: 300px;">';
449print '<input size="16" type="text" name="forbarcode" id="forbarcode" value="'.$forbarcode.'">';
450print '</div></div>';
451
452/*
453$barcodestickersmask=GETPOST('barcodestickersmask');
454print '<br>'.$langs->trans("BarcodeStickersMask").':<br>';
455print '<textarea cols="40" type="text" name="barcodestickersmask" value="'.GETPOST('barcodestickersmask').'">'.$barcodestickersmask.'</textarea>';
456print '<br>';
457*/
458
459print '</div>';
460
461print '<br><input type="submit" class="button" id="submitformbarcodegen" '.((GETPOST("selectorforbarcode") && GETPOST("selectorforbarcode")) ? '' : 'disabled ').'value="'.$langs->trans("BuildPageToPrint").'">';
462
463print '</form>';
464print '<br>';
465
466// End of page
467llxFooter();
468$db->close();
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage barcode HTML.
Class to manage generation of HTML components Only common components must be here.
Class of a generic business object.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_is_file($pathoffile)
Return if path is a file.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
doc_label_pdf_create($db, $arrayofrecords, $modele, $outputlangs, $outputdir='', $template='standardlabel', $filename='tmp_address_sheet.pdf')
Create a document onto disk according to template module.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.