dolibarr 24.0.0-beta
targetemailing.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2005-2024 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2010 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2014 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.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 */
22
29// Load Dolibarr environment
30require '../../main.inc.php';
38require_once DOL_DOCUMENT_ROOT.'/core/modules/mailings/modules_mailings.php';
39require_once DOL_DOCUMENT_ROOT.'/comm/mailing/class/mailing.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmailing.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/emailing.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
43require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
44require_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
45
46// Load translation files required by the page
47$langs->loadLangs(array("mails", "admin"));
48
49$action = GETPOST('action', 'aZ09');
50$toselect = GETPOST('toselect', 'array:int'); // Array of ids of elements selected into a list
51$contextpage = GETPOST('contextpage', 'aZ');
52$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
53$mode = GETPOST('mode', 'aZ'); // The display mode ('list', 'kanban', 'hierarchy', 'calendar', 'gantt', ...)
54
55// Load variable for pagination
56$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
57$sortfield = GETPOST('sortfield', 'aZ09comma');
58$sortorder = GETPOST('sortorder', 'aZ09comma');
59$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
60if (empty($page) || $page == -1) {
61 $page = 0;
62} // If $page is not defined, or '' or -1
63$offset = $limit * $page;
64$pageprev = $page - 1;
65$pagenext = $page + 1;
66if (!$sortfield) {
67 $sortfield = "mc.statut,email";
68}
69if (!$sortorder) {
70 $sortorder = "DESC,ASC";
71}
72
73$id = GETPOSTINT('id');
74$rowid = GETPOSTINT('rowid');
75$search_lastname = GETPOST("search_lastname", 'alphanohtml');
76$search_firstname = GETPOST("search_firstname", 'alphanohtml');
77$search_email = GETPOST("search_email", 'alphanohtml');
78$search_other = GETPOST("search_other", 'alphanohtml');
79$search_dest_status = GETPOST('search_dest_status', 'int');
80
81// Search modules dirs
82$modulesdir = dolGetModulesDirs('/mailings');
83
84$object = new Mailing($db);
85$result = $object->fetch($id);
86
87// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
88$hookmanager->initHooks(array('ciblescard', 'globalcard'));
89
90$sqlmessage = '';
91$mesgs = array();
92
93// List of sending methods
94$listofmethods = array();
95//$listofmethods['default'] = $langs->trans('DefaultOutgoingEmailSetup');
96$listofmethods['mail'] = 'PHP mail function';
97//$listofmethods['simplemail']='Simplemail class';
98$listofmethods['smtps'] = 'SMTP/SMTPS socket library';
99if (version_compare(phpversion(), '7.0', '>=')) {
100 $listofmethods['swiftmailer'] = 'Swift Mailer socket library';
101}
102
103$arrayfields = array();
104
105// Security check
106if (!$user->hasRight('mailing', 'lire') || (!getDolGlobalString('EXTERNAL_USERS_ARE_AUTHORIZED') && $user->socid > 0)) {
108}
109if (empty($action) && empty($object->id)) {
110 accessforbidden('Object not found');
111}
112
113$permissiontoread = $user->hasRight('mailing', 'lire');
114$permissiontocreate = $user->hasRight('mailing', 'creer');
115$permissiontovalidatesend = $user->hasRight('mailing', 'valider');
116$permissiontodelete = $user->hasRight('mailing', 'supprimer');
117
118
119/*
120 * Actions
121 */
122if (GETPOST('cancel', 'alpha')) {
123 $action = 'list';
124 $massaction = '';
125}
126if (!GETPOST('confirmmassaction', 'alpha')) {
127 $massaction = '';
128}
129
130if ($action == 'add' && $permissiontocreate) { // Add recipients
131 $module = GETPOST("module", 'alpha');
132 $result = -1;
133 $obj = null;
134
135 foreach ($modulesdir as $dir) {
136 // Load modules attributes in arrays (name, numero, orders) from dir directory
137 //print $dir."\n<br>";
138 dol_syslog("Scan directory ".$dir." for modules");
139
140 // Loading Class
141 $file = $dir."/".$module.".modules.php";
142 $classname = "mailing_".$module;
143
144 if (file_exists($file)) {
145 include_once $file;
146
147 // Add targets into database
148 dol_syslog("Call add_to_target() on class ".$classname." evenunsubscribe=".$object->evenunsubscribe);
149
150 $obj = null;
151 if (class_exists($classname)) {
152 $obj = new $classname($db);
153 '@phan-var-force MailingTargets $obj';
154 $obj->evenunsubscribe = $object->evenunsubscribe;
155
156 $result = $obj->add_to_target($id);
157
158 $sqlmessage = $obj->sql;
159 } else {
160 $result = -1;
161 break;
162 }
163 }
164 }
165 if ($result > 0) {
166 // If status of emailing is sent completely, change to to send partially
167 if ($object->status == $object::STATUS_SENTCOMPLETELY) {
168 $object->setStatut($object::STATUS_SENTPARTIALY);
169 }
170
171 setEventMessages($langs->trans("XTargetsAdded", $result), null, 'mesgs');
172 $action = '';
173 }
174 if ($result == 0) {
175 setEventMessages($langs->trans("WarningNoEMailsAdded"), null, 'warnings');
176 }
177 if ($result < 0 && is_object($obj)) {
178 setEventMessages($langs->trans("Error").($obj->error ? ' '.$obj->error : ''), null, 'errors');
179 }
180}
181
182if (GETPOSTINT('clearlist') && $permissiontocreate) {
183 // Loading Class
184 $obj = new MailingTargets($db);
185 $obj->clear_target($id);
186 /* Avoid this to allow reposition
187 header("Location: ".$_SERVER['PHP_SELF']."?id=".$id);
188 exit;
189 */
190}
191
192if (GETPOSTINT('exportcsv') && $permissiontoread) { // @phpstan-ignore-line
193 $completefilename = 'targets_emailing'.$object->id.'_'.dol_print_date(dol_now(), 'dayhourlog').'.csv';
194 header('Content-Type: text/csv');
195 header('Content-Disposition: attachment;filename='.$completefilename);
196
197 // List of selected targets
198 $sql = "SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
199 $sql .= " mc.source_id, mc.source_type, mc.error_text";
200 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
201 $sql .= " WHERE mc.fk_mailing = ".((int) $object->id);
202 $sql .= $db->order($sortfield, $sortorder);
203
204 $resql = $db->query($sql);
205 if ($resql) {
206 $num = $db->num_rows($resql);
207 $sep = ',';
208
209 while ($obj = $db->fetch_object($resql)) {
210 print $obj->rowid.$sep;
211 print '"'.$obj->lastname.'"'.$sep;
212 print '"'.$obj->firstname.'"'.$sep;
213 print $obj->email.$sep;
214 print $obj->other.$sep;
215 print $obj->tms.$sep;
216 print $obj->source_type.$sep;
217 print $obj->source_id.$sep;
218 print $obj->date_envoi.$sep;
219 print $obj->status.$sep;
220 print '"'.$obj->error_text.'"'.$sep;
221 print "\n";
222 }
223
224 exit;
225 } else {
227 }
228 exit;
229}
230
231if ($action == 'delete' && $permissiontocreate) {
232 // Ici, rowid indique le destinataire et id le mailing
233 $sql = "DELETE FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE rowid = ".((int) $rowid);
234 $resql = $db->query($sql);
235 if ($resql) {
236 if (!empty($id)) {
237 $obj = new MailingTargets($db);
238 $obj->update_nb($id);
239
240 setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
241 } else {
242 header("Location: list.php");
243 exit;
244 }
245 } else {
247 }
248}
249
250if ($action == "confirm_reset_target" && $permissiontocreate) {
251 if ($object->id > 0) {
252 $db->begin();
253 $nbok = 0;
254 $error = 0;
255 foreach ($toselect as $toselectid) {
256 $result = $object->resetTargetErrorStatus($user, $toselectid);
257 if ($result < 0) {
258 setEventMessages($object->error, $object->errors, 'errors');
259 $error++;
260 break;
261 } elseif ($result > 0) {
262 $nbok++;
263 } else {
264 setEventMessages($object->error, $object->errors, 'errors');
265 $error++;
266 }
267 }
268 if (!$error) {
269 setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
270 $db->commit();
271 } else {
272 $db->rollback();
273 }
274 }
275}
276
277// Purge search criteria
278if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
279 $search_lastname = '';
280 $search_firstname = '';
281 $search_email = '';
282 $search_other = '';
283 $search_dest_status = '';
284 $toselect = array();
285}
286
287// Action update description of emailing
288if (($action == 'settitle' || $action == 'setemail_from' || $action == 'setemail_replyto' || $action == 'setemail_errorsto' || $action == 'setevenunsubscribe') && $permissiontocreate) {
289 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
290
291 $mesg = '';
292 if ($action == 'settitle') { // Test on permission already done
293 $object->title = trim(GETPOST('title', 'alpha'));
294 } elseif ($action == 'setemail_from') { // Test on permission already done
295 $object->email_from = trim(GETPOST('email_from', 'alphawithlgt')); // Must allow 'name <email>'
296 } elseif ($action == 'setemail_replyto') { // Test on permission already done
297 $object->email_replyto = trim(GETPOST('email_replyto', 'alphawithlgt')); // Must allow 'name <email>'
298 } elseif ($action == 'setemail_errorsto') { // Test on permission already done
299 $object->email_errorsto = trim(GETPOST('email_errorsto', 'alphawithlgt')); // Must allow 'name <email>'
300 } elseif ($action == 'setevenunsubscribe') { // Test on permission already done
301 $object->evenunsubscribe = (GETPOST('evenunsubscribe') ? 1 : 0);
302 }
303 if ($action == 'settitle' && empty($object->title)) { // Test on permission already done
304 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
305 }
306 if ($action == 'setemail_from' && empty($object->email_from)) { // Test on permission already done
307 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailFrom"));
308 }
309
310 if (!$mesg) {
311 $result = $object->update($user);
312 if ($result >= 0) {
313 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
314 exit;
315 }
316 $mesg = $object->error;
317 }
318
319 setEventMessages($mesg, $mesgs, 'errors');
320 $action = "";
321}
322
323
324/*
325 * View
326 */
327
328$form = new Form($db);
329$formmailing = new FormMailing($db);
330
331$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
332llxHeader('', $langs->trans("Mailing"), $help_url);
333
334$arrayofselected = is_array($toselect) ? $toselect : array();
335$totalarray = [
336 'nbfield' => 0,
337];
338
339if ($object->fetch($id) >= 0) {
340 $head = emailing_prepare_head($object);
341
342 print dol_get_fiche_head($head, 'targets', $langs->trans("Mailing"), -1, $object->picto);
343
344 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
345
346 $morehtmlref = '<div class="refidno">';
347 // Ref customer
348 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, 0, 'string', '', 0, 1);
349 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, 0, 'string', '', null, null, '', 1);
350 $morehtmlref .= '</div>';
351
352 $morehtmlstatus = '';
353 $nbtry = $nbok = 0;
354 if ($object->status == $object::STATUS_SENTPARTIALY || $object->status == $object::STATUS_SENTCOMPLETELY) {
355 $nbtry = $object->countNbOfTargets('alreadysent');
356 $nbko = $object->countNbOfTargets('alreadysentko');
357 $nbok = ($nbtry - $nbko);
358
359 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
360 if ($nbko) {
361 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
362 }
363 $morehtmlstatus .= ') &nbsp; ';
364 }
365
366 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
367
368 print '<div class="fichecenter">';
369 print '<div class="fichehalfleft">';
370 print '<div class="underbanner clearboth"></div>';
371
372 print '<table class="border centpercent tableforfield">'."\n";
373
374 // From
375 print '<tr><td class="titlefield">';
376 print $langs->trans("MailFrom").'</td><td>';
377 $emailarray = CMailFile::getArrayAddress($object->email_from);
378 foreach ($emailarray as $email => $name) {
379 if ($name && $name != $email) {
380 print dol_escape_htmltag($name).' &lt;'.$email;
381 print '&gt;';
382 if (!isValidEmail($email)) {
383 $langs->load("errors");
384 print img_warning($langs->trans("ErrorBadEMail", $email));
385 }
386 } else {
387 print dol_print_email($object->email_from, 0, 0, 0, 0, 1);
388 }
389 }
390
391 print '</td></tr>';
392
393 // Errors to
394 if ($object->messtype != 'sms') {
395 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
396 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
397 foreach ($emailarray as $email => $name) {
398 if ($name != $email) {
399 print dol_escape_htmltag((string) $name).' &lt;'.$email;
400 print '&gt;';
401 if ($email && !isValidEmail($email)) {
402 $langs->load("errors");
403 print img_warning($langs->trans("ErrorBadEMail", $email));
404 } elseif ($email && !isValidMailDomain($email)) {
405 $langs->load("errors");
406 print img_warning($langs->trans("ErrorBadMXDomain", $email));
407 }
408 } else {
409 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
410 }
411 }
412 print '</td></tr>';
413 }
414
415 // Reply to
416 if ($object->messtype != 'sms') {
417 print '<tr><td>';
418 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
419 print '</td><td>';
420 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
421 $email = CMailFile::getValidAddress($object->email_replyto, 2);
422 if ($action != 'editemail_replyto') {
423 if ($email && !isValidEmail($email)) {
424 $langs->load("errors");
425 print img_warning($langs->trans("ErrorBadEMail", $email));
426 } elseif ($email && !isValidMailDomain($email)) {
427 $langs->load("errors");
428 print img_warning($langs->trans("ErrorBadMXDomain", $email));
429 }
430 }
431 print '</td></tr>';
432 }
433
434 print '</table>';
435 print '</div>';
436
437
438 print '<div class="fichehalfright">';
439 print '<div class="underbanner clearboth"></div>';
440
441 print '<table class="border centpercent tableforfield">';
442
443 // Number of distinct emails
444 print '<tr><td>';
445 print $langs->trans("TotalNbOfDistinctRecipients");
446 print '</td><td>';
447 $nbemail = ($object->nbemail ? $object->nbemail : 0);
448 if (is_numeric($nbemail)) {
449 $htmltooltip = '';
450 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
451 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
452 $htmltooltip .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
453 } else {
454 $htmltooltip .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
455 }
456 }
457 if (empty($nbemail)) {
458 $nbemail .= ' '.img_warning($langs->trans('ToAddRecipientsChooseHere'));//.' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
459 }
460 if ($htmltooltip) {
461 print $form->textwithpicto($nbemail, $htmltooltip, 1, 'info');
462 } else {
463 print $nbemail;
464 }
465 }
466 print '</td></tr>';
467
468 print '<tr><td>';
469 print $langs->trans("MAIN_MAIL_SENDMODE");
470 print '</td><td>';
471 if ($object->messtype != 'sms') {
472 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
473 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
474 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
475 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
476 } else {
477 $text = $listofmethods['mail'];
478 }
479 print $text;
480 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
481 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
482 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
483 }
484 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
485 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
486 }
487 } else {
488 print 'SMS ';
489 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
490 }
491 print '</td></tr>';
492
493 // Other attributes. Fields from hook formObjectOptions and Extrafields.
494 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
495
496 print '</table>';
497 print '</div>';
498 print '</div>';
499
500 print '<div class="clearboth"></div>';
501
502 print dol_get_fiche_end();
503
504 print '<br>';
505
506
507 $newcardbutton = '';
508 $allowaddtarget = ($object->status == $object::STATUS_DRAFT);
509 if (GETPOST('allowaddtarget')) {
510 $allowaddtarget = 1;
511 }
512 if (!$allowaddtarget) {
513 $newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?id='.$object->id.'&allowaddtarget=1', '', $user->hasRight('mailing', 'creer'));
514 }
515
516 // Show email selectors
517 if ($allowaddtarget && $user->hasRight('mailing', 'creer')) {
518 print load_fiche_titre($langs->trans("ToAddRecipientsChooseHere").'...', ($user->admin ? info_admin($langs->trans("YouCanAddYourOwnPredefindedListHere"), 1) : ''), '');
519
520 print '<div class="div-table-responsive">';
521 print '<div class="tagtable centpercentwithout1imp liste_titre_bydiv borderbottom" id="tablelines">';
522
523 print '<div class="tagtr liste_titre">';
524 print '<div class="tagtd"></div>';
525 print '<div class="tagtd">'.$langs->trans("RecipientSelectionModules").'</div>';
526 print '<div class="tagtd center maxwidth150">';
527 if ($object->messtype != 'sms') {
528 print $langs->trans("NbOfUniqueEMails");
529 } else {
530 print $langs->trans("NbOfUniquePhones");
531 }
532 print '</div>';
533 print '<div class="tagtd left"><div class="inline-block">'.$langs->trans("Filters").'</div>';
534 if ($object->messtype != 'sms') {
535 print ' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <div class="inline-block valignmiddle">'.$langs->trans("EvenUnsubscribe").' ';
536 print ajax_object_onoff($object, 'evenunsubscribe', 'evenunsubscribe', 'EvenUnsubscribe:switch_on:warning', 'EvenUnsubscribe', array(), 'small valignmiddle reposition', '', 1);
537 print '</div>';
538 }
539 print '</div>';
540 print '<div class="tagtd">&nbsp;</div>';
541 print '</div>'; // End tr
542
543 clearstatcache();
544
545 foreach ($modulesdir as $dir) {
546 $modulenames = array();
547
548 // Load modules attributes in arrays (name, numero, orders) from dir directory
549 //print $dir."\n<br>";
550 dol_syslog("Scan directory ".$dir." for modules");
551 $handle = @opendir($dir);
552 if (is_resource($handle)) {
553 while (($file = readdir($handle)) !== false) {
554 if (substr($file, 0, 1) != '.' && substr($file, 0, 3) != 'CVS') {
555 $reg = array();
556 if (preg_match("/(.*)\.modules\.php$/i", $file, $reg)) {
557 if ($reg[1] == 'example') {
558 continue;
559 }
560 $modulenames[] = $reg[1];
561 }
562 }
563 }
564 closedir($handle);
565 }
566
567 // Sort $modulenames
568 sort($modulenames);
569
570 // Loop on each submodule
571 foreach ($modulenames as $modulename) {
572 // Loading Class
573 $file = $dir.$modulename.".modules.php";
574 $classname = "mailing_".$modulename;
575 require_once $file;
576
577 $obj = new $classname($db);
578 '@phan-var-force MailingTargets $obj';
579
580 // Check if qualified
581 $qualified = (is_null($obj->enabled) ? 1 : (int) dol_eval((string) $obj->enabled, 1));
582
583 // Check dependencies
584 foreach ($obj->require_module as $key) {
585 if (empty($conf->$key->enabled) || (empty($user->admin) && $obj->require_admin)) {
586 $qualified = 0;
587 //print "Les prerequis d'activation du module mailing ne sont pas respectes. Il ne sera pas actif";
588 break;
589 }
590 }
591
592 // If module is qualified
593 if ($qualified) {
594 if ($allowaddtarget) {
595 print '<form class="oddeven trforbreakperms trforbreaknobg impair tagtr" name="'.$modulename.'" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&module='.$modulename.'" method="POST" enctype="multipart/form-data">';
596 print '<input type="hidden" name="token" value="'.newToken().'">';
597 print '<input type="hidden" name="action" value="add">';
598 print '<input type="hidden" name="page_y" value="'.newToken().'">';
599 } else {
600 print '<div class="oddeven trforbreakperms trforbreaknobg impair tagtr">';
601 }
602
603 print '<div class="tagtd paddingleftlarge marginleftonly paddingrightlarge marginrightonly valignmiddle center">';
604 if (empty($obj->picto)) {
605 $obj->picto = 'generic';
606 }
607 print img_object($langs->trans("EmailingTargetSelector").': '.get_class($obj), $obj->picto, 'class="valignmiddle width25 size15x"');
608 print '</div>';
609 print '<div class="tagtd valignmiddle">'; // style="height: 4em"
610 print $obj->getDesc();
611 print '</div>';
612
613 $nbofrecipient = -1;
614
615 try {
616 $obj->evenunsubscribe = $object->evenunsubscribe; // Set flag to include/exclude email that has opt-out.
617
618 $nbofrecipient = $obj->getNbOfRecipients('');
619 } catch (Exception $e) {
620 dol_syslog($e->getMessage(), LOG_ERR);
621 }
622
623 print '<div class="tagtd center valignmiddle">';
624 if ($nbofrecipient === '' || $nbofrecipient >= 0) {
625 if ($nbofrecipient !== '') {
626 print '<span class="badge badge-info">'.$nbofrecipient.'</span>';
627 }
628 } else {
629 print $langs->trans("Error").' '.img_error($obj->error);
630 }
631 print '</div>';
632
633 print '<div class="tagtd left valignmiddle">';
634 if ($allowaddtarget) {
635 $filter = false;
636 try {
637 $filter = $obj->formFilter();
638 } catch (Exception $e) {
639 dol_syslog($e->getMessage(), LOG_ERR);
640 }
641 if ($filter) {
642 print $filter;
643 } else {
644 print $langs->trans("None");
645 }
646 }
647 print '</div>';
648
649 print '<div class="tagtd right valignmiddle">';
650 if ($allowaddtarget) {
651 print '<input type="submit" class="button button-add small reposition" name="button_'.$modulename.'" value="'.$langs->trans("Add").'">';
652 } else {
653 print '<input type="submit" class="button small disabled" disabled="disabled" name="button_'.$modulename.'" value="'.$langs->trans("Add").'">';
654 //print $langs->trans("MailNoChangePossible");
655 print "&nbsp;";
656 }
657 print '</div>';
658
659 if ($allowaddtarget) {
660 print '</form>';
661 } else {
662 print '</div>';
663 }
664 }
665 }
666 } // End foreach dir
667
668 $parameters = array();
669 $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
670 print $hookmanager->resPrint;
671
672 print '</div>'; // End table
673 print '</div>';
674
675 print '<br>';
676
677 if ($sqlmessage && $user->admin) {
678 print info_admin($langs->trans("SQLUsedForExport").':<br> '.$sqlmessage, 0, 0, '1', '', 'TechnicalInformation');
679 print '<br>';
680 }
681
682 print '<br><br>';
683 }
684
685
686
687 // List of selected targets
688 $sql = "SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
689 $sql .= " mc.source_url, mc.source_id, mc.source_type, mc.error_text,";
690 $sql .= " COUNT(mu.rowid) as nb";
691 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
692 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mailing_unsubscribe as mu ON mu.email = mc.email";
693 $sql .= " WHERE mc.fk_mailing=".((int) $object->id);
694 $asearchcriteriahasbeenset = 0;
695 if ($search_lastname) {
696 $sql .= natural_search("mc.lastname", $search_lastname);
697 $asearchcriteriahasbeenset++;
698 }
699 if ($search_firstname) {
700 $sql .= natural_search("mc.firstname", $search_firstname);
701 $asearchcriteriahasbeenset++;
702 }
703 if ($search_email) {
704 $sql .= natural_search("mc.email", $search_email);
705 $asearchcriteriahasbeenset++;
706 }
707 if ($search_other) {
708 $sql .= natural_search("mc.other", $search_other);
709 $asearchcriteriahasbeenset++;
710 }
711 if ($search_dest_status != '' && (int) $search_dest_status >= -1) {
712 $sql .= " AND mc.statut = ".((int) $search_dest_status);
713 $asearchcriteriahasbeenset++;
714 }
715 $sql .= ' GROUP BY mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut, mc.date_envoi, mc.tms, mc.source_url, mc.source_id, mc.source_type, mc.error_text';
716 $sql .= $db->order($sortfield, $sortorder);
717
718
719 // Count total nb of records
720 $nbtotalofrecords = '';
721 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
722 $result = $db->query($sql);
723 $nbtotalofrecords = $db->num_rows($result);
724 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
725 $page = 0;
726 $offset = 0;
727 }
728
729 // Fix/update nbemail on emailing record if it differs (may happen if user edit lines from database directly)
730 if (empty($asearchcriteriahasbeenset)) {
731 if ($nbtotalofrecords != $object->nbemail) {
732 dol_syslog("We found a difference in nb of record in target table and the property ->nbemail, we fix ->nbemail");
733 //print "nbemail=".$object->nbemail." nbtotalofrecords=".$nbtotalofrecords;
734 $resultrefresh = $object->refreshNbOfTargets();
735 if ($resultrefresh < 0) {
736 dol_print_error($db, $object->error, $object->errors);
737 }
738 }
739 }
740 }
741
742 //$nbtotalofrecords=$object->nbemail; // nbemail is a denormalized field storing nb of targets
743 $sql .= $db->plimit($limit + 1, $offset);
744
745 $resql = $db->query($sql);
746 if ($resql) {
747 $num = $db->num_rows($resql);
748
749 $param = "&id=".$object->id;
750 //if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage);
751 if ($limit > 0 && $limit != $conf->liste_limit) {
752 $param .= '&limit='.((int) $limit);
753 }
754 if ($search_lastname) {
755 $param .= "&search_lastname=".urlencode($search_lastname);
756 }
757 if ($search_firstname) {
758 $param .= "&search_firstname=".urlencode($search_firstname);
759 }
760 if ($search_email) {
761 $param .= "&search_email=".urlencode($search_email);
762 }
763 if ($search_other) {
764 $param .= "&search_other=".urlencode($search_other);
765 }
766
767 print '<form method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
768 print '<input type="hidden" name="token" value="'.newToken().'">';
769 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
770 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
771 print '<input type="hidden" name="page" value="'.$page.'">';
772 print '<input type="hidden" name="id" value="'.$object->id.'">';
773 print '<input type="hidden" name="page_y" value="">';
774
775 $morehtmlcenter = '';
776 $arrayofmassactions = array();
777 if ($permissiontocreate) {
778 $arrayofmassactions['reset_target'] = img_picto('', 'refresh', 'class="pictofixedwidth"').$langs->trans("ResetMailingTargetMassaction");
779 }
780 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
781 $morehtmlcenter .= $massactionbutton .'<br>';
782
783 if ($object->status == $object::STATUS_DRAFT) {
784 $morehtmlcenter = '<span class="opacitymedium hideonsmartphone">'.$langs->trans("ToClearAllRecipientsClickHere").'</span> <a href="'.$_SERVER["PHP_SELF"].'?clearlist=1&id='.$object->id.'" class="button reposition smallpaddingimp">'.$langs->trans("TargetsReset").'</a>';
785 }
786
787 $morehtmlrightbeforearrow = '<a class="reposition marginrightonly" href="'.$_SERVER["PHP_SELF"].'?action=exportcsv&token='.newToken().'&exportcsv=1&id='.$object->id.'">'.img_picto('', 'download', 'class="pictofixedwidth"').$langs->trans("Download").'</a>&nbsp;';
788
789 print '</form>';
790
791 print "\n<!-- List of selected targets -->\n";
792 print '<form method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
793 print '<input type="hidden" name="token" value="'.newToken().'">';
794 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
795 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
796 print '<input type="hidden" name="page" value="'.$page.'">';
797 print '<input type="hidden" name="id" value="'.$object->id.'">';
798 print '<input type="hidden" name="limit" value="'.$limit.'">';
799 print '<input type="hidden" name="page_y" value="">';
800
801 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
802 print_barre_liste($langs->trans("MailSelectedRecipients"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $morehtmlcenter, $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit, 0, 0, 1, $morehtmlrightbeforearrow);
803
804 if ($massaction == 'reset_target') {
805 // Confirm reset
806 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ConfirmResetMailingTargetMassaction"), $langs->trans("ConfirmResetMailingTargetMassactionQuestion"), "confirm_reset_target", null, '', 0, 0, 500, 1);
807 }
808
809 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
810 $htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column ? 'left' : ''); // This also change content of $arrayfields with user setup
811 $selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
812 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
813
814 print '<div class="div-table-responsive">';
815 print '<table class="noborder centpercent">';
816
817 // Line of filters
818 print '<tr class="liste_titre_filter">';
819
820 // Action column
821 if ($conf->main_checkbox_left_column) {
822 print '<td class="liste_titre maxwidthsearch">';
823 $searchpicto = $form->showFilterButtons('left');
824 print $searchpicto;
825 print '</td>';
826 }
827 // EMail
828 print '<td class="liste_titre">';
829 print '<input class="flat maxwidth75" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).'">';
830 print '</td>';
831 // Name
832 print '<td class="liste_titre">';
833 print '<input class="flat maxwidth50" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).'">';
834 print '</td>';
835 // Firstname
836 print '<td class="liste_titre">';
837 print '<input class="flat maxwidth50" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).'">';
838 print '</td>';
839 // Other
840 print '<td class="liste_titre">';
841 print '<input class="flat maxwidth100" type="text" name="search_other" value="'.dol_escape_htmltag($search_other).'">';
842 print '</td>';
843 // Source
844 print '<td class="liste_titre">';
845 print '&nbsp;';
846 print '</td>';
847
848 // Date last update
849 print '<td class="liste_titre">';
850 print '&nbsp;';
851 print '</td>';
852
853 // Date sending
854 print '<td class="liste_titre">';
855 print '&nbsp;';
856 print '</td>';
857
858 // Status
859 print '<td class="liste_titre center parentonrightofpage">';
860 print $formmailing->selectDestinariesStatus($search_dest_status, 'search_dest_status', 1, 'width100 onrightofpage');
861 print '</td>';
862
863 // Action column
864 if (!$conf->main_checkbox_left_column) {
865 print '<td class="liste_titre maxwidthsearch">';
866 $searchpicto = $form->showFilterButtons();
867 print $searchpicto;
868 print '</td>';
869 }
870
871 print '</tr>';
872
873 if ($page) {
874 $param .= "&page=".urlencode((string) ($page));
875 }
876
877 print '<tr class="liste_titre">';
878 // Action column
879 if ($conf->main_checkbox_left_column) {
880 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
881 $totalarray['nbfield']++;
882 }
883 print_liste_field_titre("EMail", $_SERVER["PHP_SELF"], "mc.email", '', $param, "", $sortfield, $sortorder);
884 print_liste_field_titre("Lastname", $_SERVER["PHP_SELF"], "mc.lastname", '', $param, "", $sortfield, $sortorder);
885 print_liste_field_titre("Firstname", $_SERVER["PHP_SELF"], "mc.firstname", '', $param, "", $sortfield, $sortorder);
886 print_liste_field_titre("OtherInformations", $_SERVER["PHP_SELF"], '', "", $param, "", $sortfield, $sortorder);
887 print_liste_field_titre("Source", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder, 'center ');
888 // Date last update
889 print_liste_field_titre("DateLastModification", $_SERVER["PHP_SELF"], "mc.tms", '', $param, '', $sortfield, $sortorder, 'center ');
890 // Date sending
891 print_liste_field_titre("DateSending", $_SERVER["PHP_SELF"], "mc.date_envoi", '', $param, '', $sortfield, $sortorder, 'center ');
892 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "mc.statut", '', $param, '', $sortfield, $sortorder, 'center ');
893 // Action column
894 if (!$conf->main_checkbox_left_column) {
895 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
896 $totalarray['nbfield']++;
897 }
898 print '</tr>';
899
900 $i = 0;
901
902 if ($num) {
903 include_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
904 include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
905 include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
906 include_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
907 include_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php';
908
909 $objectstaticmember = new Adherent($db);
910 $objectstaticuser = new User($db);
911 $objectstaticcompany = new Societe($db);
912 $objectstaticcontact = new Contact($db);
913 $objectstaticeventorganization = new ConferenceOrBoothAttendee($db);
914
915 while ($i < min($num, $limit)) {
916 $obj = $db->fetch_object($resql);
917
918 print '<tr class="oddeven">';
919
920 // Action column
921 if ($conf->main_checkbox_left_column) {
922 print '<td class="center nowraponall">';
923 print '<!-- ID mailing_cibles = '.$obj->rowid.' -->';
924 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
925 $selected = 0;
926 if (in_array($obj->rowid, $arrayofselected)) {
927 $selected = 1;
928 }
929 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
930 }
931 if ($obj->status == $object::STATUS_DRAFT) { // Not sent yet
932 if ($user->hasRight('mailing', 'creer')) {
933 print '<a class="reposition marginleftonly" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&rowid='.((int) $obj->rowid).$param.'">'.img_delete($langs->trans("RemoveRecipient")).'</a>';
934 }
935 }
936 /*if ($obj->status == -1) // Sent with error
937 {
938 print '<a href="'.$_SERVER['PHP_SELF'].'?action=retry&rowid='.$obj->rowid.$param.'">'.$langs->trans("Retry").'</a>';
939 }*/
940 print '</td>';
941 }
942
943 print '<td class="tdoverflowmax150">';
944 print img_picto($obj->email, 'email', 'class="paddingright"');
945 if ($obj->nb > 0) {
946 print img_warning($langs->trans("EmailOptedOut"), 'warning', 'pictofixedwidth');
947 }
948 print dolPrintHTML($obj->email);
949 print '</td>';
950
951 print '<td class="tdoverflowmax150" title="'.dolPrintHTMLForAttribute($obj->lastname).'">'.dolPrintHTML($obj->lastname).'</td>';
952
953 print '<td class="tdoverflowmax150" title="'.dolPrintHTMLForAttribute($obj->firstname).'">'.dolPrintHTML($obj->firstname).'</td>';
954
955 print '<td class="tdoverflowmax300" title="'.dolPrintHTMLForAttribute($obj->other).'"><span class="small">'.dolPrintHTML($obj->other).'</small></td>';
956
957 print '<td class="center tdoverflowmax150">';
958 if (empty($obj->source_id) || empty($obj->source_type)) {
959 print empty($obj->source_url) ? '' : $obj->source_url; // For backward compatibility
960 } else {
961 if ($obj->source_type == 'member') {
962 $objectstaticmember->fetch($obj->source_id);
963 print $objectstaticmember->getNomUrl(1);
964 } elseif ($obj->source_type == 'user') {
965 $objectstaticuser->fetch($obj->source_id);
966 print $objectstaticuser->getNomUrl(1);
967 } elseif ($obj->source_type == 'thirdparty') {
968 $objectstaticcompany->fetch($obj->source_id);
969 print $objectstaticcompany->getNomUrl(1);
970 } elseif ($obj->source_type == 'contact') {
971 $objectstaticcontact->fetch($obj->source_id);
972 print $objectstaticcontact->getNomUrl(1);
973 } elseif ($obj->source_type == 'eventorganizationattendee') {
974 $objectstaticeventorganization->fetch($obj->source_id);
975 print $objectstaticeventorganization->getNomUrl(1);
976 } else {
977 print $obj->source_url;
978 }
979 }
980 print '</td>';
981
982 // Date last update
983 print '<td class="center nowraponall">';
984 print dol_print_date($db->jdate($obj->tms), 'dayhour', 'tzuserrel');
985 print '</td>';
986
987 // Date sent
988 print '<td class="center nowraponall">';
989 if ($obj->status != $object::STATUS_DRAFT) { // If status of target line is not draft
990 // Date sent
991 print dol_print_date($db->jdate($obj->date_envoi), 'dayhour', 'tzuserrel'); // @TODO Must store date in date format
992 }
993 print '</td>';
994
995 // Status of recipient sending email (Warning != status of emailing)
996 print '<td class="nowrap center">';
997 if ($obj->status == $object::STATUS_DRAFT) { // If status of target line is not draft
998 print $object::libStatutDest((int) $obj->status, 2, '');
999 } else {
1000 print $object::libStatutDest((int) $obj->status, 2, $obj->error_text);
1001 }
1002 print '</td>';
1003
1004 // Action column
1005 if (!$conf->main_checkbox_left_column) {
1006 print '<td class="center nowraponall">';
1007 print '<!-- ID mailing_cibles = '.$obj->rowid.' -->';
1008 if ($obj->status == $object::STATUS_DRAFT) { // If status of target line is not sent yet
1009 if ($user->hasRight('mailing', 'creer')) {
1010 print '<a class="reposition marginleftonly" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&rowid='.((int) $obj->rowid).$param.'">'.img_delete($langs->trans("RemoveRecipient")).'</a>';
1011 }
1012 }
1013 /*if ($obj->status == -1) // Sent with error
1014 {
1015 print '<a href="'.$_SERVER['PHP_SELF'].'?action=retry&rowid='.$obj->rowid.$param.'">'.$langs->trans("Retry").'</a>';
1016 }*/
1017 print '</td>';
1018 }
1019 print '</tr>';
1020
1021 $i++;
1022 }
1023 } else {
1024 if ($object->status < $object::STATUS_SENTPARTIALY) {
1025 print '<tr><td colspan="9">';
1026 print '<span class="opacitymedium">'.$langs->trans("NoTargetYet").'</span>';
1027 print '</td></tr>';
1028 } else {
1029 print '<tr><td colspan="9">';
1030 print '<span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span>';
1031 print '</td></tr>';
1032 }
1033 }
1034 print "</table><br>";
1035 print '</div>';
1036
1037 print '</form>';
1038
1039 $db->free($resql);
1040 } else {
1042 }
1043
1044 print "\n<!-- End list of selected targets -->\n";
1045}
1046
1047// End of page
1048llxFooter();
1049$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition list.php:497
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0, $moreparam='', $readonly=0)
On/off button to change a property status of an object This uses the ajax service objectonoff....
Definition ajax.lib.php:799
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage members of a foundation.
static getValidAddress($address, $format, $encode=0, $maxnumberofemail=0)
Return a formatted address string for SMTP protocol.
static getArrayAddress($address)
Return a formatted array of address string for SMTP protocol.
Class for ConferenceOrBoothAttendee.
Class to manage contact/addresses.
Class to manage generation of HTML components Only common components must be here.
Class to offer components to list and upload files.
Class to manage emailings module.
Parent class of emailing target selectors modules.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
emailing_prepare_head(Mailing $object)
Prepare array with list of tabs.
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dolGetModulesDirs($subdir='')
Return list of directories that contain modules.
isValidMailDomain($mail)
Return true if email has a domain name that can be resolved to MX type.
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolPrintHTML($s, $allowiframe=0, $moreallowedtags=array())
Return a string (that can be on several lines) ready to be output on a HTML page.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
img_error($titlealt='default')
Show error logo.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.