dolibarr 25.0.0-alpha
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 {
226 dol_print_error($db);
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 $sql .= " AND fk_mailing = ".((int) $object->id);
235 $resql = $db->query($sql);
236 if ($resql) {
237 if (!empty($id)) {
238 $obj = new MailingTargets($db);
239 $obj->update_nb($id);
240
241 setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
242 } else {
243 header("Location: list.php");
244 exit;
245 }
246 } else {
247 dol_print_error($db);
248 }
249}
250
251if ($action == "confirm_reset_target" && $permissiontocreate) {
252 if ($object->id > 0) {
253 $db->begin();
254 $nbok = 0;
255 $error = 0;
256 foreach ($toselect as $toselectid) {
257 $result = $object->resetTargetErrorStatus($user, $toselectid);
258 if ($result < 0) {
259 setEventMessages($object->error, $object->errors, 'errors');
260 $error++;
261 break;
262 } elseif ($result > 0) {
263 $nbok++;
264 } else {
265 setEventMessages($object->error, $object->errors, 'errors');
266 $error++;
267 }
268 }
269 if (!$error) {
270 setEventMessages($langs->trans("RecordsModified", $nbok), null, 'mesgs');
271 $db->commit();
272 } else {
273 $db->rollback();
274 }
275 }
276}
277
278// Purge search criteria
279if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
280 $search_lastname = '';
281 $search_firstname = '';
282 $search_email = '';
283 $search_other = '';
284 $search_dest_status = '';
285 $toselect = array();
286}
287
288// Action update description of emailing
289if (($action == 'settitle' || $action == 'setemail_from' || $action == 'setemail_replyto' || $action == 'setemail_errorsto' || $action == 'setevenunsubscribe') && $permissiontocreate) {
290 $upload_dir = $conf->mailing->dir_output."/".get_exdir($object->id, getDolGlobalInt('MAILING_USE_NEW_PATH_FOR_FILES') ? 0 : 2, 0, 1, $object, 'mailing');
291
292 $mesg = '';
293 if ($action == 'settitle') { // Test on permission already done
294 $object->title = trim(GETPOST('title', 'alpha'));
295 } elseif ($action == 'setemail_from') { // Test on permission already done
296 $object->email_from = trim(GETPOST('email_from', 'alphawithlgt')); // Must allow 'name <email>'
297 } elseif ($action == 'setemail_replyto') { // Test on permission already done
298 $object->email_replyto = trim(GETPOST('email_replyto', 'alphawithlgt')); // Must allow 'name <email>'
299 } elseif ($action == 'setemail_errorsto') { // Test on permission already done
300 $object->email_errorsto = trim(GETPOST('email_errorsto', 'alphawithlgt')); // Must allow 'name <email>'
301 } elseif ($action == 'setevenunsubscribe') { // Test on permission already done
302 $object->evenunsubscribe = (GETPOST('evenunsubscribe') ? 1 : 0);
303 }
304 if ($action == 'settitle' && empty($object->title)) { // Test on permission already done
305 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailTitle"));
306 }
307 if ($action == 'setemail_from' && empty($object->email_from)) { // Test on permission already done
308 $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentities("MailFrom"));
309 }
310
311 if (!$mesg) {
312 $result = $object->update($user);
313 if ($result >= 0) {
314 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
315 exit;
316 }
317 $mesg = $object->error;
318 }
319
320 setEventMessages($mesg, $mesgs, 'errors');
321 $action = "";
322}
323
324
325/*
326 * View
327 */
328
329$form = new Form($db);
330$formmailing = new FormMailing($db);
331
332$help_url = 'EN:Module_EMailing|FR:Module_Mailing|ES:M&oacute;dulo_Mailing';
333llxHeader('', $langs->trans("Mailing"), $help_url);
334
335$arrayofselected = is_array($toselect) ? $toselect : array();
336$totalarray = [
337 'nbfield' => 0,
338];
339
340if ($object->fetch($id) >= 0) {
341 $head = emailing_prepare_head($object);
342
343 print dol_get_fiche_head($head, 'targets', $langs->trans("Mailing"), -1, $object->picto);
344
345 $linkback = '<a href="'.DOL_URL_ROOT.'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
346
347 $morehtmlref = '<div class="refidno">';
348 // Ref customer
349 $morehtmlref .= $form->editfieldkey("", 'title', $object->title, $object, 0, 'string', '', 0, 1);
350 $morehtmlref .= $form->editfieldval("", 'title', $object->title, $object, 0, 'string', '', null, null, '', 1);
351 $morehtmlref .= '</div>';
352
353 $morehtmlstatus = '';
354 $nbtry = $nbok = 0;
355 if ($object->status == $object::STATUS_SENTPARTIALY || $object->status == $object::STATUS_SENTCOMPLETELY) {
356 $nbtry = $object->countNbOfTargets('alreadysent');
357 $nbko = $object->countNbOfTargets('alreadysentko');
358 $nbok = ($nbtry - $nbko);
359
360 $morehtmlstatus .= ' ('.$nbtry.'/'.$object->nbemail;
361 if ($nbko) {
362 $morehtmlstatus .= ' - '.$nbko.' '.$langs->trans("Error");
363 }
364 $morehtmlstatus .= ') &nbsp; ';
365 }
366
367 dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', $morehtmlstatus);
368
369 print '<div class="fichecenter">';
370 print '<div class="fichehalfleft">';
371 print '<div class="underbanner clearboth"></div>';
372
373 print '<table class="border centpercent tableforfield">'."\n";
374
375 // From
376 print '<tr><td class="titlefield">';
377 print $langs->trans("MailFrom").'</td><td>';
378 $emailarray = CMailFile::getArrayAddress($object->email_from);
379 foreach ($emailarray as $email => $name) {
380 if ($name && $name != $email) {
381 print dol_escape_htmltag($name).' &lt;'.$email;
382 print '&gt;';
383 if (!isValidEmail($email)) {
384 $langs->load("errors");
385 print img_warning($langs->trans("ErrorBadEMail", $email));
386 }
387 } else {
388 print dol_print_email($object->email_from, 0, 0, 0, 0, 1);
389 }
390 }
391
392 print '</td></tr>';
393
394 // Errors to
395 if ($object->messtype != 'sms') {
396 print '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
397 $emailarray = CMailFile::getArrayAddress($object->email_errorsto);
398 foreach ($emailarray as $email => $name) {
399 if ($name != $email) {
400 print dol_escape_htmltag((string) $name).' &lt;'.$email;
401 print '&gt;';
402 if ($email && !isValidEmail($email)) {
403 $langs->load("errors");
404 print img_warning($langs->trans("ErrorBadEMail", $email));
405 } elseif ($email && !isValidMailDomain($email)) {
406 $langs->load("errors");
407 print img_warning($langs->trans("ErrorBadMXDomain", $email));
408 }
409 } else {
410 print dol_print_email($object->email_errorsto, 0, 0, 0, 0, 1);
411 }
412 }
413 print '</td></tr>';
414 }
415
416 // Reply to
417 if ($object->messtype != 'sms') {
418 print '<tr><td>';
419 print $form->editfieldkey("MailReply", 'email_replyto', $object->email_replyto, $object, (int) ($user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY), 'string');
420 print '</td><td>';
421 print $form->editfieldval("MailReply", 'email_replyto', $object->email_replyto, $object, $user->hasRight('mailing', 'creer') && $object->status < $object::STATUS_SENTCOMPLETELY, 'string');
422 $email = CMailFile::getValidAddress($object->email_replyto, 2);
423 if ($action != 'editemail_replyto') {
424 if ($email && !isValidEmail($email)) {
425 $langs->load("errors");
426 print img_warning($langs->trans("ErrorBadEMail", $email));
427 } elseif ($email && !isValidMailDomain($email)) {
428 $langs->load("errors");
429 print img_warning($langs->trans("ErrorBadMXDomain", $email));
430 }
431 }
432 print '</td></tr>';
433 }
434
435 print '</table>';
436 print '</div>';
437
438
439 print '<div class="fichehalfright">';
440 print '<div class="underbanner clearboth"></div>';
441
442 print '<table class="border centpercent tableforfield">';
443
444 // Number of distinct emails
445 print '<tr><td>';
446 print $langs->trans("TotalNbOfDistinctRecipients");
447 print '</td><td>';
448 $nbemail = ($object->nbemail ? $object->nbemail : 0);
449 if (is_numeric($nbemail)) {
450 $htmltooltip = '';
451 if ((getDolGlobalString('MAILING_LIMIT_SENDBYWEB') && getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') < $nbemail) && ($object->status == 1 || ($object->status == 2 && $nbtry < $nbemail))) {
452 if (getDolGlobalInt('MAILING_LIMIT_SENDBYWEB') > 0) {
453 $htmltooltip .= $langs->trans('LimitSendingEmailing', getDolGlobalString('MAILING_LIMIT_SENDBYWEB'));
454 } else {
455 $htmltooltip .= $langs->trans('SendingFromWebInterfaceIsNotAllowed');
456 }
457 }
458 if (empty($nbemail)) {
459 $nbemail .= ' '.img_warning($langs->trans('ToAddRecipientsChooseHere'));//.' <span class="warning">'.$langs->trans("NoTargetYet").'</span>';
460 }
461 if ($htmltooltip) {
462 print $form->textwithpicto($nbemail, $htmltooltip, 1, 'info');
463 } else {
464 print $nbemail;
465 }
466 }
467 print '</td></tr>';
468
469 print '<tr><td>';
470 print $langs->trans("MAIN_MAIL_SENDMODE");
471 print '</td><td>';
472 if ($object->messtype != 'sms') {
473 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') && getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
474 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING')];
475 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE')) {
476 $text = $listofmethods[getDolGlobalString('MAIN_MAIL_SENDMODE')];
477 } else {
478 $text = $listofmethods['mail'];
479 }
480 print $text;
481 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'default') {
482 if (getDolGlobalString('MAIN_MAIL_SENDMODE_EMAILING') != 'mail') {
483 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER_EMAILING', getDolGlobalString('MAIN_MAIL_SMTP_SERVER')).')</span>';
484 }
485 } elseif (getDolGlobalString('MAIN_MAIL_SENDMODE') != 'mail' && getDolGlobalString('MAIN_MAIL_SMTP_SERVER')) {
486 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
487 }
488 } else {
489 print 'SMS ';
490 print ' <span class="opacitymedium">('.getDolGlobalString('MAIN_MAIL_SMTP_SERVER').')</span>';
491 }
492 print '</td></tr>';
493
494 // Other attributes. Fields from hook formObjectOptions and Extrafields.
495 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
496
497 print '</table>';
498 print '</div>';
499 print '</div>';
500
501 print '<div class="clearboth"></div>';
502
503 print dol_get_fiche_end();
504
505
506 $newcardbutton = '';
507 $allowaddtarget = ($object->status == $object::STATUS_DRAFT);
508 if (GETPOST('allowaddtarget')) {
509 $allowaddtarget = 1;
510 }
511 if (!$allowaddtarget) {
512 $newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', $_SERVER["PHP_SELF"].'?id='.$object->id.'&allowaddtarget=1', '', $user->hasRight('mailing', 'creer'));
513 }
514
515 // Show email selectors
516 if ($allowaddtarget && $user->hasRight('mailing', 'creer')) {
517 print '<div class="info">';
518 print $langs->trans("ToAddRecipientsChooseHere").'...';
519 //print ($user->admin ? info_admin($langs->trans("YouCanAddYourOwnPredefindedListHere"), 1) : '');
520 print '</div>';
521
522 print '<div class="div-table-responsive">';
523 print '<div class="tagtable centpercentwithout1imp liste_titre_bydiv borderbottom" id="tablelines">';
524
525 print '<div class="tagtr liste_titre">';
526 print '<div class="tagtd"></div>';
527 print '<div class="tagtd">'.$langs->trans("RecipientSelectionModules");
528 print ($user->admin ? info_admin($langs->trans("YouCanAddYourOwnPredefindedListHere"), 1) : '');
529 print '</div>';
530 print '<div class="tagtd center maxwidth150">';
531 if ($object->messtype != 'sms') {
532 print $langs->trans("NbOfUniqueEMails");
533 } else {
534 print $langs->trans("NbOfUniquePhones");
535 }
536 print '</div>';
537 print '<div class="tagtd left"><div class="inline-block">'.$langs->trans("Filters").'</div>';
538 if ($object->messtype != 'sms') {
539 print ' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <div class="inline-block valignmiddle">';
540 print '<span id="evenunsubscribe_text_'.$object->id.'" class="linkobject" style="cursor: pointer;">'.$langs->trans("EvenUnsubscribe").'</span> ';
541 print ajax_object_onoff($object, 'evenunsubscribe', 'evenunsubscribe', 'EvenUnsubscribe:switch_on:warning', 'EvenUnsubscribe', array(), 'small valignmiddle reposition', '', 1, 'allowaddtarget=1');
542 print '</div>';
543 }
544 print '</div>'."\n";
545 // Add JavaScript to make EvenUnsubscribe text clickable
546 /* This does not work, don't know why
547 print '<script>'."\n";
548 print '$(document).ready(function() {';
549 print ' $("#evenunsubscribe_text_'.dol_escape_js($object->id).'").click(function() {'."\n";
550 print ' console.log("We click on link to switch unsubscribed emails");';
551 print ' jQuery("#set_evenunsubscribe_'.dol_escape_js($object->id).'").trigger("click");';
552 print ' jQuery("#del_evenunsubscribe_'.dol_escape_js($object->id).'").trigger("click");';
553 print ' });'."\n";
554 print '});'."\n";
555 print '</script>'."\n";
556 */
557 print '<div class="tagtd">&nbsp;</div>';
558 print '</div>'; // End tr
559
560 clearstatcache();
561
562 foreach ($modulesdir as $dir) {
563 $modulenames = array();
564
565 // Load modules attributes in arrays (name, numero, orders) from dir directory
566 //print $dir."\n<br>";
567 dol_syslog("Scan directory ".$dir." for modules");
568 $handle = @opendir($dir);
569 if (is_resource($handle)) {
570 while (($file = readdir($handle)) !== false) {
571 if (dol_substr($file, 0, 1) != '.' && dol_substr($file, 0, 3) != 'CVS') {
572 $reg = array();
573 if (preg_match("/(.*)\.modules\.php$/i", $file, $reg)) {
574 if ($reg[1] == 'example') {
575 continue;
576 }
577 $modulenames[] = $reg[1];
578 }
579 }
580 }
581 closedir($handle);
582 }
583
584 // Sort $modulenames
585 sort($modulenames);
586
587 // Loop on each submodule
588 foreach ($modulenames as $modulename) {
589 // Loading Class
590 $file = $dir.$modulename.".modules.php";
591 $classname = "mailing_".$modulename;
592 require_once $file;
593
594 $obj = new $classname($db);
595 '@phan-var-force MailingTargets $obj';
596
597 // Check if qualified
598 $qualified = (is_null($obj->enabled) ? 1 : (int) dol_eval((string) $obj->enabled, 1));
599
600 // Check dependencies
601 foreach ($obj->require_module as $key) {
602 if (empty($conf->$key->enabled) || (empty($user->admin) && $obj->require_admin)) {
603 $qualified = 0;
604 //print "Les prerequis d'activation du module mailing ne sont pas respectes. Il ne sera pas actif";
605 break;
606 }
607 }
608
609 // If module is qualified
610 if ($qualified) {
611 if ($allowaddtarget) {
612 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">';
613 print '<input type="hidden" name="token" value="'.newToken().'">';
614 print '<input type="hidden" name="action" value="add">';
615 print '<input type="hidden" name="page_y" value="'.newToken().'">';
616 //print '<input type="hidden" name="allowaddtarget" value="1">';
617 } else {
618 print '<div class="oddeven trforbreakperms trforbreaknobg impair tagtr">';
619 }
620
621 print '<div class="tagtd paddingleftlarge marginleftonly paddingrightlarge marginrightonly valignmiddle center">';
622 if (empty($obj->picto)) {
623 $obj->picto = 'generic';
624 }
625 print img_object($langs->trans("EmailingTargetSelector").': '.get_class($obj), $obj->picto, 'class="valignmiddle width25 size15x"');
626 print '</div>';
627 print '<div class="tagtd valignmiddle">'; // style="height: 4em"
628 print $obj->getDesc();
629 print '</div>';
630
631 $nbofrecipient = -1;
632
633 try {
634 $obj->evenunsubscribe = $object->evenunsubscribe; // Set flag to include/exclude email that has opt-out.
635
636 $nbofrecipient = $obj->getNbOfRecipients('');
637 } catch (Exception $e) {
638 dol_syslog($e->getMessage(), LOG_ERR);
639 }
640
641 print '<div class="tagtd center valignmiddle">';
642 if ($nbofrecipient === '' || $nbofrecipient >= 0) {
643 if ($nbofrecipient !== '') {
644 print '<span class="badge badge-info">'.$nbofrecipient.'</span>';
645 }
646 } else {
647 print $langs->trans("Error").' '.img_error($obj->error);
648 }
649 print '</div>';
650
651 print '<div class="tagtd left valignmiddle">';
652 if ($allowaddtarget) {
653 $filter = false;
654 try {
655 $filter = $obj->formFilter();
656 } catch (Exception $e) {
657 dol_syslog($e->getMessage(), LOG_ERR);
658 }
659 if ($filter) {
660 print $filter;
661 } else {
662 print $langs->trans("None");
663 }
664 }
665 print '</div>';
666
667 print '<div class="tagtd right valignmiddle">';
668 if ($allowaddtarget) {
669 print '<input type="submit" class="button button-add small reposition" name="button_'.$modulename.'" value="'.$langs->trans("Add").'">';
670 } else {
671 print '<input type="submit" class="button small disabled" disabled="disabled" name="button_'.$modulename.'" value="'.$langs->trans("Add").'">';
672 //print $langs->trans("MailNoChangePossible");
673 print "&nbsp;";
674 }
675 print '</div>';
676
677 if ($allowaddtarget) {
678 print '</form>';
679 } else {
680 print '</div>';
681 }
682 }
683 }
684 } // End foreach dir
685
686 $parameters = array();
687 $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
688 print $hookmanager->resPrint;
689
690 print '</div>'; // End table
691 print '</div>';
692
693 print '<br>';
694
695 if ($sqlmessage && $user->admin) {
696 print info_admin($langs->trans("SQLUsedForExport").':<br> '.$sqlmessage, 0, 0, '1', '', 'TechnicalInformation');
697 print '<br>';
698 }
699
700 print '<br><br>';
701 }
702
703
704
705 // List of selected targets
706 $sql = "SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
707 $sql .= " mc.source_url, mc.source_id, mc.source_type, mc.error_text,";
708 $sql .= " COUNT(mu.rowid) as nb";
709 $sql .= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
710 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."mailing_unsubscribe as mu ON mu.email = mc.email";
711 $sql .= " WHERE mc.fk_mailing=".((int) $object->id);
712 $asearchcriteriahasbeenset = 0;
713 if ($search_lastname) {
714 $sql .= natural_search("mc.lastname", $search_lastname);
715 $asearchcriteriahasbeenset++;
716 }
717 if ($search_firstname) {
718 $sql .= natural_search("mc.firstname", $search_firstname);
719 $asearchcriteriahasbeenset++;
720 }
721 if ($search_email) {
722 $sql .= natural_search("mc.email", $search_email);
723 $asearchcriteriahasbeenset++;
724 }
725 if ($search_other) {
726 $sql .= natural_search("mc.other", $search_other);
727 $asearchcriteriahasbeenset++;
728 }
729 if ($search_dest_status != '' && (int) $search_dest_status >= -1) {
730 $sql .= " AND mc.statut = ".((int) $search_dest_status);
731 $asearchcriteriahasbeenset++;
732 }
733 $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';
734 $sql .= $db->order($sortfield, $sortorder);
735
736
737 // Count total nb of records
738 $nbtotalofrecords = '';
739 if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
740 $result = $db->query($sql);
741 $nbtotalofrecords = $db->num_rows($result);
742 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller then paging size (filtering), goto and load page 0
743 $page = 0;
744 $offset = 0;
745 }
746
747 // Fix/update nbemail on emailing record if it differs (may happen if user edit lines from database directly)
748 if (empty($asearchcriteriahasbeenset)) {
749 if ($nbtotalofrecords != $object->nbemail) {
750 dol_syslog("We found a difference in nb of record in target table and the property ->nbemail, we fix ->nbemail");
751 //print "nbemail=".$object->nbemail." nbtotalofrecords=".$nbtotalofrecords;
752 $resultrefresh = $object->refreshNbOfTargets();
753 if ($resultrefresh < 0) {
754 dol_print_error($db, $object->error, $object->errors);
755 }
756 }
757 }
758 }
759
760 //$nbtotalofrecords=$object->nbemail; // nbemail is a denormalized field storing nb of targets
761 $sql .= $db->plimit($limit + 1, $offset);
762
763 $resql = $db->query($sql);
764 if ($resql) {
765 $num = $db->num_rows($resql);
766
767 $param = "&id=".$object->id;
768 //if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage);
769 if ($limit > 0 && $limit != $conf->liste_limit) {
770 $param .= '&limit='.((int) $limit);
771 }
772 if ($search_lastname) {
773 $param .= "&search_lastname=".urlencode($search_lastname);
774 }
775 if ($search_firstname) {
776 $param .= "&search_firstname=".urlencode($search_firstname);
777 }
778 if ($search_email) {
779 $param .= "&search_email=".urlencode($search_email);
780 }
781 if ($search_other) {
782 $param .= "&search_other=".urlencode($search_other);
783 }
784
785 print '<form method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
786 print '<input type="hidden" name="token" value="'.newToken().'">';
787 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
788 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
789 print '<input type="hidden" name="page" value="'.$page.'">';
790 print '<input type="hidden" name="id" value="'.$object->id.'">';
791 print '<input type="hidden" name="page_y" value="">';
792
793 $morehtmlcenter = '';
794 $arrayofmassactions = array();
795 if ($permissiontocreate) {
796 $arrayofmassactions['reset_target'] = img_picto('', 'refresh', 'class="pictofixedwidth"').$langs->trans("ResetMailingTargetMassaction");
797 }
798 $massactionbutton = $form->selectMassAction('', $arrayofmassactions);
799 $morehtmlcenter .= $massactionbutton .'<br>';
800
801 if ($object->status == $object::STATUS_DRAFT) {
802 $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>';
803 }
804
805 $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;';
806
807 print '</form>';
808
809 print "\n<!-- List of selected targets -->\n";
810 print '<form method="POST" action="'.dolBuildUrl($_SERVER["PHP_SELF"]).'">';
811 print '<input type="hidden" name="token" value="'.newToken().'">';
812 print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
813 print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
814 print '<input type="hidden" name="page" value="'.$page.'">';
815 print '<input type="hidden" name="id" value="'.$object->id.'">';
816 print '<input type="hidden" name="limit" value="'.$limit.'">';
817 print '<input type="hidden" name="page_y" value="">';
818
819 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
820 print_barre_liste($langs->trans("MailSelectedRecipients"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $morehtmlcenter, $num, $nbtotalofrecords, 'generic', 0, $newcardbutton, '', $limit, 0, 0, 1, $morehtmlrightbeforearrow);
821
822 if ($massaction == 'reset_target') {
823 // Confirm reset
824 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ConfirmResetMailingTargetMassaction"), $langs->trans("ConfirmResetMailingTargetMassactionQuestion"), "confirm_reset_target", null, '', 0, 0, 500, 1);
825 }
826
827 $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
828 $htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column ? 'left' : ''); // This also change content of $arrayfields with user setup
829 $selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
830 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
831
832 print '<div class="div-table-responsive">';
833 print '<table class="noborder centpercent">';
834
835 // Line of filters
836 print '<tr class="liste_titre_filter">';
837
838 // Action column
839 if ($conf->main_checkbox_left_column) {
840 print '<td class="liste_titre maxwidthsearch">';
841 $searchpicto = $form->showFilterButtons('left');
842 print $searchpicto;
843 print '</td>';
844 }
845 // EMail
846 print '<td class="liste_titre">';
847 print '<input class="flat maxwidth75" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).'">';
848 print '</td>';
849 // Name
850 print '<td class="liste_titre">';
851 print '<input class="flat maxwidth50" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).'">';
852 print '</td>';
853 // Firstname
854 print '<td class="liste_titre">';
855 print '<input class="flat maxwidth50" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).'">';
856 print '</td>';
857 // Other
858 print '<td class="liste_titre">';
859 print '<input class="flat maxwidth100" type="text" name="search_other" value="'.dol_escape_htmltag($search_other).'">';
860 print '</td>';
861 // Source
862 print '<td class="liste_titre">';
863 print '&nbsp;';
864 print '</td>';
865
866 // Date last update
867 print '<td class="liste_titre">';
868 print '&nbsp;';
869 print '</td>';
870
871 // Date sending
872 print '<td class="liste_titre">';
873 print '&nbsp;';
874 print '</td>';
875
876 // Status
877 print '<td class="liste_titre center parentonrightofpage">';
878 print $formmailing->selectDestinariesStatus($search_dest_status, 'search_dest_status', 1, 'width100 onrightofpage');
879 print '</td>';
880
881 // Action column
882 if (!$conf->main_checkbox_left_column) {
883 print '<td class="liste_titre maxwidthsearch">';
884 $searchpicto = $form->showFilterButtons();
885 print $searchpicto;
886 print '</td>';
887 }
888
889 print '</tr>';
890
891 if ($page) {
892 $param .= "&page=".urlencode((string) ($page));
893 }
894
895 print '<tr class="liste_titre">';
896 // Action column
897 if ($conf->main_checkbox_left_column) {
898 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
899 $totalarray['nbfield']++;
900 }
901 print_liste_field_titre("EMail", $_SERVER["PHP_SELF"], "mc.email", '', $param, "", $sortfield, $sortorder);
902 print_liste_field_titre("Lastname", $_SERVER["PHP_SELF"], "mc.lastname", '', $param, "", $sortfield, $sortorder);
903 print_liste_field_titre("Firstname", $_SERVER["PHP_SELF"], "mc.firstname", '', $param, "", $sortfield, $sortorder);
904 print_liste_field_titre("OtherInformations", $_SERVER["PHP_SELF"], '', "", $param, "", $sortfield, $sortorder);
905 print_liste_field_titre("Source", $_SERVER["PHP_SELF"], '', "", $param, '', $sortfield, $sortorder, 'center ');
906 // Date last update
907 print_liste_field_titre("DateLastModification", $_SERVER["PHP_SELF"], "mc.tms", '', $param, '', $sortfield, $sortorder, 'center ');
908 // Date sending
909 print_liste_field_titre("DateSending", $_SERVER["PHP_SELF"], "mc.date_envoi", '', $param, '', $sortfield, $sortorder, 'center ');
910 print_liste_field_titre("Status", $_SERVER["PHP_SELF"], "mc.statut", '', $param, '', $sortfield, $sortorder, 'center ');
911 // Action column
912 if (!$conf->main_checkbox_left_column) {
913 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
914 $totalarray['nbfield']++;
915 }
916 print '</tr>';
917
918 $i = 0;
919
920 if ($num) {
921 include_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
922 include_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
923 include_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
924 include_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
925 include_once DOL_DOCUMENT_ROOT.'/eventorganization/class/conferenceorboothattendee.class.php';
926
927 $objectstaticmember = new Adherent($db);
928 $objectstaticuser = new User($db);
929 $objectstaticcompany = new Societe($db);
930 $objectstaticcontact = new Contact($db);
931 $objectstaticeventorganization = new ConferenceOrBoothAttendee($db);
932
933 while ($i < min($num, $limit)) {
934 $obj = $db->fetch_object($resql);
935
936 print '<tr class="oddeven">';
937
938 // Action column
939 if ($conf->main_checkbox_left_column) {
940 print '<td class="center nowraponall">';
941 print '<!-- ID mailing_cibles = '.$obj->rowid.' -->';
942 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
943 $selected = 0;
944 if (in_array($obj->rowid, $arrayofselected)) {
945 $selected = 1;
946 }
947 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
948 }
949 if ($obj->status == $object::STATUS_DRAFT) { // Not sent yet
950 if ($user->hasRight('mailing', 'creer')) {
951 print '<a class="reposition marginleftonly" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&rowid='.((int) $obj->rowid).$param.'">'.img_delete($langs->trans("RemoveRecipient")).'</a>';
952 }
953 }
954 /*if ($obj->status == -1) // Sent with error
955 {
956 print '<a href="'.$_SERVER['PHP_SELF'].'?action=retry&token='.newToken().'&rowid='.$obj->rowid.$param.'">'.$langs->trans("Retry").'</a>';
957 }*/
958 print '</td>';
959 }
960
961 print '<td class="tdoverflowmax150">';
962 print img_picto($obj->email, 'email', 'class="paddingright"');
963 if ($obj->nb > 0) {
964 print img_warning($langs->trans("EmailOptedOut"), 'warning', 'pictofixedwidth');
965 }
966 print dolPrintHTML($obj->email);
967 print '</td>';
968
969 print '<td class="tdoverflowmax150" title="'.dolPrintHTMLForAttribute($obj->lastname).'">'.dolPrintHTML($obj->lastname).'</td>';
970
971 print '<td class="tdoverflowmax150" title="'.dolPrintHTMLForAttribute($obj->firstname).'">'.dolPrintHTML($obj->firstname).'</td>';
972
973 print '<td class="tdoverflowmax300" title="'.dolPrintHTMLForAttribute($obj->other).'"><span class="small">'.dolPrintHTML($obj->other).'</small></td>';
974
975 print '<td class="center tdoverflowmax150">';
976 if (empty($obj->source_id) || empty($obj->source_type)) {
977 print empty($obj->source_url) ? '' : $obj->source_url; // For backward compatibility
978 } else {
979 if ($obj->source_type == 'member') {
980 $objectstaticmember->fetch($obj->source_id);
981 print $objectstaticmember->getNomUrl(1);
982 } elseif ($obj->source_type == 'user') {
983 $objectstaticuser->fetch($obj->source_id);
984 print $objectstaticuser->getNomUrl(1);
985 } elseif ($obj->source_type == 'thirdparty') {
986 $objectstaticcompany->fetch($obj->source_id);
987 print $objectstaticcompany->getNomUrl(1);
988 } elseif ($obj->source_type == 'contact') {
989 $objectstaticcontact->fetch($obj->source_id);
990 print $objectstaticcontact->getNomUrl(1);
991 } elseif ($obj->source_type == 'eventorganizationattendee') {
992 $objectstaticeventorganization->fetch($obj->source_id);
993 print $objectstaticeventorganization->getNomUrl(1);
994 } else {
995 print $obj->source_url;
996 }
997 }
998 print '</td>';
999
1000 // Date last update
1001 print '<td class="center nowraponall">';
1002 print dol_print_date($db->jdate($obj->tms), 'dayhour', 'tzuserrel');
1003 print '</td>';
1004
1005 // Date sent
1006 print '<td class="center nowraponall">';
1007 if ($obj->status != $object::STATUS_DRAFT) { // If status of target line is not draft
1008 // Date sent
1009 print dol_print_date($db->jdate($obj->date_envoi), 'dayhour', 'tzuserrel'); // @TODO Must store date in date format
1010 }
1011 print '</td>';
1012
1013 // Status of recipient sending email (Warning != status of emailing)
1014 print '<td class="nowrap center">';
1015 if ($obj->status == $object::STATUS_DRAFT) { // If status of target line is not draft
1016 print $object::libStatutDest((int) $obj->status, 2, '');
1017 } else {
1018 print $object::libStatutDest((int) $obj->status, 2, $obj->error_text);
1019 }
1020 print '</td>';
1021
1022 // Action column
1023 if (!$conf->main_checkbox_left_column) {
1024 print '<td class="center nowraponall">';
1025 print '<!-- ID mailing_cibles = '.$obj->rowid.' -->';
1026 if ($obj->status == $object::STATUS_DRAFT) { // If status of target line is not sent yet
1027 if ($user->hasRight('mailing', 'creer')) {
1028 print '<a class="reposition marginleftonly" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&rowid='.((int) $obj->rowid).$param.'">'.img_delete($langs->trans("RemoveRecipient")).'</a>';
1029 }
1030 }
1031 /*if ($obj->status == -1) // Sent with error
1032 {
1033 print '<a href="'.$_SERVER['PHP_SELF'].'?action=retry&token='.newToken().'&rowid='.$obj->rowid.$param.'">'.$langs->trans("Retry").'</a>';
1034 }*/
1035 print '</td>';
1036 }
1037 print '</tr>';
1038
1039 $i++;
1040 }
1041 } else {
1042 if ($object->status < $object::STATUS_SENTPARTIALY) {
1043 print '<tr><td colspan="9">';
1044 print '<span class="opacitymedium">'.$langs->trans("NoTargetYet").'</span>';
1045 print '</td></tr>';
1046 } else {
1047 print '<tr><td colspan="9">';
1048 print '<span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span>';
1049 print '</td></tr>';
1050 }
1051 }
1052 print "</table><br>";
1053 print '</div>';
1054
1055 print '</form>';
1056
1057 $db->free($resql);
1058 } else {
1059 dol_print_error($db);
1060 }
1061
1062 print "\n<!-- End list of selected targets -->\n";
1063}
1064
1065// End of page
1066llxFooter();
1067$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
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:812
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.
if(! $sortfield) if(! $sortorder) $module
Definition list.php:193
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:
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.
dol_print_email($email, $contactid=0, $socid=0, $addlink=0, $max=0, $showinvalid=2, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
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.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_substr($string, $start, $length=null, $stringencoding='', $trunconbytes=0)
Make a substring.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
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.
Definition html.lib.php:540
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
Definition html.lib.php:738
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Definition html.lib.php:181
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.