dolibarr 18.0.6
html.formmail.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
4 * Copyright (C) 2010-2011 Juanjo Menent <jmenent@2byte.es>
5 * Copyright (C) 2015-2017 Marcos García <marcosgdf@gmail.com>
6 * Copyright (C) 2015-2017 Nicolas ZABOURI <info@inovea-conseil.com>
7 * Copyright (C) 2018-2022 Frédéric France <frederic.france@netlogic.fr>
8 * Copyright (C) 2022 Charlene Benke <charlene@patas-monkey.com>
9 * Copyright (C) 2023 Anthony Berton <anthony.berton@bb2a.fr>
10 *
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
31require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
32
33
40class FormMail extends Form
41{
45 public $db;
46
52 public $withform;
53
57 public $fromname;
58
62 public $frommail;
63
67 public $fromtype;
68
72 public $fromid;
73
77 public $fromalsorobot;
78
82 public $totype;
83
87 public $toid;
88
92 public $replytoname;
93
97 public $replytomail;
98
102 public $toname;
103
107 public $tomail;
108
112 public $trackid;
113
117 public $inreplyto;
118
119 public $withsubstit; // Show substitution array
120 public $withfrom;
121
125 public $withto; // Show recipient emails
126 public $withreplyto;
127
133 public $withtofree;
134 public $withtocc;
135 public $withtoccc;
136 public $withtopic;
137
141 public $withfile;
142
146 public $withmaindocfile;
147 public $withbody;
148
149 public $withfromreadonly;
150 public $withreplytoreadonly;
151 public $withtoreadonly;
152 public $withtoccreadonly;
153 public $withtocccreadonly;
154 public $withtopicreadonly;
155 public $withfilereadonly;
156 public $withdeliveryreceipt;
157 public $withcancel;
158 public $withfckeditor;
159
160 public $substit = array();
161 public $substit_lines = array();
162 public $param = array();
163
164 public $withtouser = array();
165 public $withtoccuser = array();
166
167 public $lines_model;
168
169 // -1 suggest the checkbox 'one email per recipient' not checked, 0 = no suggestion, 1 = suggest and checked
170 public $withoptiononeemailperrecipient;
171
172
178 public function __construct($db)
179 {
180 $this->db = $db;
181
182 $this->withform = 1;
183
184 $this->withfrom = 1;
185 $this->withto = 1;
186 $this->withtofree = 1;
187 $this->withtocc = 1;
188 $this->withtoccc = 0;
189 $this->witherrorsto = 0;
190 $this->withtopic = 1;
191 $this->withfile = 0; // 1=Add section "Attached files". 2=Can add files.
192 $this->withmaindocfile = 0; // 1=Add a checkbox "Attach also main document" for mass actions (checked by default), -1=Add checkbox (not checked by default)
193 $this->withbody = 1;
194
195 $this->withfromreadonly = 1;
196 $this->withreplytoreadonly = 1;
197 $this->withtoreadonly = 0;
198 $this->withtoccreadonly = 0;
199 $this->withtocccreadonly = 0;
200 $this->witherrorstoreadonly = 0;
201 $this->withtopicreadonly = 0;
202 $this->withfilereadonly = 0;
203 $this->withbodyreadonly = 0;
204 $this->withdeliveryreceiptreadonly = 0;
205 $this->withfckeditor = -1; // -1 = Auto
206 }
207
208 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
214 public function clear_attached_files()
215 {
216 // phpcs:enable
217 global $conf, $user;
218 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
219
220 // Set tmp user directory
221 $vardir = $conf->user->dir_output."/".$user->id;
222 $upload_dir = $vardir.'/temp/'; // TODO Add $keytoavoidconflict in upload_dir path
223 if (is_dir($upload_dir)) {
224 dol_delete_dir_recursive($upload_dir);
225 }
226
227 $keytoavoidconflict = empty($this->trackid) ? '' : '-'.$this->trackid; // this->trackid must be defined
228 unset($_SESSION["listofpaths".$keytoavoidconflict]);
229 unset($_SESSION["listofnames".$keytoavoidconflict]);
230 unset($_SESSION["listofmimes".$keytoavoidconflict]);
231 }
232
233 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
242 public function add_attached_files($path, $file = '', $type = '')
243 {
244 // phpcs:enable
245 $listofpaths = array();
246 $listofnames = array();
247 $listofmimes = array();
248
249 if (empty($file)) {
250 $file = basename($path);
251 }
252 if (empty($type)) {
253 $type = dol_mimetype($file);
254 }
255
256 $keytoavoidconflict = empty($this->trackid) ? '' : '-'.$this->trackid; // this->trackid must be defined
257 if (!empty($_SESSION["listofpaths".$keytoavoidconflict])) {
258 $listofpaths = explode(';', $_SESSION["listofpaths".$keytoavoidconflict]);
259 }
260 if (!empty($_SESSION["listofnames".$keytoavoidconflict])) {
261 $listofnames = explode(';', $_SESSION["listofnames".$keytoavoidconflict]);
262 }
263 if (!empty($_SESSION["listofmimes".$keytoavoidconflict])) {
264 $listofmimes = explode(';', $_SESSION["listofmimes".$keytoavoidconflict]);
265 }
266 if (!in_array($file, $listofnames)) {
267 $listofpaths[] = $path;
268 $listofnames[] = $file;
269 $listofmimes[] = $type;
270 $_SESSION["listofpaths".$keytoavoidconflict] = join(';', $listofpaths);
271 $_SESSION["listofnames".$keytoavoidconflict] = join(';', $listofnames);
272 $_SESSION["listofmimes".$keytoavoidconflict] = join(';', $listofmimes);
273 }
274 }
275
276 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
283 public function remove_attached_files($keytodelete)
284 {
285 // phpcs:enable
286 $listofpaths = array();
287 $listofnames = array();
288 $listofmimes = array();
289
290 $keytoavoidconflict = empty($this->trackid) ? '' : '-'.$this->trackid; // this->trackid must be defined
291 if (!empty($_SESSION["listofpaths".$keytoavoidconflict])) {
292 $listofpaths = explode(';', $_SESSION["listofpaths".$keytoavoidconflict]);
293 }
294 if (!empty($_SESSION["listofnames".$keytoavoidconflict])) {
295 $listofnames = explode(';', $_SESSION["listofnames".$keytoavoidconflict]);
296 }
297 if (!empty($_SESSION["listofmimes".$keytoavoidconflict])) {
298 $listofmimes = explode(';', $_SESSION["listofmimes".$keytoavoidconflict]);
299 }
300 if ($keytodelete >= 0) {
301 unset($listofpaths[$keytodelete]);
302 unset($listofnames[$keytodelete]);
303 unset($listofmimes[$keytodelete]);
304 $_SESSION["listofpaths".$keytoavoidconflict] = join(';', $listofpaths);
305 $_SESSION["listofnames".$keytoavoidconflict] = join(';', $listofnames);
306 $_SESSION["listofmimes".$keytoavoidconflict] = join(';', $listofmimes);
307 //var_dump($_SESSION['listofpaths']);
308 }
309 }
310
311 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
317 public function get_attached_files()
318 {
319 // phpcs:enable
320 $listofpaths = array();
321 $listofnames = array();
322 $listofmimes = array();
323
324 $keytoavoidconflict = empty($this->trackid) ? '' : '-'.$this->trackid; // this->trackid must be defined
325 if (!empty($_SESSION["listofpaths".$keytoavoidconflict])) {
326 $listofpaths = explode(';', $_SESSION["listofpaths".$keytoavoidconflict]);
327 }
328 if (!empty($_SESSION["listofnames".$keytoavoidconflict])) {
329 $listofnames = explode(';', $_SESSION["listofnames".$keytoavoidconflict]);
330 }
331 if (!empty($_SESSION["listofmimes".$keytoavoidconflict])) {
332 $listofmimes = explode(';', $_SESSION["listofmimes".$keytoavoidconflict]);
333 }
334 return array('paths'=>$listofpaths, 'names'=>$listofnames, 'mimes'=>$listofmimes);
335 }
336
337 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
348 public function show_form($addfileaction = 'addfile', $removefileaction = 'removefile')
349 {
350 // phpcs:enable
351 print $this->get_form($addfileaction, $removefileaction);
352 }
353
354 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
365 public function get_form($addfileaction = 'addfile', $removefileaction = 'removefile')
366 {
367 // phpcs:enable
368 global $conf, $langs, $user, $hookmanager, $form;
369
370 // Required to show preview wof mail attachments
371 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
372 $formfile = new FormFile($this->db);
373
374 if (!is_object($form)) {
375 $form = new Form($this->db);
376 }
377
378 // Load translation files required by the page
379 $langs->loadLangs(array('other', 'mails', 'members'));
380
381 // Clear temp files. Must be done before call of triggers, at beginning (mode = init), or when we select a new template
382 if (GETPOST('mode', 'alpha') == 'init' || (GETPOST('modelselected') && GETPOST('modelmailselected', 'alpha') && GETPOST('modelmailselected', 'alpha') != '-1')) {
383 $this->clear_attached_files();
384 }
385
386 // Call hook getFormMail
387 $hookmanager->initHooks(array('formmail'));
388
389 $parameters = array(
390 'addfileaction' => $addfileaction,
391 'removefileaction'=> $removefileaction,
392 'trackid'=> $this->trackid
393 );
394 $reshook = $hookmanager->executeHooks('getFormMail', $parameters, $this);
395
396 if (!empty($reshook)) {
397 return $hookmanager->resPrint;
398 } else {
399 $out = '';
400
401 $disablebademails = 1;
402
403 // Define output language
404 $outputlangs = $langs;
405 $newlang = '';
406 if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($this->param['langsmodels'])) {
407 $newlang = $this->param['langsmodels'];
408 }
409 if (!empty($newlang)) {
410 $outputlangs = new Translate("", $conf);
411 $outputlangs->setDefaultLang($newlang);
412 $outputlangs->load('other');
413 }
414
415 // Get message template for $this->param["models"] into c_email_templates
416 $arraydefaultmessage = -1;
417 if ($this->param['models'] != 'none') {
418 $model_id = 0;
419 if (array_key_exists('models_id', $this->param)) {
420 $model_id = $this->param["models_id"];
421 }
422
423 $arraydefaultmessage = $this->getEMailTemplate($this->db, $this->param["models"], $user, $outputlangs, $model_id, 1, '', ($model_id > 0 ? -1 : 1)); // If $model_id is empty, preselect the first one
424 }
425
426 // Define list of attached files
427 $listofpaths = array();
428 $listofnames = array();
429 $listofmimes = array();
430 $keytoavoidconflict = empty($this->trackid) ? '' : '-'.$this->trackid; // this->trackid must be defined
431
432 if (GETPOST('mode', 'alpha') == 'init' || (GETPOST('modelselected') && GETPOST('modelmailselected', 'alpha') && GETPOST('modelmailselected', 'alpha') != '-1')) {
433 if (!empty($arraydefaultmessage->joinfiles) && !empty($this->param['fileinit']) && is_array($this->param['fileinit'])) {
434 foreach ($this->param['fileinit'] as $file) {
435 if (!empty($file)) {
436 $this->add_attached_files($file, basename($file), dol_mimetype($file));
437 }
438 }
439 }
440 }
441
442 if (!empty($_SESSION["listofpaths".$keytoavoidconflict])) {
443 $listofpaths = explode(';', $_SESSION["listofpaths".$keytoavoidconflict]);
444 }
445 if (!empty($_SESSION["listofnames".$keytoavoidconflict])) {
446 $listofnames = explode(';', $_SESSION["listofnames".$keytoavoidconflict]);
447 }
448 if (!empty($_SESSION["listofmimes".$keytoavoidconflict])) {
449 $listofmimes = explode(';', $_SESSION["listofmimes".$keytoavoidconflict]);
450 }
451
452
453 $out .= "\n".'<!-- Begin form mail type='.$this->param["models"].' --><div id="mailformdiv"></div>'."\n";
454 if ($this->withform == 1) {
455 $out .= '<form method="POST" name="mailform" id="mailform" enctype="multipart/form-data" action="'.$this->param["returnurl"].'#formmail">'."\n";
456
457 $out .= '<a id="formmail" name="formmail"></a>';
458 $out .= '<input style="display:none" type="submit" id="sendmailhidden" name="sendmail">';
459 $out .= '<input type="hidden" name="token" value="'.newToken().'" />';
460 $out .= '<input type="hidden" name="trackid" value="'.$this->trackid.'" />';
461 $out .= '<input type="hidden" name="inreplyto" value="'.$this->inreplyto.'" />';
462 }
463 if (!empty($this->withfrom)) {
464 if (!empty($this->withfromreadonly)) {
465 $out .= '<input type="hidden" id="fromname" name="fromname" value="'.$this->fromname.'" />';
466 $out .= '<input type="hidden" id="frommail" name="frommail" value="'.$this->frommail.'" />';
467 }
468 }
469 foreach ($this->param as $key => $value) {
470 if (is_array($value)) {
471 $out .= "<!-- param key=".$key." is array, we do not output input field for it -->\n";
472 } else {
473 $out .= '<input type="hidden" id="'.$key.'" name="'.$key.'" value="'.$value.'" />'."\n";
474 }
475 }
476
477 $modelmail_array = array();
478 if ($this->param['models'] != 'none') {
479 $result = $this->fetchAllEMailTemplate($this->param["models"], $user, $outputlangs);
480 if ($result < 0) {
481 setEventMessages($this->error, $this->errors, 'errors');
482 }
483
484 foreach ($this->lines_model as $line) {
485 $reg = array();
486 if (preg_match('/\‍((.*)\‍)/', $line->label, $reg)) {
487 $labeltouse = $langs->trans($reg[1]); // langs->trans when label is __(xxx)__
488 } else {
489 $labeltouse = $line->label;
490 }
491
492 // We escape the $labeltouse to store it into $modelmail_array.
493 $modelmail_array[$line->id] = dol_escape_htmltag($labeltouse);
494 if ($line->lang) {
495 $modelmail_array[$line->id] .= ' '.picto_from_langcode($line->lang);
496 }
497 if ($line->private) {
498 $modelmail_array[$line->id] .= ' - <span class="opacitymedium">'.dol_escape_htmltag($langs->trans("Private")).'</span>';
499 }
500 }
501 }
502
503 // Zone to select email template
504 if (count($modelmail_array) > 0) {
505 $model_mail_selected_id = GETPOSTISSET('modelmailselected') ? GETPOST('modelmailselected', 'int') : ($arraydefaultmessage->id > 0 ? $arraydefaultmessage->id : 0);
506
507 // If list of template is filled
508 $out .= '<div class="center" style="padding: 0px 0 12px 0">'."\n";
509
510 $out .= '<span class="opacitymedium">'.$langs->trans('SelectMailModel').':</span> ';
511
512 $out .= $this->selectarray('modelmailselected', $modelmail_array, $model_mail_selected_id, 1, 0, 0, '', 0, 0, 0, '', 'minwidth100', 1, '', 0, 1);
513 if ($user->admin) {
514 $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFrom", $langs->transnoentitiesnoconv('Setup').' - '.$langs->transnoentitiesnoconv('EMails')), 1);
515 }
516
517 $out .= ' &nbsp; ';
518 $out .= '<input type="submit" class="button reposition smallpaddingimp" value="'.$langs->trans('Apply').'" name="modelselected" id="modelselected">';
519 $out .= ' &nbsp; ';
520 $out .= '</div>';
521 } elseif (!empty($this->param['models']) && in_array($this->param['models'], array(
522 'propal_send', 'order_send', 'facture_send',
523 'shipping_send', 'fichinter_send', 'supplier_proposal_send', 'order_supplier_send',
524 'invoice_supplier_send', 'thirdparty', 'contract', 'user', 'recruitmentcandidature_send', 'all'
525 ))) {
526 // If list of template is empty
527 $out .= '<div class="center" style="padding: 0px 0 12px 0">'."\n";
528 $out .= '<span class="opacitymedium">'.$langs->trans('SelectMailModel').':</span> ';
529 $out .= '<select name="modelmailselected" disabled="disabled"><option value="none">'.$langs->trans("NoTemplateDefined").'</option></select>'; // Do not put 'disabled' on 'option' tag, it is already on 'select' and it makes chrome crazy.
530 if ($user->admin) {
531 $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFrom", $langs->transnoentitiesnoconv('Setup').' - '.$langs->transnoentitiesnoconv('EMails')), 1);
532 }
533 $out .= ' &nbsp; ';
534 $out .= '<input type="submit" class="button" value="'.$langs->trans('Apply').'" name="modelselected" disabled="disabled" id="modelselected">';
535 $out .= ' &nbsp; ';
536 $out .= '</div>';
537 } else {
538 $out .= '<!-- No template available for $this->param["models"] = '.$this->param['models'].' -->';
539 }
540
541
542 $out .= '<table class="tableforemailform boxtablenotop centpercent">'."\n";
543
544 // Substitution array/string
545 $helpforsubstitution = '';
546 if (is_array($this->substit) && count($this->substit)) {
547 $helpforsubstitution .= $langs->trans('AvailableVariables').' :<br><br><span class="small">'."\n";
548 }
549 foreach ($this->substit as $key => $val) {
550 // Do not show deprecated variables into the tooltip help of substitution variables
551 if (in_array($key, array('__NEWREF__', '__REFCLIENT__', '__REFSUPPLIER__', '__SUPPLIER_ORDER_DATE_DELIVERY__', '__SUPPLIER_ORDER_DELAY_DELIVERY__'))) {
552 continue;
553 }
554 $helpforsubstitution .= $key.' -> '.$langs->trans(dol_string_nohtmltag(dolGetFirstLineOfText($val))).'<br>';
555 }
556 if (is_array($this->substit) && count($this->substit)) {
557 $helpforsubstitution .= '</span>';
558 }
559
560 if (!empty($this->withsubstit)) { // Unset or set ->withsubstit=0 to disable this.
561 $out .= '<tr><td colspan="2" class="right">';
562 if (is_numeric($this->withsubstit)) {
563 $out .= $form->textwithpicto($langs->trans("EMailTestSubstitutionReplacedByGenericValues"), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltip'); // Old usage
564 } else {
565 $out .= $form->textwithpicto($langs->trans('AvailableVariables'), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltip'); // New usage
566 }
567 $out .= "</td></tr>\n";
568 }
569
570 // From
571 if (!empty($this->withfrom)) {
572 if (!empty($this->withfromreadonly)) {
573 $out .= '<tr><td class="fieldrequired minwidth200">'.$langs->trans("MailFrom").'</td><td>';
574
575 // $this->fromtype is the default value to use to select sender
576 if (!($this->fromtype === 'user' && $this->fromid > 0)
577 && !($this->fromtype === 'company')
578 && !($this->fromtype === 'robot')
579 && !preg_match('/user_aliases/', $this->fromtype)
580 && !preg_match('/global_aliases/', $this->fromtype)
581 && !preg_match('/senderprofile/', $this->fromtype)
582 ) {
583 // Use this->fromname and this->frommail or error if not defined
584 $out .= $this->fromname;
585 if ($this->frommail) {
586 $out .= ' &lt;'.$this->frommail.'&gt;';
587 } else {
588 if ($this->fromtype) {
589 $langs->load('errors');
590 $out .= '<span class="warning"> &lt;'.$langs->trans('ErrorNoMailDefinedForThisUser').'&gt; </span>';
591 }
592 }
593 } else {
594 $liste = array();
595
596 // Add user email
597 if (empty($user->email)) {
598 $langs->load('errors');
599 $s = $user->getFullName($langs).' &lt;'.$langs->trans('ErrorNoMailDefinedForThisUser').'&gt;';
600 } else {
601 $s = $user->getFullName($langs).' &lt;'.$user->email.'&gt;';
602 }
603 $liste['user'] = array('label' => $s, 'data-html' => $s);
604
605 // Add also company main email
606 if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
607 $s = (empty($conf->global->MAIN_INFO_SOCIETE_NOM)?$conf->global->MAIN_INFO_SOCIETE_EMAIL:$conf->global->MAIN_INFO_SOCIETE_NOM).' &lt;'.$conf->global->MAIN_INFO_SOCIETE_MAIL.'&gt;';
608 $liste['company'] = array('label' => $s, 'data-html' => $s);
609 }
610
611 // Add also email aliases if there is some
612 $listaliases = array(
613 'user_aliases' => (empty($user->email_aliases) ? '' : $user->email_aliases),
614 'global_aliases' => getDolGlobalString('MAIN_INFO_SOCIETE_MAIL_ALIASES'),
615 );
616
617 // Also add robot email
618 if (!empty($this->fromalsorobot)) {
619 if (!empty($conf->global->MAIN_MAIL_EMAIL_FROM) && getDolGlobalString('MAIN_MAIL_EMAIL_FROM') != getDolGlobalString('MAIN_INFO_SOCIETE_MAIL')) {
620 $s = $conf->global->MAIN_MAIL_EMAIL_FROM;
621 if ($this->frommail) {
622 $s .= ' &lt;'.$conf->global->MAIN_MAIL_EMAIL_FROM.'&gt;';
623 }
624 array('label' => $s, 'data-html' => $s);
625 }
626 }
627
628 // Add also email aliases from the c_email_senderprofile table
629 $sql = "SELECT rowid, label, email FROM ".$this->db->prefix()."c_email_senderprofile";
630 $sql .= " WHERE active = 1 AND (private = 0 OR private = ".((int) $user->id).")";
631 $sql .= " ORDER BY position";
632 $resql = $this->db->query($sql);
633 if ($resql) {
634 $num = $this->db->num_rows($resql);
635 $i = 0;
636 while ($i < $num) {
637 $obj = $this->db->fetch_object($resql);
638 if ($obj) {
639 $listaliases['senderprofile_'.$obj->rowid] = $obj->label.' <'.$obj->email.'>';
640 }
641 $i++;
642 }
643 } else {
644 dol_print_error($this->db);
645 }
646
647 foreach ($listaliases as $typealias => $listalias) {
648 $posalias = 0;
649 $listaliasarray = explode(',', $listalias);
650 foreach ($listaliasarray as $listaliasval) {
651 $posalias++;
652 $listaliasval = trim($listaliasval);
653 if ($listaliasval) {
654 $listaliasval = preg_replace('/</', '&lt;', $listaliasval);
655 $listaliasval = preg_replace('/>/', '&gt;', $listaliasval);
656 if (!preg_match('/&lt;/', $listaliasval)) {
657 $listaliasval = '&lt;'.$listaliasval.'&gt;';
658 }
659 $liste[$typealias.'_'.$posalias] = array('label' => $listaliasval, 'data-html' => $listaliasval);
660 }
661 }
662 }
663
664 // Using combo here make the '<email>' no more visible on list.
665 //$out.= ' '.$form->selectarray('fromtype', $liste, $this->fromtype, 0, 0, 0, '', 0, 0, 0, '', 'fromforsendingprofile maxwidth200onsmartphone', 1, '', $disablebademails);
666 $out .= ' '.$form->selectarray('fromtype', $liste, $this->fromtype, 0, 0, 0, '', 0, 0, 0, '', 'fromforsendingprofile maxwidth200onsmartphone', 0, '', $disablebademails);
667 }
668
669 $out .= "</td></tr>\n";
670 } else {
671 $out .= '<tr><td class="fieldrequired width200">'.$langs->trans("MailFrom")."</td><td>";
672 $out .= $langs->trans("Name").':<input type="text" id="fromname" name="fromname" class="maxwidth200onsmartphone" value="'.$this->fromname.'" />';
673 $out .= '&nbsp; &nbsp; ';
674 $out .= $langs->trans("EMail").':&lt;<input type="text" id="frommail" name="frommail" class="maxwidth200onsmartphone" value="'.$this->frommail.'" />&gt;';
675 $out .= "</td></tr>\n";
676 }
677 }
678
679 // To
680 if (!empty($this->withto) || is_array($this->withto)) {
681 $out .= $this->getHtmlForTo();
682 }
683
684 // To User
685 if (!empty($this->withtouser) && is_array($this->withtouser) && !empty($conf->global->MAIN_MAIL_ENABLED_USER_DEST_SELECT)) {
686 $out .= '<tr><td>';
687 $out .= $langs->trans("MailToUsers");
688 $out .= '</td><td>';
689
690 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
691 $tmparray = $this->withtouser;
692 foreach ($tmparray as $key => $val) {
693 $tmparray[$key] = dol_htmlentities($tmparray[$key], null, 'UTF-8', true);
694 }
695 $withtoselected = GETPOST("receiveruser", 'array'); // Array of selected value
696 if (empty($withtoselected) && count($tmparray) == 1 && GETPOST('action', 'aZ09') == 'presend') {
697 $withtoselected = array_keys($tmparray);
698 }
699 $out .= $form->multiselectarray("receiveruser", $tmparray, $withtoselected, null, null, 'inline-block minwidth500', null, "");
700 $out .= "</td></tr>\n";
701 }
702
703 // With option for one email per recipient
704 if (!empty($this->withoptiononeemailperrecipient)) {
705 if (abs($this->withoptiononeemailperrecipient) == 1) {
706 $out .= '<tr><td class="minwidth200">';
707 $out .= $langs->trans("GroupEmails");
708 $out .= '</td><td>';
709 $out .= ' <input type="checkbox" id="oneemailperrecipient" value="1" name="oneemailperrecipient"'.($this->withoptiononeemailperrecipient > 0 ? ' checked="checked"' : '').'> ';
710 $out .= '<label for="oneemailperrecipient">';
711 $out .= $form->textwithpicto($langs->trans("OneEmailPerRecipient"), $langs->trans("WarningIfYouCheckOneRecipientPerEmail"), 1, 'help');
712 $out .= '</label>';
713 //$out .= '<span class="hideonsmartphone opacitymedium">';
714 //$out .= ' - ';
715 //$out .= $langs->trans("WarningIfYouCheckOneRecipientPerEmail");
716 //$out .= '</span>';
717 if (getDolGlobalString('MASS_ACTION_EMAIL_ON_DIFFERENT_THIRPARTIES_ADD_CUSTOM_EMAIL')) {
718 if (!empty($this->withto) && !is_array($this->withto)) {
719 $out .= ' '.$langs->trans("or").' <input type="email" name="emailto" value="">';
720 }
721 }
722 $out .= '</td></tr>';
723 } else {
724 $out .= '<tr><td><input type="hidden" name="oneemailperrecipient" value="1"></td><td></td></tr>';
725 }
726 }
727
728 // CC
729 if (!empty($this->withtocc) || is_array($this->withtocc)) {
730 $out .= $this->getHtmlForCc();
731 }
732
733 // To User cc
734 if (!empty($this->withtoccuser) && is_array($this->withtoccuser) && !empty($conf->global->MAIN_MAIL_ENABLED_USER_DEST_SELECT)) {
735 $out .= '<tr><td>';
736 $out .= $langs->trans("MailToCCUsers");
737 $out .= '</td><td>';
738
739 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
740 $tmparray = $this->withtoccuser;
741 foreach ($tmparray as $key => $val) {
742 $tmparray[$key] = dol_htmlentities($tmparray[$key], null, 'UTF-8', true);
743 }
744 $withtoselected = GETPOST("receiverccuser", 'array'); // Array of selected value
745 if (empty($withtoselected) && count($tmparray) == 1 && GETPOST('action', 'aZ09') == 'presend') {
746 $withtoselected = array_keys($tmparray);
747 }
748 $out .= $form->multiselectarray("receiverccuser", $tmparray, $withtoselected, null, null, 'inline-block minwidth500', null, "");
749 $out .= "</td></tr>\n";
750 }
751
752 // CCC
753 if (!empty($this->withtoccc) || is_array($this->withtoccc)) {
754 $out .= $this->getHtmlForWithCcc();
755 }
756
757 // Replyto
758 if (!empty($this->withreplyto)) {
759 if ($this->withreplytoreadonly) {
760 $out .= '<input type="hidden" id="replyname" name="replyname" value="'.$this->replytoname.'" />';
761 $out .= '<input type="hidden" id="replymail" name="replymail" value="'.$this->replytomail.'" />';
762 $out .= "<tr><td>".$langs->trans("MailReply")."</td><td>".$this->replytoname.($this->replytomail ? (" &lt;".$this->replytomail."&gt;") : "");
763 $out .= "</td></tr>\n";
764 }
765 }
766
767 // Errorsto
768 if (!empty($this->witherrorsto)) {
769 $out .= $this->getHtmlForWithErrorsTo();
770 }
771
772 // Ask delivery receipt
773 if (!empty($this->withdeliveryreceipt) && getDolGlobalInt('MAIN_EMAIL_SUPPORT_ACK')) {
774 $out .= $this->getHtmlForDeliveryReceipt();
775 }
776
777 // Topic
778 if (!empty($this->withtopic)) {
779 $out .= $this->getHtmlForTopic($arraydefaultmessage, $helpforsubstitution);
780 }
781
782 // Attached files
783 if (!empty($this->withfile)) {
784 $out .= '<tr>';
785 $out .= '<td>'.$langs->trans("MailFile").'</td>';
786
787 $out .= '<td>';
788
789 if ($this->withmaindocfile) {
790 // withmaindocfile is set to 1 or -1 to show the checkbox (-1 = checked or 1 = not checked)
791 if (GETPOSTISSET('sendmail')) {
792 $this->withmaindocfile = (GETPOST('addmaindocfile', 'alpha') ? -1 : 1);
793 } elseif (is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
794 // If a template was selected, we use setup of template to define if join file checkbox is selected or not.
795 $this->withmaindocfile = ($arraydefaultmessage->joinfiles ? -1 : 1);
796 }
797 }
798
799 if (!empty($this->withmaindocfile)) {
800 if ($this->withmaindocfile == 1) {
801 $out .= '<input type="checkbox" id="addmaindocfile" name="addmaindocfile" value="1" />';
802 } elseif ($this->withmaindocfile == -1) {
803 $out .= '<input type="checkbox" id="addmaindocfile" name="addmaindocfile" value="1" checked="checked" />';
804 }
805 if (!empty($conf->global->MAIL_MASS_ACTION_ADD_LAST_IF_MAIN_DOC_NOT_FOUND)) {
806 $out .= ' <label for="addmaindocfile">'.$langs->trans("JoinMainDocOrLastGenerated").'.</label><br>';
807 } else {
808 $out .= ' <label for="addmaindocfile">'.$langs->trans("JoinMainDoc").'.</label><br>';
809 }
810 }
811
812 if (is_numeric($this->withfile)) {
813 // TODO Trick to have param removedfile containing nb of file to delete. But this does not works without javascript
814 $out .= '<input type="hidden" class="removedfilehidden" name="removedfile" value="">'."\n";
815 $out .= '<script nonce="'.getNonce().'" type="text/javascript">';
816 $out .= 'jQuery(document).ready(function () {';
817 $out .= ' jQuery(".removedfile").click(function() {';
818 $out .= ' jQuery(".removedfilehidden").val(jQuery(this).val());';
819 $out .= ' });';
820 $out .= '})';
821 $out .= '</script>'."\n";
822 if (count($listofpaths)) {
823 foreach ($listofpaths as $key => $val) {
824 $relativepathtofile = substr($val, (strlen(DOL_DATA_ROOT) - strlen($val)));
825
826 if ($conf->entity > 1) {
827 $relativepathtofile = str_replace('/'.$conf->entity.'/', '/', $relativepathtofile);
828 }
829 // Try to extract data from full path
830 $formfile_params = array();
831 preg_match('#^(/)(\w+)(/)(.+)$#', $relativepathtofile, $formfile_params);
832
833 $out .= '<div id="attachfile_'.$key.'">';
834 // Preview of attachment
835 $out .= img_mime($listofnames[$key]).' '.$listofnames[$key];
836
837 $out .= $formfile->showPreview(array(), $formfile_params[2], $formfile_params[4]);
838 if (!$this->withfilereadonly) {
839 $out .= ' <input type="image" style="border: 0px;" src="'.DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/delete.png" value="'.($key + 1).'" class="removedfile" id="removedfile_'.$key.'" name="removedfile_'.$key.'" />';
840 //$out.= ' <a href="'.$_SERVER["PHP_SELF"].'?removedfile='.($key+1).' id="removedfile_'.$key.'">'.img_delete($langs->trans("Delete").'</a>';
841 }
842 $out .= '<br></div>';
843 }
844 } elseif (empty($this->withmaindocfile)) {
845 //$out .= '<span class="opacitymedium">'.$langs->trans("NoAttachedFiles").'</span><br>';
846 }
847 if ($this->withfile == 2) {
848 $maxfilesizearray = getMaxFileSizeArray();
849 $maxmin = $maxfilesizearray['maxmin'];
850 if ($maxmin > 0) {
851 $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.($maxmin * 1024).'">'; // MAX_FILE_SIZE must precede the field type=file
852 }
853 // Can add other files
854 if (empty($conf->global->FROM_MAIL_DONT_USE_INPUT_FILE_MULTIPLE)) {
855 $out .= '<input type="file" class="flat" id="addedfile" name="addedfile[]" value="'.$langs->trans("Upload").'" multiple />';
856 } else {
857 $out .= '<input type="file" class="flat" id="addedfile" name="addedfile" value="'.$langs->trans("Upload").'" />';
858 }
859 $out .= ' ';
860 $out .= '<input type="submit" class="button smallpaddingimp" id="'.$addfileaction.'" name="'.$addfileaction.'" value="'.$langs->trans("MailingAddFile").'" />';
861 }
862 } else {
863 $out .= $this->withfile;
864 }
865
866 $out .= "</td></tr>\n";
867 }
868
869 // Message
870 if (!empty($this->withbody)) {
871 $defaultmessage = GETPOST('message', 'restricthtml');
872 if (!GETPOST('modelselected', 'alpha') || GETPOST('modelmailselected') != '-1') {
873 if ($arraydefaultmessage && $arraydefaultmessage->content) {
874 $defaultmessage = $arraydefaultmessage->content;
875 } elseif (!is_numeric($this->withbody)) {
876 $defaultmessage = $this->withbody;
877 }
878 }
879
880 // Complete substitution array with the url to make online payment
881 $paymenturl = '';
882 $validpaymentmethod = array();
883 if (empty($this->substit['__REF__'])) {
884 $paymenturl = '';
885 } else {
886 // Set the online payment url link into __ONLINE_PAYMENT_URL__ key
887 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
888 $langs->loadLangs(array('paypal', 'other'));
889 $typeforonlinepayment = 'free';
890 if ($this->param["models"] == 'order' || $this->param["models"] == 'order_send') {
891 $typeforonlinepayment = 'order'; // TODO use detection on something else than template
892 }
893 if ($this->param["models"] == 'invoice' || $this->param["models"] == 'facture_send') {
894 $typeforonlinepayment = 'invoice'; // TODO use detection on something else than template
895 }
896 if ($this->param["models"] == 'member') {
897 $typeforonlinepayment = 'member'; // TODO use detection on something else than template
898 }
899 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $this->substit['__REF__']);
900 $paymenturl = $url;
901
902 $validpaymentmethod = getValidOnlinePaymentMethods('');
903 }
904
905 if (count($validpaymentmethod) > 0 && $paymenturl) {
906 $langs->load('other');
907 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = str_replace('\n', "\n", $langs->transnoentities("PredefinedMailContentLink", $paymenturl));
908 $this->substit['__ONLINE_PAYMENT_URL__'] = $paymenturl;
909 } else {
910 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = '';
911 $this->substit['__ONLINE_PAYMENT_URL__'] = '';
912 }
913
914 $this->substit['__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__'] = '';
915
916 // Add lines substitution key from each line
917 $lines = '';
918 $defaultlines = $arraydefaultmessage->content_lines;
919 if (isset($defaultlines)) {
920 foreach ($this->substit_lines as $substit_line) {
921 $lines .= make_substitutions($defaultlines, $substit_line)."\n";
922 }
923 }
924 $this->substit['__LINES__'] = $lines;
925
926 $defaultmessage = str_replace('\n', "\n", $defaultmessage);
927
928 // Deal with format differences between message and some substitution variables (text / HTML)
929 $atleastonecomponentishtml = 0;
930 if (strpos($defaultmessage, '__USER_SIGNATURE__') !== false && dol_textishtml($this->substit['__USER_SIGNATURE__'])) {
931 $atleastonecomponentishtml++;
932 }
933 if (strpos($defaultmessage, '__SENDEREMAIL_SIGNATURE__') !== false && dol_textishtml($this->substit['__SENDEREMAIL_SIGNATURE__'])) {
934 $atleastonecomponentishtml++;
935 }
936 if (strpos($defaultmessage, '__ONLINE_PAYMENT_TEXT_AND_URL__') !== false && dol_textishtml($this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'])) {
937 $atleastonecomponentishtml++;
938 }
939 if (strpos($defaultmessage, '__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__') !== false && dol_textishtml($this->substit['__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__'])) {
940 $atleastonecomponentishtml++;
941 }
942 if (dol_textishtml($defaultmessage)) {
943 $atleastonecomponentishtml++;
944 }
945 if ($atleastonecomponentishtml) {
946 if (!dol_textishtml($this->substit['__USER_SIGNATURE__'])) {
947 $this->substit['__USER_SIGNATURE__'] = dol_nl2br($this->substit['__USER_SIGNATURE__']);
948 }
949 if (!dol_textishtml($this->substit['__SENDEREMAIL_SIGNATURE__'])) {
950 $this->substit['__SENDEREMAIL_SIGNATURE__'] = dol_nl2br($this->substit['__SENDEREMAIL_SIGNATURE__']);
951 }
952 if (!dol_textishtml($this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'])) {
953 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = dol_nl2br($this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__']);
954 }
955 if (!dol_textishtml($defaultmessage)) {
956 $defaultmessage = dol_nl2br($defaultmessage);
957 }
958 }
959
960 if (GETPOSTISSET("message") && !GETPOST('modelselected')) {
961 $defaultmessage = GETPOST("message", "restricthtml");
962 } else {
963 $defaultmessage = make_substitutions($defaultmessage, $this->substit);
964 // Clean first \n and br (to avoid empty line when CONTACTCIVNAME is empty)
965 $defaultmessage = preg_replace("/^(<br>)+/", "", $defaultmessage);
966 $defaultmessage = preg_replace("/^\n+/", "", $defaultmessage);
967 }
968
969 $out .= '<tr>';
970 $out .= '<td colspan="2">';
971 $out .= $form->textwithpicto($langs->trans('MailText'), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltipfrombody');
972 $out .= '</td>';
973 $out .= '</tr>';
974
975 $out .= '<tr>';
976 $out .= '<td colspan="2">';
977 if ($this->withbodyreadonly) {
978 $out .= nl2br($defaultmessage);
979 $out .= '<input type="hidden" id="message" name="message" value="'.$defaultmessage.'" />';
980 } else {
981 if (!isset($this->ckeditortoolbar)) {
982 $this->ckeditortoolbar = 'dolibarr_mailings';
983 }
984
985 // Editor wysiwyg
986 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
987 if ($this->withfckeditor == -1) {
988 if (!empty($conf->global->FCKEDITOR_ENABLE_MAIL)) {
989 $this->withfckeditor = 1;
990 } else {
991 $this->withfckeditor = 0;
992 }
993 }
994
995 $doleditor = new DolEditor('message', $defaultmessage, '', 280, $this->ckeditortoolbar, 'In', true, true, $this->withfckeditor, 8, '95%');
996 $out .= $doleditor->Create(1);
997 }
998 $out .= "</td></tr>\n";
999 }
1000
1001 $out .= '</table>'."\n";
1002
1003 if ($this->withform == 1 || $this->withform == -1) {
1004 $out .= '<div class="center">';
1005 $out .= '<input type="submit" class="button button-add" id="sendmail" name="sendmail" value="'.$langs->trans("SendMail").'"';
1006 // Add a javascript test to avoid to forget to submit file before sending email
1007 if ($this->withfile == 2 && $conf->use_javascript_ajax) {
1008 $out .= ' onClick="if (document.mailform.addedfile.value != \'\') { alert(\''.dol_escape_js($langs->trans("FileWasNotUploaded")).'\'); return false; } else { return true; }"';
1009 }
1010 $out .= ' />';
1011 if ($this->withcancel) {
1012 $out .= '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'" />';
1013 }
1014 $out .= '</div>'."\n";
1015 }
1016
1017 if ($this->withform == 1) {
1018 $out .= '</form>'."\n";
1019 }
1020
1021 // Disable enter key if option MAIN_MAILFORM_DISABLE_ENTERKEY is set
1022 if (!empty($conf->global->MAIN_MAILFORM_DISABLE_ENTERKEY)) {
1023 $out .= '<script nonce="'.getNonce().'" type="text/javascript">';
1024 $out .= 'jQuery(document).ready(function () {';
1025 $out .= ' $(document).on("keypress", \'#mailform\', function (e) { /* Note this is called at every key pressed ! */
1026 var code = e.keyCode || e.which;
1027 if (code == 13) {
1028 console.log("Enter was intercepted and blocked");
1029 e.preventDefault();
1030 return false;
1031 }
1032 });';
1033 $out .= ' })';
1034 $out .= '</script>';
1035 }
1036
1037 $out .= "<!-- End form mail -->\n";
1038
1039 return $out;
1040 }
1041 }
1042
1048 public function getHtmlForTo()
1049 {
1050 global $langs, $form;
1051 $out = '<tr><td class="fieldrequired">';
1052 if ($this->withtofree) {
1053 $out .= $form->textwithpicto($langs->trans("MailTo"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients"));
1054 } else {
1055 $out .= $langs->trans("MailTo");
1056 }
1057 $out .= '</td><td>';
1058 if ($this->withtoreadonly) {
1059 if (!empty($this->toname) && !empty($this->tomail)) {
1060 $out .= '<input type="hidden" id="toname" name="toname" value="'.$this->toname.'" />';
1061 $out .= '<input type="hidden" id="tomail" name="tomail" value="'.$this->tomail.'" />';
1062 if ($this->totype == 'thirdparty') {
1063 $soc = new Societe($this->db);
1064 $soc->fetch($this->toid);
1065 $out .= $soc->getNomUrl(1);
1066 } elseif ($this->totype == 'contact') {
1067 $contact = new Contact($this->db);
1068 $contact->fetch($this->toid);
1069 $out .= $contact->getNomUrl(1);
1070 } else {
1071 $out .= $this->toname;
1072 }
1073 $out .= ' &lt;'.$this->tomail.'&gt;';
1074 if ($this->withtofree) {
1075 $out .= '<br>'.$langs->trans("and").' <input class="minwidth200" id="sendto" name="sendto" value="'.(!is_array($this->withto) && !is_numeric($this->withto) ? (GETPOSTISSET("sendto") ? GETPOST("sendto") : $this->withto) : "").'" />';
1076 }
1077 } else {
1078 // Note withto may be a text like 'AllRecipientSelected'
1079 $out .= (!is_array($this->withto) && !is_numeric($this->withto)) ? $this->withto : "";
1080 }
1081 } else {
1082 // The free input of email
1083 if (!empty($this->withtofree)) {
1084 $out .= '<input class="minwidth200" id="sendto" name="sendto" value="'.(($this->withtofree && !is_numeric($this->withtofree)) ? $this->withtofree : (!is_array($this->withto) && !is_numeric($this->withto) ? (GETPOSTISSET("sendto") ? GETPOST("sendto") : $this->withto) : "")).'" />';
1085 }
1086 // The select combo
1087 if (!empty($this->withto) && is_array($this->withto)) {
1088 if (!empty($this->withtofree)) {
1089 $out .= " ".$langs->trans("and")."/".$langs->trans("or")." ";
1090 }
1091 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
1092 $tmparray = $this->withto;
1093 foreach ($tmparray as $key => $val) {
1094 $tmparray[$key] = str_replace(array('<', '>'), array('(', ')'), $tmparray[$key]);
1095 $tmparray[$key] = dol_htmlentities($tmparray[$key], ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8', true);
1096 }
1097
1098 $withtoselected = GETPOST("receiver", 'array'); // Array of selected value
1099 if (!getDolGlobalInt('MAIN_MAIL_NO_WITH_TO_SELECTED')) {
1100 if (empty($withtoselected) && count($tmparray) == 1 && GETPOST('action', 'aZ09') == 'presend') {
1101 $withtoselected = array_keys($tmparray);
1102 }
1103 }
1104
1105 $out .= $form->multiselectarray("receiver", $tmparray, $withtoselected, null, null, 'inline-block minwidth500', null, "");
1106 }
1107 }
1108 $out .= "</td></tr>\n";
1109 return $out;
1110 }
1111
1117 public function getHtmlForCc()
1118 {
1119 global $langs, $form;
1120 $out = '<tr><td>';
1121 $out .= $form->textwithpicto($langs->trans("MailCC"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients"));
1122 $out .= '</td><td>';
1123 if ($this->withtoccreadonly) {
1124 $out .= (!is_array($this->withtocc) && !is_numeric($this->withtocc)) ? $this->withtocc : "";
1125 } else {
1126 $out .= '<input class="minwidth200" id="sendtocc" name="sendtocc" value="'.(GETPOST("sendtocc", "alpha") ? GETPOST("sendtocc", "alpha") : ((!is_array($this->withtocc) && !is_numeric($this->withtocc)) ? $this->withtocc : '')).'" />';
1127 if (!empty($this->withtocc) && is_array($this->withtocc)) {
1128 $out .= " ".$langs->trans("and")."/".$langs->trans("or")." ";
1129 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
1130 $tmparray = $this->withtocc;
1131 foreach ($tmparray as $key => $val) {
1132 $tmparray[$key] = str_replace(array('<', '>'), array('(', ')'), $tmparray[$key]);
1133 $tmparray[$key] = dol_htmlentities($tmparray[$key], ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8', true);
1134 }
1135 $withtoccselected = GETPOST("receivercc", 'array'); // Array of selected value
1136 $out .= $form->multiselectarray("receivercc", $tmparray, $withtoccselected, null, null, 'inline-block minwidth500', null, "");
1137 }
1138 }
1139 $out .= "</td></tr>\n";
1140 return $out;
1141 }
1142
1148 public function getHtmlForWithCcc()
1149 {
1150 global $conf, $langs, $form;
1151 $out = '<tr><td>';
1152 $out .= $form->textwithpicto($langs->trans("MailCCC"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients"));
1153 $out .= '</td><td>';
1154 if (!empty($this->withtocccreadonly)) {
1155 $out .= (!is_array($this->withtoccc) && !is_numeric($this->withtoccc)) ? $this->withtoccc : "";
1156 } else {
1157 $out .= '<input class="minwidth200" id="sendtoccc" name="sendtoccc" value="'.(GETPOSTISSET("sendtoccc") ? GETPOST("sendtoccc", "alpha") : ((!is_array($this->withtoccc) && !is_numeric($this->withtoccc)) ? $this->withtoccc : '')).'" />';
1158 if (!empty($this->withtoccc) && is_array($this->withtoccc)) {
1159 $out .= " ".$langs->trans("and")."/".$langs->trans("or")." ";
1160 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
1161 $tmparray = $this->withtoccc;
1162 foreach ($tmparray as $key => $val) {
1163 $tmparray[$key] = dol_htmlentities($tmparray[$key], null, 'UTF-8', true);
1164 }
1165 $withtocccselected = GETPOST("receiverccc", 'array'); // Array of selected value
1166 $out .= $form->multiselectarray("receiverccc", $tmparray, $withtocccselected, null, null, null, null, "90%");
1167 }
1168 }
1169
1170 $showinfobcc = '';
1171 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_PROPOSAL_TO) && !empty($this->param['models']) && $this->param['models'] == 'propal_send') {
1172 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_PROPOSAL_TO;
1173 }
1174 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_ORDER_TO) && !empty($this->param['models']) && $this->param['models'] == 'order_send') {
1175 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_ORDER_TO;
1176 }
1177 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO) && !empty($this->param['models']) && $this->param['models'] == 'facture_send') {
1178 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO;
1179 }
1180 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_PROPOSAL_TO) && !empty($this->param['models']) && $this->param['models'] == 'supplier_proposal_send') {
1181 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_PROPOSAL_TO;
1182 }
1183 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO) && !empty($this->param['models']) && $this->param['models'] == 'order_supplier_send') {
1184 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO;
1185 }
1186 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO) && !empty($this->param['models']) && $this->param['models'] == 'invoice_supplier_send') {
1187 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO;
1188 }
1189 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_PROJECT_TO) && !empty($this->param['models']) && $this->param['models'] == 'project') {
1190 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_PROJECT_TO;
1191 }
1192 if ($showinfobcc) {
1193 $out .= ' + '.$showinfobcc;
1194 }
1195 $out .= "</td></tr>\n";
1196 return $out;
1197 }
1198
1204 public function getHtmlForWithErrorsTo()
1205 {
1206 global $conf, $langs;
1207 //if (! $this->errorstomail) $this->errorstomail=$this->frommail;
1208 $errorstomail = getDolGlobalString('MAIN_MAIL_ERRORS_TO', (!empty($this->errorstomail) ? $this->errorstomail : ''));
1209 if ($this->witherrorstoreadonly) {
1210 $out = '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
1211 $out .= '<input type="hidden" id="errorstomail" name="errorstomail" value="'.$errorstomail.'" />';
1212 $out .= $errorstomail;
1213 $out .= "</td></tr>\n";
1214 } else {
1215 $out = '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
1216 $out .= '<input class="minwidth200" id="errorstomail" name="errorstomail" value="'.$errorstomail.'" />';
1217 $out .= "</td></tr>\n";
1218 }
1219 return $out;
1220 }
1221
1227 public function getHtmlForDeliveryreceipt()
1228 {
1229 global $conf, $langs;
1230 $out = '<tr><td><label for="deliveryreceipt">'.$langs->trans("DeliveryReceipt").'</label></td><td>';
1231
1232 if (!empty($this->withdeliveryreceiptreadonly)) {
1233 $out .= yn($this->withdeliveryreceipt);
1234 } else {
1235 $defaultvaluefordeliveryreceipt = 0;
1236 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_PROPAL) && !empty($this->param['models']) && $this->param['models'] == 'propal_send') {
1237 $defaultvaluefordeliveryreceipt = 1;
1238 }
1239 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_SUPPLIER_PROPOSAL) && !empty($this->param['models']) && $this->param['models'] == 'supplier_proposal_send') {
1240 $defaultvaluefordeliveryreceipt = 1;
1241 }
1242 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_ORDER) && !empty($this->param['models']) && $this->param['models'] == 'order_send') {
1243 $defaultvaluefordeliveryreceipt = 1;
1244 }
1245 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_INVOICE) && !empty($this->param['models']) && $this->param['models'] == 'facture_send') {
1246 $defaultvaluefordeliveryreceipt = 1;
1247 }
1248 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_SUPPLIER_ORDER) && !empty($this->param['models']) && $this->param['models'] == 'order_supplier_send') {
1249 $defaultvaluefordeliveryreceipt = 1;
1250 }
1251 //$out .= $form->selectyesno('deliveryreceipt', (GETPOSTISSET("deliveryreceipt") ? GETPOST("deliveryreceipt") : $defaultvaluefordeliveryreceipt), 1);
1252 $out .= '<input type="checkbox" id="deliveryreceipt" name="deliveryreceipt" value="1"'.((GETPOSTISSET("deliveryreceipt") ? GETPOST("deliveryreceipt") : $defaultvaluefordeliveryreceipt) ? ' checked="checked"' : '').'>';
1253 }
1254 $out .= "</td></tr>\n";
1255 return $out;
1256 }
1257
1265 public function getHtmlForTopic($arraydefaultmessage, $helpforsubstitution)
1266 {
1267 global $conf, $langs, $form;
1268
1269 $defaulttopic = GETPOST('subject', 'restricthtml');
1270
1271 if (!GETPOST('modelselected', 'alpha') || GETPOST('modelmailselected') != '-1') {
1272 if ($arraydefaultmessage && $arraydefaultmessage->topic) {
1273 $defaulttopic = $arraydefaultmessage->topic;
1274 } elseif (!is_numeric($this->withtopic)) {
1275 $defaulttopic = $this->withtopic;
1276 }
1277 }
1278
1279 $defaulttopic = make_substitutions($defaulttopic, $this->substit);
1280
1281 $out = '<tr>';
1282 $out .= '<td class="fieldrequired">';
1283 $out .= $form->textwithpicto($langs->trans('MailTopic'), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltipfromtopic');
1284 $out .= '</td>';
1285 $out .= '<td>';
1286 if ($this->withtopicreadonly) {
1287 $out .= $defaulttopic;
1288 $out .= '<input type="hidden" class="quatrevingtpercent" id="subject" name="subject" value="'.$defaulttopic.'" />';
1289 } else {
1290 $out .= '<input type="text" class="quatrevingtpercent" id="subject" name="subject" value="'.((GETPOSTISSET("subject") && !GETPOST('modelselected')) ? GETPOST("subject") : ($defaulttopic ? $defaulttopic : '')).'" />';
1291 }
1292 $out .= "</td></tr>\n";
1293 return $out;
1294 }
1295
1313 public function getEMailTemplate($dbs, $type_template, $user, $outputlangs, $id = 0, $active = 1, $label = '', $defaultfortype = -1)
1314 {
1315 global $conf;
1316
1317 if ($id == -2 && empty($label)) {
1318 $this->error = 'LabelIsMandatoryWhenIdIs-2or-3';
1319 return -1;
1320 }
1321
1322 $ret = new ModelMail();
1323
1324 $languagetosearch = (is_object($outputlangs) ? $outputlangs->defaultlang : '');
1325 // Define $languagetosearchmain to fall back on main language (for example to get 'es_ES' for 'es_MX')
1326 $tmparray = explode('_', $languagetosearch);
1327 $languagetosearchmain = $tmparray[0].'_'.strtoupper($tmparray[0]);
1328 if ($languagetosearchmain == $languagetosearch) {
1329 $languagetosearchmain = '';
1330 }
1331
1332 $sql = "SELECT rowid, module, label, type_template, topic, joinfiles, content, content_lines, lang, email_from, email_to, email_tocc, email_tobcc";
1333 $sql .= " FROM ".$dbs->prefix().'c_email_templates';
1334 $sql .= " WHERE (type_template = '".$dbs->escape($type_template)."' OR type_template = 'all')";
1335 $sql .= " AND entity IN (".getEntity('c_email_templates').")";
1336 $sql .= " AND (private = 0 OR fk_user = ".((int) $user->id).")"; // Get all public or private owned
1337 if ($active >= 0) {
1338 $sql .= " AND active = ".((int) $active);
1339 }
1340 if ($defaultfortype >= 0) {
1341 $sql .= " AND defaultfortype = ".((int) $defaultfortype);
1342 }
1343 if ($label) {
1344 $sql .= " AND label = '".$dbs->escape($label)."'";
1345 }
1346 if (!($id > 0) && $languagetosearch) {
1347 $sql .= " AND (lang = '".$dbs->escape($languagetosearch)."'".($languagetosearchmain ? " OR lang = '".$dbs->escape($languagetosearchmain)."'" : "")." OR lang IS NULL OR lang = '')";
1348 }
1349 if ($id > 0) {
1350 $sql .= " AND rowid = ".(int) $id;
1351 }
1352 if ($id == -1) {
1353 $sql .= " AND position = 0";
1354 }
1355 if ($languagetosearch) {
1356 $sql .= $dbs->order("position,lang,label", "ASC,DESC,ASC"); // We want line with lang set first, then with lang null or ''
1357 } else {
1358 $sql .= $dbs->order("position,lang,label", "ASC,ASC,ASC"); // If no language provided, we give priority to lang not defined
1359 }
1360 //$sql .= $dbs->plimit(1);
1361 //print $sql;
1362
1363 $resql = $dbs->query($sql);
1364 if (!$resql) {
1365 dol_print_error($dbs);
1366 return -1;
1367 }
1368
1369 // Get first found
1370 while (1) {
1371 $obj = $dbs->fetch_object($resql);
1372
1373 if ($obj) {
1374 // If template is for a module, check module is enabled; if not, take next template
1375 if ($obj->module) {
1376 $tempmodulekey = $obj->module;
1377 if (empty($conf->$tempmodulekey) || !isModEnabled($tempmodulekey)) {
1378 continue;
1379 }
1380 }
1381
1382 // If a record was found
1383 $ret->id = $obj->rowid;
1384 $ret->module = $obj->module;
1385 $ret->label = $obj->label;
1386 $ret->lang = $obj->lang;
1387 $ret->topic = $obj->topic;
1388 $ret->content = $obj->content;
1389 $ret->content_lines = $obj->content_lines;
1390 $ret->joinfiles = $obj->joinfiles;
1391
1392 break;
1393 } else {
1394 // If no record found
1395 if ($id == -2) {
1396 // Not found with the provided label
1397 return -1;
1398 } else {
1399 // If there is no template at all
1400 $defaultmessage = '';
1401
1402 if ($type_template == 'body') {
1403 // Special case to use this->withbody as content
1404 $defaultmessage = $this->withbody;
1405 } elseif ($type_template == 'facture_send') {
1406 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendInvoice");
1407 } elseif ($type_template == 'facture_relance') {
1408 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendInvoiceReminder");
1409 } elseif ($type_template == 'propal_send') {
1410 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendProposal");
1411 } elseif ($type_template == 'supplier_proposal_send') {
1412 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendSupplierProposal");
1413 } elseif ($type_template == 'order_send') {
1414 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendOrder");
1415 } elseif ($type_template == 'order_supplier_send') {
1416 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendSupplierOrder");
1417 } elseif ($type_template == 'invoice_supplier_send') {
1418 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendSupplierInvoice");
1419 } elseif ($type_template == 'shipping_send') {
1420 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendShipping");
1421 } elseif ($type_template == 'fichinter_send') {
1422 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendFichInter");
1423 } elseif ($type_template == 'actioncomm_send') {
1424 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendActionComm");
1425 } elseif (!empty($type_template)) {
1426 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentGeneric");
1427 }
1428
1429 $ret->label = 'default';
1430 $ret->lang = $outputlangs->defaultlang;
1431 $ret->topic = '';
1432 $ret->joinfiles = 1;
1433 $ret->content = $defaultmessage;
1434 $ret->content_lines = '';
1435
1436 break;
1437 }
1438 }
1439 }
1440
1441 $dbs->free($resql);
1442
1443 return $ret;
1444 }
1445
1455 public function isEMailTemplate($type_template, $user, $outputlangs)
1456 {
1457 $sql = "SELECT label, topic, content, lang";
1458 $sql .= " FROM ".$this->db->prefix().'c_email_templates';
1459 $sql .= " WHERE type_template='".$this->db->escape($type_template)."'";
1460 $sql .= " AND entity IN (".getEntity('c_email_templates').")";
1461 $sql .= " AND (fk_user is NULL or fk_user = 0 or fk_user = ".((int) $user->id).")";
1462 if (is_object($outputlangs)) {
1463 $sql .= " AND (lang = '".$this->db->escape($outputlangs->defaultlang)."' OR lang IS NULL OR lang = '')";
1464 }
1465 $sql .= $this->db->order("lang,label", "ASC");
1466 //print $sql;
1467
1468 $resql = $this->db->query($sql);
1469 if ($resql) {
1470 $num = $this->db->num_rows($resql);
1471 $this->db->free($resql);
1472 return $num;
1473 } else {
1474 $this->error = get_class($this).' '.__METHOD__.' ERROR:'.$this->db->lasterror();
1475 return -1;
1476 }
1477 }
1478
1489 public function fetchAllEMailTemplate($type_template, $user, $outputlangs, $active = 1)
1490 {
1491 global $conf;
1492
1493 $sql = "SELECT rowid, module, label, topic, content, content_lines, lang, fk_user, private, position";
1494 $sql .= " FROM ".$this->db->prefix().'c_email_templates';
1495 $sql .= " WHERE type_template IN ('".$this->db->escape($type_template)."', 'all')";
1496 $sql .= " AND entity IN (".getEntity('c_email_templates').")";
1497 $sql .= " AND (private = 0 OR fk_user = ".((int) $user->id).")"; // See all public templates or templates I own.
1498 if ($active >= 0) {
1499 $sql .= " AND active = ".((int) $active);
1500 }
1501 //if (is_object($outputlangs)) $sql.= " AND (lang = '".$this->db->escape($outputlangs->defaultlang)."' OR lang IS NULL OR lang = '')"; // Return all languages
1502 $sql .= $this->db->order("position,lang,label", "ASC");
1503 //print $sql;
1504
1505 $resql = $this->db->query($sql);
1506 if ($resql) {
1507 $num = $this->db->num_rows($resql);
1508 $this->lines_model = array();
1509 while ($obj = $this->db->fetch_object($resql)) {
1510 // If template is for a module, check module is enabled.
1511 if ($obj->module) {
1512 $tempmodulekey = $obj->module;
1513 if (empty($conf->$tempmodulekey) || !isModEnabled($tempmodulekey)) {
1514 continue;
1515 }
1516 }
1517
1518 $line = new ModelMail();
1519 $line->id = $obj->rowid;
1520 $line->label = $obj->label;
1521 $line->lang = $obj->lang;
1522 $line->fk_user = $obj->fk_user;
1523 $line->private = $obj->private;
1524 $line->position = $obj->position;
1525 $line->topic = $obj->topic;
1526 $line->content = $obj->content;
1527 $line->content_lines = $obj->content_lines;
1528
1529 $this->lines_model[] = $line;
1530 }
1531 $this->db->free($resql);
1532 return $num;
1533 } else {
1534 $this->error = get_class($this).' '.__METHOD__.' ERROR:'.$this->db->lasterror();
1535 return -1;
1536 }
1537 }
1538
1539
1540
1549 public function setSubstitFromObject($object, $outputlangs)
1550 {
1551 global $conf, $user, $extrafields;
1552
1553 $parameters = array();
1554 $tmparray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1555 complete_substitutions_array($tmparray, $outputlangs, null, $parameters);
1556
1557 $this->substit = $tmparray;
1558
1559 // Fill substit_lines with each object lines content
1560 if (is_array($object->lines)) {
1561 foreach ($object->lines as $line) {
1562 $substit_line = array(
1563 '__PRODUCT_REF__' => isset($line->product_ref) ? $line->product_ref : '',
1564 '__PRODUCT_LABEL__' => isset($line->product_label) ? $line->product_label : '',
1565 '__PRODUCT_DESCRIPTION__' => isset($line->product_desc) ? $line->product_desc : '',
1566 '__LABEL__' => isset($line->label) ? $line->label : '',
1567 '__DESCRIPTION__' => isset($line->desc) ? $line->desc : '',
1568 '__DATE_START_YMD__' => dol_print_date($line->date_start, 'day', 0, $outputlangs),
1569 '__DATE_END_YMD__' => dol_print_date($line->date_end, 'day', 0, $outputlangs),
1570 '__QUANTITY__' => $line->qty,
1571 '__SUBPRICE__' => price($line->subprice),
1572 '__AMOUNT__' => price($line->total_ttc),
1573 '__AMOUNT_EXCL_TAX__' => price($line->total_ht)
1574 );
1575
1576 // Create dynamic tags for __PRODUCT_EXTRAFIELD_FIELD__
1577 if (!empty($line->fk_product)) {
1578 if (!is_object($extrafields)) {
1579 $extrafields = new ExtraFields($this->db);
1580 }
1581 $product = new Product($this->db);
1582 $product->fetch($line->fk_product, '', '', 1);
1583 $product->fetch_optionals();
1584
1585 $extrafields->fetch_name_optionals_label($product->table_element, true);
1586
1587 if (!empty($extrafields->attributes[$product->table_element]['label']) && is_array($extrafields->attributes[$product->table_element]['label']) && count($extrafields->attributes[$product->table_element]['label']) > 0) {
1588 foreach ($extrafields->attributes[$product->table_element]['label'] as $key => $label) {
1589 $substit_line['__PRODUCT_EXTRAFIELD_'.strtoupper($key).'__'] = isset($product->array_options['options_'.$key]) ? $product->array_options['options_'.$key] : '';
1590 }
1591 }
1592 }
1593 $this->substit_lines[] = $substit_line;
1594 }
1595 }
1596 }
1597
1606 public static function getAvailableSubstitKey($mode = 'formemail', $object = null)
1607 {
1608 global $conf, $langs;
1609
1610 $tmparray = array();
1611 if ($mode == 'formemail' || $mode == 'formemailwithlines' || $mode == 'formemailforlines') {
1612 $parameters = array('mode'=>$mode);
1613 $tmparray = getCommonSubstitutionArray($langs, 2, null, $object); // Note: On email templated edition, this is null because it is related to all type of objects
1614 complete_substitutions_array($tmparray, $langs, null, $parameters);
1615
1616 if ($mode == 'formwithlines') {
1617 $tmparray['__LINES__'] = '__LINES__'; // Will be set by the get_form function
1618 }
1619 if ($mode == 'formforlines') {
1620 $tmparray['__QUANTITY__'] = '__QUANTITY__'; // Will be set by the get_form function
1621 }
1622 }
1623
1624 if ($mode == 'emailing') {
1625 $parameters = array('mode'=>$mode);
1626 $tmparray = getCommonSubstitutionArray($langs, 2, array('object', 'objectamount'), $object); // Note: On email templated edition, this is null because it is related to all type of objects
1627 complete_substitutions_array($tmparray, $langs, null, $parameters);
1628
1629 // For mass emailing, we have different keys specific to the data into tagerts list
1630 $tmparray['__ID__'] = 'IdRecord';
1631 $tmparray['__THIRDPARTY_CUSTOMER_CODE__'] = 'CustomerCode';
1632 $tmparray['__EMAIL__'] = 'EMailRecipient';
1633 $tmparray['__LASTNAME__'] = 'Lastname';
1634 $tmparray['__FIRSTNAME__'] = 'Firstname';
1635 $tmparray['__MAILTOEMAIL__'] = 'TagMailtoEmail';
1636 $tmparray['__OTHER1__'] = 'Other1';
1637 $tmparray['__OTHER2__'] = 'Other2';
1638 $tmparray['__OTHER3__'] = 'Other3';
1639 $tmparray['__OTHER4__'] = 'Other4';
1640 $tmparray['__OTHER5__'] = 'Other5';
1641 //,'__PERSONALIZED__' => 'Personalized' // Hidden because not used yet in mass emailing
1642
1643 $onlinepaymentenabled = 0;
1644 if (isModEnabled('paypal')) {
1645 $onlinepaymentenabled++;
1646 }
1647 if (isModEnabled('paybox')) {
1648 $onlinepaymentenabled++;
1649 }
1650 if (isModEnabled('stripe')) {
1651 $onlinepaymentenabled++;
1652 }
1653 if ($onlinepaymentenabled && !empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
1654 $tmparray['__SECUREKEYPAYMENT__'] = $conf->global->PAYMENT_SECURITY_TOKEN;
1655 if (!empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) {
1656 if (isModEnabled('adherent')) {
1657 $tmparray['__SECUREKEYPAYMENT_MEMBER__'] = 'SecureKeyPAYMENTUniquePerMember';
1658 }
1659 if (isModEnabled('don')) {
1660 $tmparray['__SECUREKEYPAYMENT_DONATION__'] = 'SecureKeyPAYMENTUniquePerDonation';
1661 }
1662 if (isModEnabled('facture')) {
1663 $tmparray['__SECUREKEYPAYMENT_INVOICE__'] = 'SecureKeyPAYMENTUniquePerInvoice';
1664 }
1665 if (isModEnabled('commande')) {
1666 $tmparray['__SECUREKEYPAYMENT_ORDER__'] = 'SecureKeyPAYMENTUniquePerOrder';
1667 }
1668 if (isModEnabled('contrat')) {
1669 $tmparray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = 'SecureKeyPAYMENTUniquePerContractLine';
1670 }
1671
1672 //Online payment link
1673 if (isModEnabled('adherent')) {
1674 $tmparray['__ONLINEPAYMENTLINK_MEMBER__'] = 'OnlinePaymentLinkUniquePerMember';
1675 }
1676 if (isModEnabled('don')) {
1677 $tmparray['__ONLINEPAYMENTLINK_DONATION__'] = 'OnlinePaymentLinkUniquePerDonation';
1678 }
1679 if (isModEnabled('facture')) {
1680 $tmparray['__ONLINEPAYMENTLINK_INVOICE__'] = 'OnlinePaymentLinkUniquePerInvoice';
1681 }
1682 if (isModEnabled('commande')) {
1683 $tmparray['__ONLINEPAYMENTLINK_ORDER__'] = 'OnlinePaymentLinkUniquePerOrder';
1684 }
1685 if (isModEnabled('contrat')) {
1686 $tmparray['__ONLINEPAYMENTLINK_CONTRACTLINE__'] = 'OnlinePaymentLinkUniquePerContractLine';
1687 }
1688 }
1689 } else {
1690 /* No need to show into tooltip help, option is not enabled
1691 $vars['__SECUREKEYPAYMENT__']='';
1692 $vars['__SECUREKEYPAYMENT_MEMBER__']='';
1693 $vars['__SECUREKEYPAYMENT_INVOICE__']='';
1694 $vars['__SECUREKEYPAYMENT_ORDER__']='';
1695 $vars['__SECUREKEYPAYMENT_CONTRACTLINE__']='';
1696 */
1697 }
1698 if (!empty($conf->global->MEMBER_ENABLE_PUBLIC)) {
1699 $substitutionarray['__PUBLICLINK_NEWMEMBERFORM__'] = 'BlankSubscriptionForm';
1700 }
1701 }
1702
1703 foreach ($tmparray as $key => $val) {
1704 if (empty($val)) {
1705 $tmparray[$key] = $key;
1706 }
1707 }
1708
1709 return $tmparray;
1710 }
1711}
1712
1713
1719class ModelMail
1720{
1724 public $id;
1725
1729 public $label;
1730
1734 public $fk_user;
1735
1739 public $private;
1740
1744 public $topic;
1745
1749 public $content;
1750 public $content_lines;
1751 public $lang;
1752 public $joinfiles;
1753
1754 public $email_from;
1755 public $email_to;
1756 public $email_tocc;
1757 public $email_tobcc;
1758
1762 public $module;
1763
1767 public $position;
1768}
Class to manage a WYSIWYG editor.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
static selectarray($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $moreparam='', $translate=0, $maxlen=0, $disabled=0, $sort='', $morecss='minwidth75', $addjscombo=1, $moreparamonempty='', $disablebademail=0, $nohtmlescape=0)
Return a HTML select string, built from an array of key+value.
Classe permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new For...
get_attached_files()
Return list of attached files (stored in SECTION array)
getHtmlForWithErrorsTo()
get Html For WithErrorsTo
getHtmlForTopic($arraydefaultmessage, $helpforsubstitution)
get Html For Topic of message
clear_attached_files()
Clear list of attached files in send mail form (also stored in session)
fetchAllEMailTemplate($type_template, $user, $outputlangs, $active=1)
Find if template exists and are available for current user, then set them into $this->lines_module.
getHtmlForCc()
get html For CC
getHtmlForTo()
get html For To
add_attached_files($path, $file='', $type='')
Add a file into the list of attached files (stored in SECTION array)
getHtmlForWithCcc()
get html For WithCCC
remove_attached_files($keytodelete)
Remove a file from the list of attached files (stored in SECTION array)
__construct($db)
Constructor.
getEMailTemplate($dbs, $type_template, $user, $outputlangs, $id=0, $active=1, $label='', $defaultfortype=-1)
Return templates of email with type = $type_template or type = 'all'.
show_form($addfileaction='addfile', $removefileaction='removefile')
Show the form to input an email this->withfile: 0=No attaches files, 1=Show attached files,...
get_form($addfileaction='addfile', $removefileaction='removefile')
Get the form to input an email this->withfile: 0=No attaches files, 1=Show attached files,...
Class to manage translations.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
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...
rtl background position
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
Definition invoice.php:1632
ui dialog ui datepicker calendar ui widget content ui state ui datepicker calendar ui widget header ui state ui datepicker calendar ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
getMaxFileSizeArray()
Return the max allowed for file upload.