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 // Set the online payment url link into __ONLINE_PAYMENT_URL__ key
883 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
884 $validpaymentmethod = getValidOnlinePaymentMethods('');
885 if (empty($this->substit['__REF__'])) {
886 $paymenturl = '';
887 } else {
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
903 if (count($validpaymentmethod) > 0 && $paymenturl) {
904 $langs->load('other');
905 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = str_replace('\n', "\n", $langs->transnoentities("PredefinedMailContentLink", $paymenturl));
906 $this->substit['__ONLINE_PAYMENT_URL__'] = $paymenturl;
907 } elseif (count($validpaymentmethod) > 0) {
908 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = '__ONLINE_PAYMENT_TEXT_AND_URL__';
909 $this->substit['__ONLINE_PAYMENT_URL__'] = '__ONLINE_PAYMENT_URL__';
910 } else {
911 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = '';
912 $this->substit['__ONLINE_PAYMENT_URL__'] = '';
913 }
914
915 $this->substit['__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__'] = '';
916
917 // Add lines substitution key from each line
918 $lines = '';
919 $defaultlines = $arraydefaultmessage->content_lines;
920 if (isset($defaultlines)) {
921 foreach ($this->substit_lines as $substit_line) {
922 $lines .= make_substitutions($defaultlines, $substit_line)."\n";
923 }
924 }
925 $this->substit['__LINES__'] = $lines;
926
927 $defaultmessage = str_replace('\n', "\n", $defaultmessage);
928
929 // Deal with format differences between message and some substitution variables (text / HTML)
930 $atleastonecomponentishtml = 0;
931 if (strpos($defaultmessage, '__USER_SIGNATURE__') !== false && dol_textishtml($this->substit['__USER_SIGNATURE__'])) {
932 $atleastonecomponentishtml++;
933 }
934 if (strpos($defaultmessage, '__SENDEREMAIL_SIGNATURE__') !== false && dol_textishtml($this->substit['__SENDEREMAIL_SIGNATURE__'])) {
935 $atleastonecomponentishtml++;
936 }
937 if (strpos($defaultmessage, '__ONLINE_PAYMENT_TEXT_AND_URL__') !== false && dol_textishtml($this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'])) {
938 $atleastonecomponentishtml++;
939 }
940 if (strpos($defaultmessage, '__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__') !== false && dol_textishtml($this->substit['__ONLINE_INTERVIEW_SCHEDULER_TEXT_AND_URL__'])) {
941 $atleastonecomponentishtml++;
942 }
943 if (dol_textishtml($defaultmessage)) {
944 $atleastonecomponentishtml++;
945 }
946 if ($atleastonecomponentishtml) {
947 if (!dol_textishtml($this->substit['__USER_SIGNATURE__'])) {
948 $this->substit['__USER_SIGNATURE__'] = dol_nl2br($this->substit['__USER_SIGNATURE__']);
949 }
950 if (!dol_textishtml($this->substit['__SENDEREMAIL_SIGNATURE__'])) {
951 $this->substit['__SENDEREMAIL_SIGNATURE__'] = dol_nl2br($this->substit['__SENDEREMAIL_SIGNATURE__']);
952 }
953 if (!dol_textishtml($this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'])) {
954 $this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__'] = dol_nl2br($this->substit['__ONLINE_PAYMENT_TEXT_AND_URL__']);
955 }
956 if (!dol_textishtml($defaultmessage)) {
957 $defaultmessage = dol_nl2br($defaultmessage);
958 }
959 }
960
961 if (GETPOSTISSET("message") && !GETPOST('modelselected')) {
962 $defaultmessage = GETPOST("message", "restricthtml");
963 } else {
964 $defaultmessage = make_substitutions($defaultmessage, $this->substit);
965 // Clean first \n and br (to avoid empty line when CONTACTCIVNAME is empty)
966 $defaultmessage = preg_replace("/^(<br>)+/", "", $defaultmessage);
967 $defaultmessage = preg_replace("/^\n+/", "", $defaultmessage);
968 }
969
970 $out .= '<tr>';
971 $out .= '<td colspan="2">';
972 $out .= $form->textwithpicto($langs->trans('MailText'), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltipfrombody');
973 $out .= '</td>';
974 $out .= '</tr>';
975
976 $out .= '<tr>';
977 $out .= '<td colspan="2">';
978 if ($this->withbodyreadonly) {
979 $out .= nl2br($defaultmessage);
980 $out .= '<input type="hidden" id="message" name="message" value="'.$defaultmessage.'" />';
981 } else {
982 if (!isset($this->ckeditortoolbar)) {
983 $this->ckeditortoolbar = 'dolibarr_mailings';
984 }
985
986 // Editor wysiwyg
987 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
988 if ($this->withfckeditor == -1) {
989 if (!empty($conf->global->FCKEDITOR_ENABLE_MAIL)) {
990 $this->withfckeditor = 1;
991 } else {
992 $this->withfckeditor = 0;
993 }
994 }
995
996 $doleditor = new DolEditor('message', $defaultmessage, '', 280, $this->ckeditortoolbar, 'In', true, true, $this->withfckeditor, 8, '95%');
997 $out .= $doleditor->Create(1);
998 }
999 $out .= "</td></tr>\n";
1000 }
1001
1002 $out .= '</table>'."\n";
1003
1004 if ($this->withform == 1 || $this->withform == -1) {
1005 $out .= '<div class="center">';
1006 $out .= '<input type="submit" class="button button-add" id="sendmail" name="sendmail" value="'.$langs->trans("SendMail").'"';
1007 // Add a javascript test to avoid to forget to submit file before sending email
1008 if ($this->withfile == 2 && $conf->use_javascript_ajax) {
1009 $out .= ' onClick="if (document.mailform.addedfile.value != \'\') { alert(\''.dol_escape_js($langs->trans("FileWasNotUploaded")).'\'); return false; } else { return true; }"';
1010 }
1011 $out .= ' />';
1012 if ($this->withcancel) {
1013 $out .= '<input class="button button-cancel" type="submit" id="cancel" name="cancel" value="'.$langs->trans("Cancel").'" />';
1014 }
1015 $out .= '</div>'."\n";
1016 }
1017
1018 if ($this->withform == 1) {
1019 $out .= '</form>'."\n";
1020 }
1021
1022 // Disable enter key if option MAIN_MAILFORM_DISABLE_ENTERKEY is set
1023 if (!empty($conf->global->MAIN_MAILFORM_DISABLE_ENTERKEY)) {
1024 $out .= '<script nonce="'.getNonce().'" type="text/javascript">';
1025 $out .= 'jQuery(document).ready(function () {';
1026 $out .= ' $(document).on("keypress", \'#mailform\', function (e) { /* Note this is called at every key pressed ! */
1027 var code = e.keyCode || e.which;
1028 if (code == 13) {
1029 console.log("Enter was intercepted and blocked");
1030 e.preventDefault();
1031 return false;
1032 }
1033 });';
1034 $out .= ' })';
1035 $out .= '</script>';
1036 }
1037
1038 $out .= "<!-- End form mail -->\n";
1039
1040 return $out;
1041 }
1042 }
1043
1049 public function getHtmlForTo()
1050 {
1051 global $langs, $form;
1052 $out = '<tr><td class="fieldrequired">';
1053 if ($this->withtofree) {
1054 $out .= $form->textwithpicto($langs->trans("MailTo"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients"));
1055 } else {
1056 $out .= $langs->trans("MailTo");
1057 }
1058 $out .= '</td><td>';
1059 if ($this->withtoreadonly) {
1060 if (!empty($this->toname) && !empty($this->tomail)) {
1061 $out .= '<input type="hidden" id="toname" name="toname" value="'.$this->toname.'" />';
1062 $out .= '<input type="hidden" id="tomail" name="tomail" value="'.$this->tomail.'" />';
1063 if ($this->totype == 'thirdparty') {
1064 $soc = new Societe($this->db);
1065 $soc->fetch($this->toid);
1066 $out .= $soc->getNomUrl(1);
1067 } elseif ($this->totype == 'contact') {
1068 $contact = new Contact($this->db);
1069 $contact->fetch($this->toid);
1070 $out .= $contact->getNomUrl(1);
1071 } else {
1072 $out .= $this->toname;
1073 }
1074 $out .= ' &lt;'.$this->tomail.'&gt;';
1075 if ($this->withtofree) {
1076 $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) : "").'" />';
1077 }
1078 } else {
1079 // Note withto may be a text like 'AllRecipientSelected'
1080 $out .= (!is_array($this->withto) && !is_numeric($this->withto)) ? $this->withto : "";
1081 }
1082 } else {
1083 // The free input of email
1084 if (!empty($this->withtofree)) {
1085 $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) : "")).'" />';
1086 }
1087 // The select combo
1088 if (!empty($this->withto) && is_array($this->withto)) {
1089 if (!empty($this->withtofree)) {
1090 $out .= " ".$langs->trans("and")."/".$langs->trans("or")." ";
1091 }
1092 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
1093 $tmparray = $this->withto;
1094 foreach ($tmparray as $key => $val) {
1095 $tmparray[$key] = str_replace(array('<', '>'), array('(', ')'), $tmparray[$key]);
1096 $tmparray[$key] = dol_htmlentities($tmparray[$key], ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8', true);
1097 }
1098
1099 $withtoselected = GETPOST("receiver", 'array'); // Array of selected value
1100 if (!getDolGlobalInt('MAIN_MAIL_NO_WITH_TO_SELECTED')) {
1101 if (empty($withtoselected) && count($tmparray) == 1 && GETPOST('action', 'aZ09') == 'presend') {
1102 $withtoselected = array_keys($tmparray);
1103 }
1104 }
1105
1106 $out .= $form->multiselectarray("receiver", $tmparray, $withtoselected, null, null, 'inline-block minwidth500', null, "");
1107 }
1108 }
1109 $out .= "</td></tr>\n";
1110 return $out;
1111 }
1112
1118 public function getHtmlForCc()
1119 {
1120 global $langs, $form;
1121 $out = '<tr><td>';
1122 $out .= $form->textwithpicto($langs->trans("MailCC"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients"));
1123 $out .= '</td><td>';
1124 if ($this->withtoccreadonly) {
1125 $out .= (!is_array($this->withtocc) && !is_numeric($this->withtocc)) ? $this->withtocc : "";
1126 } else {
1127 $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 : '')).'" />';
1128 if (!empty($this->withtocc) && is_array($this->withtocc)) {
1129 $out .= " ".$langs->trans("and")."/".$langs->trans("or")." ";
1130 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
1131 $tmparray = $this->withtocc;
1132 foreach ($tmparray as $key => $val) {
1133 $tmparray[$key] = str_replace(array('<', '>'), array('(', ')'), $tmparray[$key]);
1134 $tmparray[$key] = dol_htmlentities($tmparray[$key], ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8', true);
1135 }
1136 $withtoccselected = GETPOST("receivercc", 'array'); // Array of selected value
1137 $out .= $form->multiselectarray("receivercc", $tmparray, $withtoccselected, null, null, 'inline-block minwidth500', null, "");
1138 }
1139 }
1140 $out .= "</td></tr>\n";
1141 return $out;
1142 }
1143
1149 public function getHtmlForWithCcc()
1150 {
1151 global $conf, $langs, $form;
1152 $out = '<tr><td>';
1153 $out .= $form->textwithpicto($langs->trans("MailCCC"), $langs->trans("YouCanUseCommaSeparatorForSeveralRecipients"));
1154 $out .= '</td><td>';
1155 if (!empty($this->withtocccreadonly)) {
1156 $out .= (!is_array($this->withtoccc) && !is_numeric($this->withtoccc)) ? $this->withtoccc : "";
1157 } else {
1158 $out .= '<input class="minwidth200" id="sendtoccc" name="sendtoccc" value="'.(GETPOSTISSET("sendtoccc") ? GETPOST("sendtoccc", "alpha") : ((!is_array($this->withtoccc) && !is_numeric($this->withtoccc)) ? $this->withtoccc : '')).'" />';
1159 if (!empty($this->withtoccc) && is_array($this->withtoccc)) {
1160 $out .= " ".$langs->trans("and")."/".$langs->trans("or")." ";
1161 // multiselect array convert html entities into options tags, even if we dont want this, so we encode them a second time
1162 $tmparray = $this->withtoccc;
1163 foreach ($tmparray as $key => $val) {
1164 $tmparray[$key] = dol_htmlentities($tmparray[$key], null, 'UTF-8', true);
1165 }
1166 $withtocccselected = GETPOST("receiverccc", 'array'); // Array of selected value
1167 $out .= $form->multiselectarray("receiverccc", $tmparray, $withtocccselected, null, null, null, null, "90%");
1168 }
1169 }
1170
1171 $showinfobcc = '';
1172 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_PROPOSAL_TO) && !empty($this->param['models']) && $this->param['models'] == 'propal_send') {
1173 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_PROPOSAL_TO;
1174 }
1175 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_ORDER_TO) && !empty($this->param['models']) && $this->param['models'] == 'order_send') {
1176 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_ORDER_TO;
1177 }
1178 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO) && !empty($this->param['models']) && $this->param['models'] == 'facture_send') {
1179 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_INVOICE_TO;
1180 }
1181 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_PROPOSAL_TO) && !empty($this->param['models']) && $this->param['models'] == 'supplier_proposal_send') {
1182 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_PROPOSAL_TO;
1183 }
1184 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO) && !empty($this->param['models']) && $this->param['models'] == 'order_supplier_send') {
1185 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO;
1186 }
1187 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO) && !empty($this->param['models']) && $this->param['models'] == 'invoice_supplier_send') {
1188 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO;
1189 }
1190 if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_PROJECT_TO) && !empty($this->param['models']) && $this->param['models'] == 'project') {
1191 $showinfobcc = $conf->global->MAIN_MAIL_AUTOCOPY_PROJECT_TO;
1192 }
1193 if ($showinfobcc) {
1194 $out .= ' + '.$showinfobcc;
1195 }
1196 $out .= "</td></tr>\n";
1197 return $out;
1198 }
1199
1205 public function getHtmlForWithErrorsTo()
1206 {
1207 global $conf, $langs;
1208 //if (! $this->errorstomail) $this->errorstomail=$this->frommail;
1209 $errorstomail = getDolGlobalString('MAIN_MAIL_ERRORS_TO', (!empty($this->errorstomail) ? $this->errorstomail : ''));
1210 if ($this->witherrorstoreadonly) {
1211 $out = '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
1212 $out .= '<input type="hidden" id="errorstomail" name="errorstomail" value="'.$errorstomail.'" />';
1213 $out .= $errorstomail;
1214 $out .= "</td></tr>\n";
1215 } else {
1216 $out = '<tr><td>'.$langs->trans("MailErrorsTo").'</td><td>';
1217 $out .= '<input class="minwidth200" id="errorstomail" name="errorstomail" value="'.$errorstomail.'" />';
1218 $out .= "</td></tr>\n";
1219 }
1220 return $out;
1221 }
1222
1228 public function getHtmlForDeliveryreceipt()
1229 {
1230 global $conf, $langs;
1231 $out = '<tr><td><label for="deliveryreceipt">'.$langs->trans("DeliveryReceipt").'</label></td><td>';
1232
1233 if (!empty($this->withdeliveryreceiptreadonly)) {
1234 $out .= yn($this->withdeliveryreceipt);
1235 } else {
1236 $defaultvaluefordeliveryreceipt = 0;
1237 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_PROPAL) && !empty($this->param['models']) && $this->param['models'] == 'propal_send') {
1238 $defaultvaluefordeliveryreceipt = 1;
1239 }
1240 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_SUPPLIER_PROPOSAL) && !empty($this->param['models']) && $this->param['models'] == 'supplier_proposal_send') {
1241 $defaultvaluefordeliveryreceipt = 1;
1242 }
1243 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_ORDER) && !empty($this->param['models']) && $this->param['models'] == 'order_send') {
1244 $defaultvaluefordeliveryreceipt = 1;
1245 }
1246 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_INVOICE) && !empty($this->param['models']) && $this->param['models'] == 'facture_send') {
1247 $defaultvaluefordeliveryreceipt = 1;
1248 }
1249 if (!empty($conf->global->MAIL_FORCE_DELIVERY_RECEIPT_SUPPLIER_ORDER) && !empty($this->param['models']) && $this->param['models'] == 'order_supplier_send') {
1250 $defaultvaluefordeliveryreceipt = 1;
1251 }
1252 //$out .= $form->selectyesno('deliveryreceipt', (GETPOSTISSET("deliveryreceipt") ? GETPOST("deliveryreceipt") : $defaultvaluefordeliveryreceipt), 1);
1253 $out .= '<input type="checkbox" id="deliveryreceipt" name="deliveryreceipt" value="1"'.((GETPOSTISSET("deliveryreceipt") ? GETPOST("deliveryreceipt") : $defaultvaluefordeliveryreceipt) ? ' checked="checked"' : '').'>';
1254 }
1255 $out .= "</td></tr>\n";
1256 return $out;
1257 }
1258
1266 public function getHtmlForTopic($arraydefaultmessage, $helpforsubstitution)
1267 {
1268 global $conf, $langs, $form;
1269
1270 $defaulttopic = GETPOST('subject', 'restricthtml');
1271
1272 if (!GETPOST('modelselected', 'alpha') || GETPOST('modelmailselected') != '-1') {
1273 if ($arraydefaultmessage && $arraydefaultmessage->topic) {
1274 $defaulttopic = $arraydefaultmessage->topic;
1275 } elseif (!is_numeric($this->withtopic)) {
1276 $defaulttopic = $this->withtopic;
1277 }
1278 }
1279
1280 $defaulttopic = make_substitutions($defaulttopic, $this->substit);
1281
1282 $out = '<tr>';
1283 $out .= '<td class="fieldrequired">';
1284 $out .= $form->textwithpicto($langs->trans('MailTopic'), $helpforsubstitution, 1, 'help', '', 0, 2, 'substittooltipfromtopic');
1285 $out .= '</td>';
1286 $out .= '<td>';
1287 if ($this->withtopicreadonly) {
1288 $out .= $defaulttopic;
1289 $out .= '<input type="hidden" class="quatrevingtpercent" id="subject" name="subject" value="'.$defaulttopic.'" />';
1290 } else {
1291 $out .= '<input type="text" class="quatrevingtpercent" id="subject" name="subject" value="'.((GETPOSTISSET("subject") && !GETPOST('modelselected')) ? GETPOST("subject") : ($defaulttopic ? $defaulttopic : '')).'" />';
1292 }
1293 $out .= "</td></tr>\n";
1294 return $out;
1295 }
1296
1314 public function getEMailTemplate($dbs, $type_template, $user, $outputlangs, $id = 0, $active = 1, $label = '', $defaultfortype = -1)
1315 {
1316 global $conf;
1317
1318 if ($id == -2 && empty($label)) {
1319 $this->error = 'LabelIsMandatoryWhenIdIs-2or-3';
1320 return -1;
1321 }
1322
1323 $ret = new ModelMail();
1324
1325 $languagetosearch = (is_object($outputlangs) ? $outputlangs->defaultlang : '');
1326 // Define $languagetosearchmain to fall back on main language (for example to get 'es_ES' for 'es_MX')
1327 $tmparray = explode('_', $languagetosearch);
1328 $languagetosearchmain = $tmparray[0].'_'.strtoupper($tmparray[0]);
1329 if ($languagetosearchmain == $languagetosearch) {
1330 $languagetosearchmain = '';
1331 }
1332
1333 $sql = "SELECT rowid, module, label, type_template, topic, joinfiles, content, content_lines, lang, email_from, email_to, email_tocc, email_tobcc";
1334 $sql .= " FROM ".$dbs->prefix().'c_email_templates';
1335 $sql .= " WHERE (type_template = '".$dbs->escape($type_template)."' OR type_template = 'all')";
1336 $sql .= " AND entity IN (".getEntity('c_email_templates').")";
1337 $sql .= " AND (private = 0 OR fk_user = ".((int) $user->id).")"; // Get all public or private owned
1338 if ($active >= 0) {
1339 $sql .= " AND active = ".((int) $active);
1340 }
1341 if ($defaultfortype >= 0) {
1342 $sql .= " AND defaultfortype = ".((int) $defaultfortype);
1343 }
1344 if ($label) {
1345 $sql .= " AND label = '".$dbs->escape($label)."'";
1346 }
1347 if (!($id > 0) && $languagetosearch) {
1348 $sql .= " AND (lang = '".$dbs->escape($languagetosearch)."'".($languagetosearchmain ? " OR lang = '".$dbs->escape($languagetosearchmain)."'" : "")." OR lang IS NULL OR lang = '')";
1349 }
1350 if ($id > 0) {
1351 $sql .= " AND rowid = ".(int) $id;
1352 }
1353 if ($id == -1) {
1354 $sql .= " AND position = 0";
1355 }
1356 if ($languagetosearch) {
1357 $sql .= $dbs->order("position,lang,label", "ASC,DESC,ASC"); // We want line with lang set first, then with lang null or ''
1358 } else {
1359 $sql .= $dbs->order("position,lang,label", "ASC,ASC,ASC"); // If no language provided, we give priority to lang not defined
1360 }
1361 //$sql .= $dbs->plimit(1);
1362 //print $sql;
1363
1364 $resql = $dbs->query($sql);
1365 if (!$resql) {
1366 dol_print_error($dbs);
1367 return -1;
1368 }
1369
1370 // Get first found
1371 while (1) {
1372 $obj = $dbs->fetch_object($resql);
1373
1374 if ($obj) {
1375 // If template is for a module, check module is enabled; if not, take next template
1376 if ($obj->module) {
1377 $tempmodulekey = $obj->module;
1378 if (empty($conf->$tempmodulekey) || !isModEnabled($tempmodulekey)) {
1379 continue;
1380 }
1381 }
1382
1383 // If a record was found
1384 $ret->id = $obj->rowid;
1385 $ret->module = $obj->module;
1386 $ret->label = $obj->label;
1387 $ret->lang = $obj->lang;
1388 $ret->topic = $obj->topic;
1389 $ret->content = $obj->content;
1390 $ret->content_lines = $obj->content_lines;
1391 $ret->joinfiles = $obj->joinfiles;
1392
1393 break;
1394 } else {
1395 // If no record found
1396 if ($id == -2) {
1397 // Not found with the provided label
1398 return -1;
1399 } else {
1400 // If there is no template at all
1401 $defaultmessage = '';
1402
1403 if ($type_template == 'body') {
1404 // Special case to use this->withbody as content
1405 $defaultmessage = $this->withbody;
1406 } elseif ($type_template == 'facture_send') {
1407 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendInvoice");
1408 } elseif ($type_template == 'facture_relance') {
1409 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendInvoiceReminder");
1410 } elseif ($type_template == 'propal_send') {
1411 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendProposal");
1412 } elseif ($type_template == 'supplier_proposal_send') {
1413 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendSupplierProposal");
1414 } elseif ($type_template == 'order_send') {
1415 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendOrder");
1416 } elseif ($type_template == 'order_supplier_send') {
1417 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendSupplierOrder");
1418 } elseif ($type_template == 'invoice_supplier_send') {
1419 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendSupplierInvoice");
1420 } elseif ($type_template == 'shipping_send') {
1421 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendShipping");
1422 } elseif ($type_template == 'fichinter_send') {
1423 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendFichInter");
1424 } elseif ($type_template == 'actioncomm_send') {
1425 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentSendActionComm");
1426 } elseif (!empty($type_template)) {
1427 $defaultmessage = $outputlangs->transnoentities("PredefinedMailContentGeneric");
1428 }
1429
1430 $ret->label = 'default';
1431 $ret->lang = $outputlangs->defaultlang;
1432 $ret->topic = '';
1433 $ret->joinfiles = 1;
1434 $ret->content = $defaultmessage;
1435 $ret->content_lines = '';
1436
1437 break;
1438 }
1439 }
1440 }
1441
1442 $dbs->free($resql);
1443
1444 return $ret;
1445 }
1446
1456 public function isEMailTemplate($type_template, $user, $outputlangs)
1457 {
1458 $sql = "SELECT label, topic, content, lang";
1459 $sql .= " FROM ".$this->db->prefix().'c_email_templates';
1460 $sql .= " WHERE type_template='".$this->db->escape($type_template)."'";
1461 $sql .= " AND entity IN (".getEntity('c_email_templates').")";
1462 $sql .= " AND (fk_user is NULL or fk_user = 0 or fk_user = ".((int) $user->id).")";
1463 if (is_object($outputlangs)) {
1464 $sql .= " AND (lang = '".$this->db->escape($outputlangs->defaultlang)."' OR lang IS NULL OR lang = '')";
1465 }
1466 $sql .= $this->db->order("lang,label", "ASC");
1467 //print $sql;
1468
1469 $resql = $this->db->query($sql);
1470 if ($resql) {
1471 $num = $this->db->num_rows($resql);
1472 $this->db->free($resql);
1473 return $num;
1474 } else {
1475 $this->error = get_class($this).' '.__METHOD__.' ERROR:'.$this->db->lasterror();
1476 return -1;
1477 }
1478 }
1479
1490 public function fetchAllEMailTemplate($type_template, $user, $outputlangs, $active = 1)
1491 {
1492 global $conf;
1493
1494 $sql = "SELECT rowid, module, label, topic, content, content_lines, lang, fk_user, private, position";
1495 $sql .= " FROM ".$this->db->prefix().'c_email_templates';
1496 $sql .= " WHERE type_template IN ('".$this->db->escape($type_template)."', 'all')";
1497 $sql .= " AND entity IN (".getEntity('c_email_templates').")";
1498 $sql .= " AND (private = 0 OR fk_user = ".((int) $user->id).")"; // See all public templates or templates I own.
1499 if ($active >= 0) {
1500 $sql .= " AND active = ".((int) $active);
1501 }
1502 //if (is_object($outputlangs)) $sql.= " AND (lang = '".$this->db->escape($outputlangs->defaultlang)."' OR lang IS NULL OR lang = '')"; // Return all languages
1503 $sql .= $this->db->order("position,lang,label", "ASC");
1504 //print $sql;
1505
1506 $resql = $this->db->query($sql);
1507 if ($resql) {
1508 $num = $this->db->num_rows($resql);
1509 $this->lines_model = array();
1510 while ($obj = $this->db->fetch_object($resql)) {
1511 // If template is for a module, check module is enabled.
1512 if ($obj->module) {
1513 $tempmodulekey = $obj->module;
1514 if (empty($conf->$tempmodulekey) || !isModEnabled($tempmodulekey)) {
1515 continue;
1516 }
1517 }
1518
1519 $line = new ModelMail();
1520 $line->id = $obj->rowid;
1521 $line->label = $obj->label;
1522 $line->lang = $obj->lang;
1523 $line->fk_user = $obj->fk_user;
1524 $line->private = $obj->private;
1525 $line->position = $obj->position;
1526 $line->topic = $obj->topic;
1527 $line->content = $obj->content;
1528 $line->content_lines = $obj->content_lines;
1529
1530 $this->lines_model[] = $line;
1531 }
1532 $this->db->free($resql);
1533 return $num;
1534 } else {
1535 $this->error = get_class($this).' '.__METHOD__.' ERROR:'.$this->db->lasterror();
1536 return -1;
1537 }
1538 }
1539
1540
1541
1550 public function setSubstitFromObject($object, $outputlangs)
1551 {
1552 global $conf, $user, $extrafields;
1553
1554 $parameters = array();
1555 $tmparray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
1556 complete_substitutions_array($tmparray, $outputlangs, null, $parameters);
1557
1558 $this->substit = $tmparray;
1559
1560 // Fill substit_lines with each object lines content
1561 if (is_array($object->lines)) {
1562 foreach ($object->lines as $line) {
1563 $substit_line = array(
1564 '__PRODUCT_REF__' => isset($line->product_ref) ? $line->product_ref : '',
1565 '__PRODUCT_LABEL__' => isset($line->product_label) ? $line->product_label : '',
1566 '__PRODUCT_DESCRIPTION__' => isset($line->product_desc) ? $line->product_desc : '',
1567 '__LABEL__' => isset($line->label) ? $line->label : '',
1568 '__DESCRIPTION__' => isset($line->desc) ? $line->desc : '',
1569 '__DATE_START_YMD__' => dol_print_date($line->date_start, 'day', 0, $outputlangs),
1570 '__DATE_END_YMD__' => dol_print_date($line->date_end, 'day', 0, $outputlangs),
1571 '__QUANTITY__' => $line->qty,
1572 '__SUBPRICE__' => price($line->subprice),
1573 '__AMOUNT__' => price($line->total_ttc),
1574 '__AMOUNT_EXCL_TAX__' => price($line->total_ht)
1575 );
1576
1577 // Create dynamic tags for __PRODUCT_EXTRAFIELD_FIELD__
1578 if (!empty($line->fk_product)) {
1579 if (!is_object($extrafields)) {
1580 $extrafields = new ExtraFields($this->db);
1581 }
1582 $product = new Product($this->db);
1583 $product->fetch($line->fk_product, '', '', 1);
1584 $product->fetch_optionals();
1585
1586 $extrafields->fetch_name_optionals_label($product->table_element, true);
1587
1588 if (!empty($extrafields->attributes[$product->table_element]['label']) && is_array($extrafields->attributes[$product->table_element]['label']) && count($extrafields->attributes[$product->table_element]['label']) > 0) {
1589 foreach ($extrafields->attributes[$product->table_element]['label'] as $key => $label) {
1590 $substit_line['__PRODUCT_EXTRAFIELD_'.strtoupper($key).'__'] = isset($product->array_options['options_'.$key]) ? $product->array_options['options_'.$key] : '';
1591 }
1592 }
1593 }
1594 $this->substit_lines[] = $substit_line;
1595 }
1596 }
1597 }
1598
1607 public static function getAvailableSubstitKey($mode = 'formemail', $object = null)
1608 {
1609 global $conf, $langs;
1610
1611 $tmparray = array();
1612 if ($mode == 'formemail' || $mode == 'formemailwithlines' || $mode == 'formemailforlines') {
1613 $parameters = array('mode'=>$mode);
1614 $tmparray = getCommonSubstitutionArray($langs, 2, null, $object); // Note: On email templated edition, this is null because it is related to all type of objects
1615 complete_substitutions_array($tmparray, $langs, null, $parameters);
1616
1617 if ($mode == 'formwithlines') {
1618 $tmparray['__LINES__'] = '__LINES__'; // Will be set by the get_form function
1619 }
1620 if ($mode == 'formforlines') {
1621 $tmparray['__QUANTITY__'] = '__QUANTITY__'; // Will be set by the get_form function
1622 }
1623 }
1624
1625 if ($mode == 'emailing') {
1626 $parameters = array('mode'=>$mode);
1627 $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
1628 complete_substitutions_array($tmparray, $langs, null, $parameters);
1629
1630 // For mass emailing, we have different keys specific to the data into tagerts list
1631 $tmparray['__ID__'] = 'IdRecord';
1632 $tmparray['__THIRDPARTY_CUSTOMER_CODE__'] = 'CustomerCode';
1633 $tmparray['__EMAIL__'] = 'EMailRecipient';
1634 $tmparray['__LASTNAME__'] = 'Lastname';
1635 $tmparray['__FIRSTNAME__'] = 'Firstname';
1636 $tmparray['__MAILTOEMAIL__'] = 'TagMailtoEmail';
1637 $tmparray['__OTHER1__'] = 'Other1';
1638 $tmparray['__OTHER2__'] = 'Other2';
1639 $tmparray['__OTHER3__'] = 'Other3';
1640 $tmparray['__OTHER4__'] = 'Other4';
1641 $tmparray['__OTHER5__'] = 'Other5';
1642 //,'__PERSONALIZED__' => 'Personalized' // Hidden because not used yet in mass emailing
1643
1644 $onlinepaymentenabled = 0;
1645 if (isModEnabled('paypal')) {
1646 $onlinepaymentenabled++;
1647 }
1648 if (isModEnabled('paybox')) {
1649 $onlinepaymentenabled++;
1650 }
1651 if (isModEnabled('stripe')) {
1652 $onlinepaymentenabled++;
1653 }
1654 if ($onlinepaymentenabled && !empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
1655 $tmparray['__SECUREKEYPAYMENT__'] = $conf->global->PAYMENT_SECURITY_TOKEN;
1656 if (!empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) {
1657 if (isModEnabled('adherent')) {
1658 $tmparray['__SECUREKEYPAYMENT_MEMBER__'] = 'SecureKeyPAYMENTUniquePerMember';
1659 }
1660 if (isModEnabled('don')) {
1661 $tmparray['__SECUREKEYPAYMENT_DONATION__'] = 'SecureKeyPAYMENTUniquePerDonation';
1662 }
1663 if (isModEnabled('facture')) {
1664 $tmparray['__SECUREKEYPAYMENT_INVOICE__'] = 'SecureKeyPAYMENTUniquePerInvoice';
1665 }
1666 if (isModEnabled('commande')) {
1667 $tmparray['__SECUREKEYPAYMENT_ORDER__'] = 'SecureKeyPAYMENTUniquePerOrder';
1668 }
1669 if (isModEnabled('contrat')) {
1670 $tmparray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = 'SecureKeyPAYMENTUniquePerContractLine';
1671 }
1672
1673 //Online payment link
1674 if (isModEnabled('adherent')) {
1675 $tmparray['__ONLINEPAYMENTLINK_MEMBER__'] = 'OnlinePaymentLinkUniquePerMember';
1676 }
1677 if (isModEnabled('don')) {
1678 $tmparray['__ONLINEPAYMENTLINK_DONATION__'] = 'OnlinePaymentLinkUniquePerDonation';
1679 }
1680 if (isModEnabled('facture')) {
1681 $tmparray['__ONLINEPAYMENTLINK_INVOICE__'] = 'OnlinePaymentLinkUniquePerInvoice';
1682 }
1683 if (isModEnabled('commande')) {
1684 $tmparray['__ONLINEPAYMENTLINK_ORDER__'] = 'OnlinePaymentLinkUniquePerOrder';
1685 }
1686 if (isModEnabled('contrat')) {
1687 $tmparray['__ONLINEPAYMENTLINK_CONTRACTLINE__'] = 'OnlinePaymentLinkUniquePerContractLine';
1688 }
1689 }
1690 } else {
1691 /* No need to show into tooltip help, option is not enabled
1692 $vars['__SECUREKEYPAYMENT__']='';
1693 $vars['__SECUREKEYPAYMENT_MEMBER__']='';
1694 $vars['__SECUREKEYPAYMENT_INVOICE__']='';
1695 $vars['__SECUREKEYPAYMENT_ORDER__']='';
1696 $vars['__SECUREKEYPAYMENT_CONTRACTLINE__']='';
1697 */
1698 }
1699 if (!empty($conf->global->MEMBER_ENABLE_PUBLIC)) {
1700 $substitutionarray['__PUBLICLINK_NEWMEMBERFORM__'] = 'BlankSubscriptionForm';
1701 }
1702 }
1703
1704 foreach ($tmparray as $key => $val) {
1705 if (empty($val)) {
1706 $tmparray[$key] = $key;
1707 }
1708 }
1709
1710 return $tmparray;
1711 }
1712}
1713
1714
1720class ModelMail
1721{
1725 public $id;
1726
1730 public $label;
1731
1735 public $fk_user;
1736
1740 public $private;
1741
1745 public $topic;
1746
1750 public $content;
1751 public $content_lines;
1752 public $lang;
1753 public $joinfiles;
1754
1755 public $email_from;
1756 public $email_to;
1757 public $email_tocc;
1758 public $email_tobcc;
1759
1763 public $module;
1764
1768 public $position;
1769}
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.