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';
47$langs->loadLangs(array(
"mails",
"admin"));
49$action =
GETPOST(
'action',
'aZ09');
50$toselect =
GETPOST(
'toselect',
'array:int');
51$contextpage =
GETPOST(
'contextpage',
'aZ');
52$massaction =
GETPOST(
'massaction',
'alpha');
57$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
58$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
60if (empty($page) || $page == -1) {
63$offset = $limit * $page;
67 $sortfield =
"mc.statut,email";
70 $sortorder =
"DESC,ASC";
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');
88$hookmanager->initHooks(array(
'ciblescard',
'globalcard'));
94$listofmethods = array();
96$listofmethods[
'mail'] =
'PHP mail function';
98$listofmethods[
'smtps'] =
'SMTP/SMTPS socket library';
99if (version_compare(phpversion(),
'7.0',
'>=')) {
100 $listofmethods[
'swiftmailer'] =
'Swift Mailer socket library';
104if (!$user->hasRight(
'mailing',
'lire') || (!
getDolGlobalString(
'EXTERNAL_USERS_ARE_AUTHORIZED') && $user->socid > 0)) {
107if (empty($action) && empty(
$object->id)) {
111$permissiontoread = $user->hasRight(
'mailing',
'lire');
112$permissiontocreate = $user->hasRight(
'mailing',
'creer');
113$permissiontovalidatesend = $user->hasRight(
'mailing',
'valider');
114$permissiontodelete = $user->hasRight(
'mailing',
'supprimer');
120if (
GETPOST(
'cancel',
'alpha')) {
124if (!
GETPOST(
'confirmmassaction',
'alpha')) {
128if ($action ==
'add' && $permissiontocreate) {
129 $module =
GETPOST(
"module",
'alpha');
133 foreach ($modulesdir as $dir) {
136 dol_syslog(
"Scan directory ".$dir.
" for modules");
139 $file = $dir.
"/".$module.
".modules.php";
140 $classname =
"mailing_".$module;
142 if (file_exists($file)) {
146 dol_syslog(
"Call add_to_target() on class ".$classname.
" evenunsubscribe=".
$object->evenunsubscribe);
149 if (class_exists($classname)) {
150 $obj =
new $classname($db);
151 '@phan-var-force MailingTargets $obj';
152 $obj->evenunsubscribe =
$object->evenunsubscribe;
154 $result = $obj->add_to_target($id);
156 $sqlmessage = $obj->sql;
165 if (
$object->status == $object::STATUS_SENTCOMPLETELY) {
166 $object->setStatut($object::STATUS_SENTPARTIALY);
175 if ($result < 0 && is_object($obj)) {
176 setEventMessages($langs->trans(
"Error").($obj->error ?
' '.$obj->error :
''), null,
'errors');
180if (
GETPOSTINT(
'clearlist') && $permissiontocreate) {
183 $obj->clear_target($id);
190if (
GETPOSTINT(
'exportcsv') && $permissiontoread) {
191 $completefilename =
'targets_emailing'.$object->id.
'_'.
dol_print_date(
dol_now(),
'dayhourlog').
'.csv';
192 header(
'Content-Type: text/csv');
193 header(
'Content-Disposition: attachment;filename='.$completefilename);
196 $sql =
"SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
197 $sql .=
" mc.source_id, mc.source_type, mc.error_text";
198 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
199 $sql .=
" WHERE mc.fk_mailing = ".((int)
$object->id);
200 $sql .= $db->order($sortfield, $sortorder);
202 $resql = $db->query($sql);
204 $num = $db->num_rows($resql);
207 while ($obj = $db->fetch_object($resql)) {
208 print $obj->rowid.$sep;
209 print
'"'.$obj->lastname.
'"'.$sep;
210 print
'"'.$obj->firstname.
'"'.$sep;
211 print $obj->email.$sep;
212 print $obj->other.$sep;
213 print $obj->tms.$sep;
214 print $obj->source_type.$sep;
215 print $obj->source_id.$sep;
216 print $obj->date_envoi.$sep;
217 print $obj->status.$sep;
218 print
'"'.$obj->error_text.
'"'.$sep;
229if ($action ==
'delete' && $permissiontocreate) {
231 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"mailing_cibles WHERE rowid = ".((int) $rowid);
232 $resql = $db->query($sql);
236 $obj->update_nb($id);
240 header(
"Location: list.php");
248if ($action ==
"confirm_reset_target" && $permissiontocreate) {
253 foreach ($toselect as $toselectid) {
254 $result =
$object->resetTargetErrorStatus($user, $toselectid);
259 } elseif ($result > 0) {
276if (
GETPOST(
'button_removefilter_x',
'alpha') ||
GETPOST(
'button_removefilter.x',
'alpha') ||
GETPOST(
'button_removefilter',
'alpha')) {
277 $search_lastname =
'';
278 $search_firstname =
'';
281 $search_dest_status =
'';
286if (($action ==
'settitle' || $action ==
'setemail_from' || $action ==
'setreplyto' || $action ==
'setemail_errorsto' || $action ==
'setevenunsubscribe') && $permissiontocreate) {
289 if ($action ==
'settitle') {
291 } elseif ($action ==
'setemail_from') {
292 $object->email_from = trim(
GETPOST(
'email_from',
'alphawithlgt'));
293 } elseif ($action ==
'setemail_replyto') {
294 $object->email_replyto = trim(
GETPOST(
'email_replyto',
'alphawithlgt'));
295 } elseif ($action ==
'setemail_errorsto') {
296 $object->email_errorsto = trim(
GETPOST(
'email_errorsto',
'alphawithlgt'));
297 } elseif ($action ==
'settitle' && empty(
$object->title)) {
298 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"MailTitle"));
299 } elseif ($action ==
'setfrom' && empty(
$object->email_from)) {
300 $mesg = $langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"MailFrom"));
301 } elseif ($action ==
'setevenunsubscribe') {
306 $result =
$object->update($user);
308 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
323$form =
new Form($db);
326$help_url =
'EN:Module_EMailing|FR:Module_Mailing|ES:Módulo_Mailing';
327llxHeader(
'', $langs->trans(
"Mailing"), $help_url);
329$arrayofselected = is_array($toselect) ? $toselect : array();
339 $linkback =
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
341 $morehtmlref =
'<div class="refidno">';
343 $morehtmlref .= $form->editfieldkey(
"",
'title',
$object->title, $object, 0,
'string',
'', 0, 1);
344 $morehtmlref .= $form->editfieldval(
"",
'title',
$object->title, $object, 0,
'string',
'',
null,
null,
'', 1);
345 $morehtmlref .=
'</div>';
347 $morehtmlstatus =
'';
349 if (
$object->status == $object::STATUS_SENTPARTIALY ||
$object->status == $object::STATUS_SENTCOMPLETELY) {
350 $nbtry =
$object->countNbOfTargets(
'alreadysent');
351 $nbko =
$object->countNbOfTargets(
'alreadysentko');
352 $nbok = ($nbtry - $nbko);
354 $morehtmlstatus .=
' ('.$nbtry.
'/'.
$object->nbemail;
356 $morehtmlstatus .=
' - '.$nbko.
' '.$langs->trans(
"Error");
358 $morehtmlstatus .=
') ';
361 dol_banner_tab($object,
'id', $linkback, 1,
'rowid',
'ref', $morehtmlref,
'', 0,
'', $morehtmlstatus);
363 print
'<div class="fichecenter">';
364 print
'<div class="fichehalfleft">';
365 print
'<div class="underbanner clearboth"></div>';
367 print
'<table class="border centpercent tableforfield">'.
"\n";
370 print
'<tr><td class="titlefield">';
371 print $langs->trans(
"MailFrom").
'</td><td>';
373 foreach ($emailarray as $email => $name) {
374 if ($name && $name != $email) {
378 $langs->load(
"errors");
379 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
389 if (
$object->messtype !=
'sms') {
390 print
'<tr><td>'.$langs->trans(
"MailErrorsTo").
'</td><td>';
392 foreach ($emailarray as $email => $name) {
393 if ($name != $email) {
397 $langs->load(
"errors");
398 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
400 $langs->load(
"errors");
401 print
img_warning($langs->trans(
"ErrorBadMXDomain", $email));
411 if (
$object->messtype !=
'sms') {
413 print $form->editfieldkey(
"MailReply",
'email_replyto',
$object->email_replyto, $object, (
int) ($user->hasRight(
'mailing',
'creer') &&
$object->status < $object::STATUS_SENTCOMPLETELY),
'string');
415 print $form->editfieldval(
"MailReply",
'email_replyto',
$object->email_replyto, $object, $user->hasRight(
'mailing',
'creer') &&
$object->status < $object::STATUS_SENTCOMPLETELY,
'string');
417 if ($action !=
'editemail_replyto') {
419 $langs->load(
"errors");
420 print
img_warning($langs->trans(
"ErrorBadEMail", $email));
422 $langs->load(
"errors");
423 print
img_warning($langs->trans(
"ErrorBadMXDomain", $email));
433 print
'<div class="fichehalfright">';
434 print
'<div class="underbanner clearboth"></div>';
436 print
'<table class="border centpercent tableforfield">';
440 print $langs->trans(
"TotalNbOfDistinctRecipients");
443 if (is_numeric($nbemail)) {
447 $htmltooltip .= $langs->trans(
'LimitSendingEmailing',
getDolGlobalString(
'MAILING_LIMIT_SENDBYWEB'));
449 $htmltooltip .= $langs->trans(
'SendingFromWebInterfaceIsNotAllowed');
452 if (empty($nbemail)) {
453 $nbemail .=
' '.img_warning($langs->trans(
'ToAddRecipientsChooseHere'));
456 print $form->textwithpicto($nbemail, $htmltooltip, 1,
'info');
464 print $langs->trans(
"MAIN_MAIL_SENDMODE");
466 if (
$object->messtype !=
'sms') {
472 $text = $listofmethods[
'mail'];
477 print
' <span class="opacitymedium">('.getDolGlobalString(
'MAIN_MAIL_SMTP_SERVER_EMAILING',
getDolGlobalString(
'MAIN_MAIL_SMTP_SERVER')).
')</span>';
480 print
' <span class="opacitymedium">('.getDolGlobalString(
'MAIN_MAIL_SMTP_SERVER').
')</span>';
484 print
' <span class="opacitymedium">('.getDolGlobalString(
'MAIN_MAIL_SMTP_SERVER').
')</span>';
489 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
495 print
'<div class="clearboth"></div>';
503 $allowaddtarget = (
$object->status == $object::STATUS_DRAFT);
504 if (
GETPOST(
'allowaddtarget')) {
507 if (!$allowaddtarget) {
508 $newcardbutton .=
dolGetButtonTitle($langs->trans(
'New'),
'',
'fa fa-plus-circle', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&allowaddtarget=1',
'', $user->hasRight(
'mailing',
'creer'));
512 if ($allowaddtarget && $user->hasRight(
'mailing',
'creer')) {
513 print
load_fiche_titre($langs->trans(
"ToAddRecipientsChooseHere").
'...', ($user->admin ?
info_admin($langs->trans(
"YouCanAddYourOwnPredefindedListHere"), 1) :
''),
'');
515 print
'<div class="div-table-responsive">';
516 print
'<div class="tagtable centpercentwithout1imp liste_titre_bydiv borderbottom" id="tablelines">';
518 print
'<div class="tagtr liste_titre">';
519 print
'<div class="tagtd"></div>';
520 print
'<div class="tagtd">'.$langs->trans(
"RecipientSelectionModules").
'</div>';
521 print
'<div class="tagtd center maxwidth150">';
522 if (
$object->messtype !=
'sms') {
523 print $langs->trans(
"NbOfUniqueEMails");
525 print $langs->trans(
"NbOfUniquePhones");
528 print
'<div class="tagtd left"><div class="inline-block">'.$langs->trans(
"Filters").
'</div>';
529 if (
$object->messtype !=
'sms') {
530 print
' <div class="inline-block valignmiddle">'.$langs->trans(
"EvenUnsubscribe").
' ';
531 print
ajax_object_onoff($object,
'evenunsubscribe',
'evenunsubscribe',
'EvenUnsubscribe:switch_on:warning',
'EvenUnsubscribe', array(),
'small valignmiddle reposition',
'', 1);
535 print
'<div class="tagtd"> </div>';
540 foreach ($modulesdir as $dir) {
541 $modulenames = array();
545 dol_syslog(
"Scan directory ".$dir.
" for modules");
546 $handle = @opendir($dir);
547 if (is_resource($handle)) {
548 while (($file = readdir($handle)) !==
false) {
549 if (substr($file, 0, 1) !=
'.' && substr($file, 0, 3) !=
'CVS') {
551 if (preg_match(
"/(.*)\.modules\.php$/i", $file, $reg)) {
552 if ($reg[1] ==
'example') {
555 $modulenames[] = $reg[1];
568 foreach ($modulenames as $modulename) {
570 $file = $dir.$modulename.
".modules.php";
571 $classname =
"mailing_".$modulename;
574 $obj =
new $classname($db);
575 '@phan-var-force MailingTargets $obj';
578 $qualified = (is_null($obj->enabled) ? 1 : (int)
dol_eval((
string) $obj->enabled, 1));
581 foreach ($obj->require_module as $key) {
582 if (empty($conf->$key->enabled) || (empty($user->admin) && $obj->require_admin)) {
591 if ($allowaddtarget) {
592 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">';
593 print
'<input type="hidden" name="token" value="'.newToken().
'">';
594 print
'<input type="hidden" name="action" value="add">';
595 print
'<input type="hidden" name="page_y" value="'.newToken().
'">';
597 print
'<div class="oddeven trforbreakperms trforbreaknobg impair tagtr">';
600 print
'<div class="tagtd paddingleftlarge marginleftonly paddingrightlarge marginrightonly valignmiddle center">';
601 if (empty($obj->picto)) {
602 $obj->picto =
'generic';
604 print
img_object($langs->trans(
"EmailingTargetSelector").
': '.get_class($obj), $obj->picto,
'class="valignmiddle width25 size15x"');
606 print
'<div class="tagtd valignmiddle">';
607 print $obj->getDesc();
613 $obj->evenunsubscribe =
$object->evenunsubscribe;
615 $nbofrecipient = $obj->getNbOfRecipients(
'');
620 print
'<div class="tagtd center valignmiddle">';
621 if ($nbofrecipient ===
'' || $nbofrecipient >= 0) {
622 print $nbofrecipient;
624 print $langs->trans(
"Error").
' '.
img_error($obj->error);
628 print
'<div class="tagtd left valignmiddle">';
629 if ($allowaddtarget) {
631 $filter = $obj->formFilter();
638 print $langs->trans(
"None");
643 print
'<div class="tagtd right valignmiddle">';
644 if ($allowaddtarget) {
645 print
'<input type="submit" class="button button-add small reposition" name="button_'.$modulename.
'" value="'.$langs->trans(
"Add").
'">';
647 print
'<input type="submit" class="button small disabled" disabled="disabled" name="button_'.$modulename.
'" value="'.$langs->trans(
"Add").
'">';
653 if ($allowaddtarget) {
662 $parameters = array();
663 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
664 print $hookmanager->resPrint;
671 if ($sqlmessage && $user->admin) {
672 print
info_admin($langs->trans(
"SQLUsedForExport").
':<br> '.$sqlmessage, 0, 0,
'1',
'',
'TechnicalInformation');
682 $sql =
"SELECT mc.rowid, mc.lastname, mc.firstname, mc.email, mc.other, mc.statut as status, mc.date_envoi, mc.tms,";
683 $sql .=
" mc.source_url, mc.source_id, mc.source_type, mc.error_text,";
684 $sql .=
" COUNT(mu.rowid) as nb";
685 $sql .=
" FROM ".MAIN_DB_PREFIX.
"mailing_cibles as mc";
686 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"mailing_unsubscribe as mu ON mu.email = mc.email";
687 $sql .=
" WHERE mc.fk_mailing=".((int)
$object->id);
688 $asearchcriteriahasbeenset = 0;
689 if ($search_lastname) {
691 $asearchcriteriahasbeenset++;
693 if ($search_firstname) {
695 $asearchcriteriahasbeenset++;
699 $asearchcriteriahasbeenset++;
703 $asearchcriteriahasbeenset++;
705 if ($search_dest_status !=
'' && (
int) $search_dest_status >= -1) {
706 $sql .=
" AND mc.statut = ".((int) $search_dest_status);
707 $asearchcriteriahasbeenset++;
709 $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';
710 $sql .= $db->order($sortfield, $sortorder);
714 $nbtotalofrecords =
'';
716 $result = $db->query($sql);
717 $nbtotalofrecords = $db->num_rows($result);
718 if (($page * $limit) > (int) $nbtotalofrecords) {
724 if (empty($asearchcriteriahasbeenset)) {
725 if ($nbtotalofrecords !=
$object->nbemail) {
726 dol_syslog(
"We found a difference in nb of record in target table and the property ->nbemail, we fix ->nbemail");
728 $resultrefresh =
$object->refreshNbOfTargets();
729 if ($resultrefresh < 0) {
737 $sql .= $db->plimit($limit + 1, $offset);
739 $resql = $db->query($sql);
741 $num = $db->num_rows($resql);
743 $param =
"&id=".$object->id;
745 if ($limit > 0 && $limit != $conf->liste_limit) {
746 $param .=
'&limit='.((int) $limit);
748 if ($search_lastname) {
749 $param .=
"&search_lastname=".urlencode($search_lastname);
751 if ($search_firstname) {
752 $param .=
"&search_firstname=".urlencode($search_firstname);
755 $param .=
"&search_email=".urlencode($search_email);
758 $param .=
"&search_other=".urlencode($search_other);
761 print
'<form method="POST" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
762 print
'<input type="hidden" name="token" value="'.newToken().
'">';
763 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
764 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
765 print
'<input type="hidden" name="page" value="'.$page.
'">';
766 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
767 print
'<input type="hidden" name="page_y" value="">';
769 $morehtmlcenter =
'';
770 $arrayofmassactions = array();
771 if ($permissiontocreate) {
772 $arrayofmassactions[
'reset_target'] =
img_picto(
'',
'refresh',
'class="pictofixedwidth"').$langs->trans(
"ResetMailingTargetMassaction");
774 $massactionbutton = $form->selectMassAction(
'', $arrayofmassactions);
775 $morehtmlcenter .= $massactionbutton .
'<br>';
777 if (
$object->status == $object::STATUS_DRAFT) {
778 $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>';
781 $morehtmlright =
'<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> ';
785 print
"\n<!-- List of selected targets -->\n";
786 print
'<form method="POST" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
787 print
'<input type="hidden" name="token" value="'.newToken().
'">';
788 print
'<input type="hidden" name="sortfield" value="'.$sortfield.
'">';
789 print
'<input type="hidden" name="sortorder" value="'.$sortorder.
'">';
790 print
'<input type="hidden" name="page" value="'.$page.
'">';
791 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
792 print
'<input type="hidden" name="limit" value="'.$limit.
'">';
793 print
'<input type="hidden" name="page_y" value="">';
796 print_barre_liste($langs->trans(
"MailSelectedRecipients"), $page, $_SERVER[
"PHP_SELF"], $param, $sortfield, $sortorder, $morehtmlcenter, $num, $nbtotalofrecords,
'generic', 0, $newcardbutton,
'', $limit, 0, 0, 1, $morehtmlright);
798 if ($massaction ==
'reset_target') {
800 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".
$object->id, $langs->trans(
"ConfirmResetMailingTargetMassaction"), $langs->trans(
"ConfirmResetMailingTargetMassactionQuestion"),
"confirm_reset_target",
null,
'', 0, 0, 500, 1);
803 $varpage = empty($contextpage) ? $_SERVER[
"PHP_SELF"] : $contextpage;
804 $htmlofselectarray = $form->multiSelectArrayWithCheckbox(
'selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column ?
'left' :
'');
805 $selectedfields = ($mode !=
'kanban' ? $htmlofselectarray :
'');
806 $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons(
'checkforselect', 1) :
'');
808 print
'<div class="div-table-responsive">';
809 print
'<table class="noborder centpercent">';
812 print
'<tr class="liste_titre_filter">';
815 if ($conf->main_checkbox_left_column) {
816 print
'<td class="liste_titre maxwidthsearch">';
817 $searchpicto = $form->showFilterButtons(
'left');
822 print
'<td class="liste_titre">';
823 print
'<input class="flat maxwidth75" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).
'">';
826 print
'<td class="liste_titre">';
827 print
'<input class="flat maxwidth50" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).
'">';
830 print
'<td class="liste_titre">';
831 print
'<input class="flat maxwidth50" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).
'">';
834 print
'<td class="liste_titre">';
835 print
'<input class="flat maxwidth100" type="text" name="search_other" value="'.dol_escape_htmltag($search_other).
'">';
838 print
'<td class="liste_titre">';
843 print
'<td class="liste_titre">';
848 print
'<td class="liste_titre">';
853 print
'<td class="liste_titre center parentonrightofpage">';
854 print $formmailing->selectDestinariesStatus($search_dest_status,
'search_dest_status', 1,
'width100 onrightofpage');
858 if (!$conf->main_checkbox_left_column) {
859 print
'<td class="liste_titre maxwidthsearch">';
860 $searchpicto = $form->showFilterButtons();
868 $param .=
"&page=".urlencode((
string) ($page));
871 print
'<tr class="liste_titre">';
873 if ($conf->main_checkbox_left_column) {
874 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
878 print_liste_field_titre(
"Lastname", $_SERVER[
"PHP_SELF"],
"mc.lastname",
'', $param,
"", $sortfield, $sortorder);
879 print_liste_field_titre(
"Firstname", $_SERVER[
"PHP_SELF"],
"mc.firstname",
'', $param,
"", $sortfield, $sortorder);
880 print_liste_field_titre(
"OtherInformations", $_SERVER[
"PHP_SELF"],
'',
"", $param,
"", $sortfield, $sortorder);
881 print_liste_field_titre(
"Source", $_SERVER[
"PHP_SELF"],
'',
"", $param,
'', $sortfield, $sortorder,
'center ');
883 print_liste_field_titre(
"DateLastModification", $_SERVER[
"PHP_SELF"],
"mc.tms",
'', $param,
'', $sortfield, $sortorder,
'center ');
885 print_liste_field_titre(
"DateSending", $_SERVER[
"PHP_SELF"],
"mc.date_envoi",
'', $param,
'', $sortfield, $sortorder,
'center ');
886 print_liste_field_titre(
"Status", $_SERVER[
"PHP_SELF"],
"mc.statut",
'', $param,
'', $sortfield, $sortorder,
'center ');
888 if (!$conf->main_checkbox_left_column) {
889 print
getTitleFieldOfList($selectedfields, 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'', $sortfield, $sortorder,
'center maxwidthsearch ').
"\n";
897 include_once DOL_DOCUMENT_ROOT.
'/adherents/class/adherent.class.php';
898 include_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
899 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
900 include_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
901 include_once DOL_DOCUMENT_ROOT.
'/eventorganization/class/conferenceorboothattendee.class.php';
903 $objectstaticmember =
new Adherent($db);
904 $objectstaticuser =
new User($db);
905 $objectstaticcompany =
new Societe($db);
906 $objectstaticcontact =
new Contact($db);
909 while ($i < min($num, $limit)) {
910 $obj = $db->fetch_object($resql);
912 print
'<tr class="oddeven">';
915 if ($conf->main_checkbox_left_column) {
916 print
'<td class="center nowraponall">';
917 print
'<!-- ID mailing_cibles = '.$obj->rowid.
' -->';
918 if ($massactionbutton || $massaction) {
920 if (in_array($obj->rowid, $arrayofselected)) {
923 print
'<input id="cb'.$obj->rowid.
'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.
'"'.($selected ?
' checked="checked"' :
'').
'>';
925 if ($obj->status == $object::STATUS_DRAFT) {
926 if ($user->hasRight(
'mailing',
'creer')) {
927 print
'<a class="reposition marginleftonly" href="'.$_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&rowid='.((int) $obj->rowid).$param.
'">'.
img_delete($langs->trans(
"RemoveRecipient")).
'</a>';
937 print
'<td class="tdoverflowmax150">';
938 print
img_picto($obj->email,
'email',
'class="paddingright"');
940 print
img_warning($langs->trans(
"EmailOptedOut"),
'warning',
'pictofixedwidth');
945 print
'<td class="tdoverflowmax150" title="'.dolPrintHTMLForAttribute($obj->lastname).
'">'.
dolPrintHTML($obj->lastname).
'</td>';
947 print
'<td class="tdoverflowmax150" title="'.dolPrintHTMLForAttribute($obj->firstname).
'">'.
dolPrintHTML($obj->firstname).
'</td>';
949 print
'<td class="tdoverflowmax300" title="'.dolPrintHTMLForAttribute($obj->other).
'"><span class="small">'.
dolPrintHTML($obj->other).
'</small></td>';
951 print
'<td class="center tdoverflowmax150">';
952 if (empty($obj->source_id) || empty($obj->source_type)) {
953 print empty($obj->source_url) ?
'' : $obj->source_url;
955 if ($obj->source_type ==
'member') {
956 $objectstaticmember->fetch($obj->source_id);
957 print $objectstaticmember->getNomUrl(1);
958 } elseif ($obj->source_type ==
'user') {
959 $objectstaticuser->fetch($obj->source_id);
960 print $objectstaticuser->getNomUrl(1);
961 } elseif ($obj->source_type ==
'thirdparty') {
962 $objectstaticcompany->fetch($obj->source_id);
963 print $objectstaticcompany->getNomUrl(1);
964 } elseif ($obj->source_type ==
'contact') {
965 $objectstaticcontact->fetch($obj->source_id);
966 print $objectstaticcontact->getNomUrl(1);
967 } elseif ($obj->source_type ==
'eventorganizationattendee') {
968 $objectstaticeventorganization->fetch($obj->source_id);
969 print $objectstaticeventorganization->getNomUrl(1);
971 print $obj->source_url;
977 print
'<td class="center nowraponall">';
978 print
dol_print_date($db->jdate($obj->tms),
'dayhour',
'tzuserrel');
982 print
'<td class="center nowraponall">';
983 if ($obj->status != $object::STATUS_DRAFT) {
985 print
dol_print_date($db->jdate($obj->date_envoi),
'dayhour',
'tzuserrel');
990 print
'<td class="nowrap center">';
991 if ($obj->status == $object::STATUS_DRAFT) {
992 print $object::libStatutDest((
int) $obj->status, 2,
'');
994 print $object::libStatutDest((
int) $obj->status, 2, $obj->error_text);
999 if (!$conf->main_checkbox_left_column) {
1000 print
'<td class="center nowraponall">';
1001 print
'<!-- ID mailing_cibles = '.$obj->rowid.
' -->';
1002 if ($obj->status == $object::STATUS_DRAFT) {
1003 if ($user->hasRight(
'mailing',
'creer')) {
1004 print
'<a class="reposition marginleftonly" href="'.$_SERVER[
'PHP_SELF'].
'?action=delete&token='.
newToken().
'&rowid='.((int) $obj->rowid).$param.
'">'.
img_delete($langs->trans(
"RemoveRecipient")).
'</a>';
1018 if (
$object->status < $object::STATUS_SENTPARTIALY) {
1019 print
'<tr><td colspan="9">';
1020 print
'<span class="opacitymedium">'.$langs->trans(
"NoTargetYet").
'</span>';
1023 print
'<tr><td colspan="9">';
1024 print
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
1028 print
"</table><br>";
1038 print
"\n<!-- End list of selected targets -->\n";
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
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....
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
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.
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 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.
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.
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.
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.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
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.
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.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
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.