dolibarr  x.y.z
new.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2001-2002 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2001-2002 Jean-Louis Bergamo <jlb@j1b.org>
4  * Copyright (C) 2006-2013 Laurent Destailleur <eldy@users.sourceforge.net>
5  * Copyright (C) 2012 Regis Houssin <regis.houssin@inodbox.com>
6  * Copyright (C) 2012 J. Fernando Lagrange <fernando@demo-tic.org>
7  * Copyright (C) 2018-2019 Frédéric France <frederic.france@netlogic.fr>
8  * Copyright (C) 2018 Alexandre Spangaro <aspangaro@open-dsi.fr>
9  * Copyright (C) 2021 Waël Almoman <info@almoman.com>
10  * Copyright (C) 2022 Udo Tamm <dev@dolibit.de>
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 
43 if (!defined('NOLOGIN')) {
44  define("NOLOGIN", 1); // This means this output page does not require to be logged.
45 }
46 if (!defined('NOCSRFCHECK')) {
47  define("NOCSRFCHECK", 1); // We accept to go on this page from external web site.
48 }
49 if (!defined('NOIPCHECK')) {
50  define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
51 }
52 if (!defined('NOBROWSERNOTIF')) {
53  define('NOBROWSERNOTIF', '1');
54 }
55 
56 
57 // For MultiCompany module.
58 // Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
59 $entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
60 if (is_numeric($entity)) {
61  define("DOLENTITY", $entity);
62 }
63 
64 
65 // Load Dolibarr environment
66 require '../../main.inc.php';
67 require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
68 require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php';
69 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
70 require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
71 require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
72 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
73 require_once DOL_DOCUMENT_ROOT.'/core/class/cunits.class.php';
74 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
75 
76 // Init vars
77 $errmsg = '';
78 $num = 0;
79 $error = 0;
80 $backtopage = GETPOST('backtopage', 'alpha');
81 $action = GETPOST('action', 'aZ09');
82 
83 // Load translation files
84 $langs->loadLangs(array("main", "members", "companies", "install", "other", "errors"));
85 
86 // Security check
87 if (empty($conf->adherent->enabled)) {
88  httponly_accessforbidden('Module Membership not enabled');
89 }
90 
91 if (empty($conf->global->MEMBER_ENABLE_PUBLIC)) {
92  httponly_accessforbidden("Auto subscription form for public visitors has not been enabled");
93 }
94 
95 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
96 $hookmanager->initHooks(array('publicnewmembercard', 'globalcard'));
97 
98 $extrafields = new ExtraFields($db);
99 
100 $object = new Adherent($db);
101 
102 $user->loadDefaultValues();
103 
104 
116 function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $arrayofjs = '', $arrayofcss = '')
117 {
118  global $user, $conf, $langs, $mysoc;
119 
120  top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers
121 
122  print '<body id="mainbody" class="publicnewmemberform">';
123 
124  // Define urllogo
125  $urllogo = DOL_URL_ROOT.'/theme/common/login_logo.png';
126 
127  if (!empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_small)) {
128  $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/thumbs/'.$mysoc->logo_small);
129  } elseif (!empty($mysoc->logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$mysoc->logo)) {
130  $urllogo = DOL_URL_ROOT.'/viewimage.php?cache=1&amp;modulepart=mycompany&amp;file='.urlencode('logos/'.$mysoc->logo);
131  } elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/dolibarr_logo.svg')) {
132  $urllogo = DOL_URL_ROOT.'/theme/dolibarr_logo.svg';
133  }
134 
135  print '<div class="center">';
136 
137  // Output html code for logo
138  if ($urllogo) {
139  print '<div class="backgreypublicpayment">';
140  print '<div class="logopublicpayment">';
141  print '<img id="dolpaymentlogo" src="'.$urllogo.'">';
142  print '</div>';
143  if (empty($conf->global->MAIN_HIDE_POWERED_BY)) {
144  print '<div class="poweredbypublicpayment opacitymedium right"><a class="poweredbyhref" href="https://www.dolibarr.org?utm_medium=website&utm_source=poweredby" target="dolibarr" rel="noopener">'.$langs->trans("PoweredBy").'<br><img class="poweredbyimg" src="'.DOL_URL_ROOT.'/theme/dolibarr_logo.svg" width="80px"></a></div>';
145  }
146  print '</div>';
147  }
148 
149  if (!empty($conf->global->MEMBER_IMAGE_PUBLIC_REGISTRATION)) {
150  print '<div class="backimagepublicregistration">';
151  print '<img id="idEVENTORGANIZATION_IMAGE_PUBLIC_INTERFACE" src="'.$conf->global->MEMBER_IMAGE_PUBLIC_REGISTRATION.'">';
152  print '</div>';
153  }
154 
155  print '</div>';
156 
157  print '<div class="divmainbodylarge">';
158 }
159 
165 function llxFooterVierge()
166 {
167  print '</div>';
168 
169  printCommonFooter('public');
170 
171  print "</body>\n";
172  print "</html>\n";
173 }
174 
175 
176 
177 /*
178  * Actions
179  */
180 
181 $parameters = array();
182 // Note that $action and $object may have been modified by some hooks
183 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
184 if ($reshook < 0) {
185  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
186 }
187 
188 // Action called when page is submitted
189 if (empty($reshook) && $action == 'add') {
190  $error = 0;
191  $urlback = '';
192 
193  $db->begin();
194 
195  // test if login already exists
196  if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) {
197  if (!GETPOST('login')) {
198  $error++;
199  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Login"))."<br>\n";
200  }
201  $sql = "SELECT login FROM ".MAIN_DB_PREFIX."adherent WHERE login = '".$db->escape(GETPOST('login'))."'";
202  $result = $db->query($sql);
203  if ($result) {
204  $num = $db->num_rows($result);
205  }
206  if ($num != 0) {
207  $error++;
208  $langs->load("errors");
209  $errmsg .= $langs->trans("ErrorLoginAlreadyExists")."<br>\n";
210  }
211  if (!GETPOSTISSET("pass1") || !GETPOSTISSET("pass2") || GETPOST("pass1", 'none') == '' || GETPOST("pass2", 'none') == '' || GETPOST("pass1", 'none') != GETPOST("pass2", 'none')) {
212  $error++;
213  $langs->load("errors");
214  $errmsg .= $langs->trans("ErrorPasswordsMustMatch")."<br>\n";
215  }
216  if (!GETPOST('email')) {
217  $error++;
218  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("EMail"))."<br>\n";
219  }
220  }
221  if (GETPOST('typeid') <= 0) {
222  $error++;
223  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type"))."<br>\n";
224  }
225  if (!in_array(GETPOST('morphy'), array('mor', 'phy'))) {
226  $error++;
227  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv('Nature'))."<br>\n";
228  }
229  if (!GETPOST('lastname')) {
230  $error++;
231  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Lastname"))."<br>\n";
232  }
233  if (!GETPOST('firstname')) {
234  $error++;
235  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Firstname"))."<br>\n";
236  }
237  if (!empty($conf->global->ADHERENT_MAIL_REQUIRED) && empty(GETPOST('email'))) {
238  $error++;
239  $errmsg .= $langs->trans('ErrorFieldRequired', $langs->transnoentitiesnoconv('Email'))."<br>\n";
240  } elseif (GETPOST("email") && !isValidEmail(GETPOST("email"))) {
241  $langs->load('errors');
242  $error++;
243  $errmsg .= $langs->trans("ErrorBadEMail", GETPOST("email"))."<br>\n";
244  }
245  $birthday = dol_mktime(GETPOST("birthhour", 'int'), GETPOST("birthmin", 'int'), GETPOST("birthsec", 'int'), GETPOST("birthmonth", 'int'), GETPOST("birthday", 'int'), GETPOST("birthyear", 'int'));
246  if (GETPOST("birthmonth") && empty($birthday)) {
247  $error++;
248  $langs->load("errors");
249  $errmsg .= $langs->trans("ErrorBadDateFormat")."<br>\n";
250  }
251  if (!empty($conf->global->MEMBER_NEWFORM_DOLIBARRTURNOVER)) {
252  if (GETPOST("morphy") == 'mor' && GETPOST('budget') <= 0) {
253  $error++;
254  $errmsg .= $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("TurnoverOrBudget"))."<br>\n";
255  }
256  }
257 
258  // Check Captcha code if is enabled
259  if (!empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA)) {
260  $sessionkey = 'dol_antispam_value';
261  $ok = (array_key_exists($sessionkey, $_SESSION) === true && (strtolower($_SESSION[$sessionkey]) == strtolower($_POST['code'])));
262  if (!$ok) {
263  $error++;
264  $errmsg .= $langs->trans("ErrorBadValueForCode")."<br>\n";
265  $action = '';
266  }
267  }
268 
269  $public = GETPOSTISSET('public') ? 1 : 0;
270 
271  if (!$error) {
272  // E-mail looks OK and login does not exist
273  $adh = new Adherent($db);
274  $adh->statut = -1;
275  $adh->public = $public;
276  $adh->firstname = GETPOST('firstname');
277  $adh->lastname = GETPOST('lastname');
278  $adh->gender = GETPOST('gender');
279  $adh->civility_id = GETPOST('civility_id');
280  $adh->societe = GETPOST('societe');
281  $adh->address = GETPOST('address');
282  $adh->zip = GETPOST('zipcode');
283  $adh->town = GETPOST('town');
284  $adh->email = GETPOST('email');
285  if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) {
286  $adh->login = GETPOST('login');
287  $adh->pass = GETPOST('pass1');
288  }
289  $adh->photo = GETPOST('photo');
290  $adh->country_id = getDolGlobalString("MEMBER_NEWFORM_FORCECOUNTRYCODE", GETPOST('country_id', 'int'));
291  $adh->state_id = GETPOST('state_id', 'int');
292  $adh->typeid = getDolGlobalString("MEMBER_NEWFORM_FORCETYPE", GETPOST('typeid', 'int'));
293  $adh->note_private = GETPOST('note_private');
294  $adh->morphy = getDolGlobalString("MEMBER_NEWFORM_FORCEMORPHY", GETPOST('morphy'));
295  $adh->birth = $birthday;
296 
297  $adh->ip = getUserRemoteIP();
298 
299  $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
300  $now = dol_now();
301  $minmonthpost = dol_time_plus_duree($now, -1, "m");
302  // Calculate nb of post for IP
303  $nb_post_ip = 0;
304  if ($nb_post_max > 0) { // Calculate only if there is a limit to check
305  $sql = "SELECT COUNT(ref) as nb_adh";
306  $sql .= " FROM ".MAIN_DB_PREFIX."adherent";
307  $sql .= " WHERE ip = '".$db->escape($adh->ip)."'";
308  $sql .= " AND datec > '".$db->idate($minmonthpost)."'";
309  $resql = $db->query($sql);
310  if ($resql) {
311  $num = $db->num_rows($resql);
312  $i = 0;
313  while ($i < $num) {
314  $i++;
315  $obj = $db->fetch_object($resql);
316  $nb_post_ip = $obj->nb_adh;
317  }
318  }
319  }
320 
321 
322  // Fill array 'array_options' with data from add form
323  $extrafields->fetch_name_optionals_label($adh->table_element);
324  $ret = $extrafields->setOptionalsFromPost(null, $adh);
325  if ($ret < 0) {
326  $error++;
327  $errmsg .= $adh->error;
328  }
329 
330  if ($nb_post_max > 0 && $nb_post_ip >= $nb_post_max) {
331  $error++;
332  $errmsg .= $langs->trans("AlreadyTooMuchPostOnThisIPAdress");
333  array_push($adh->errors, $langs->trans("AlreadyTooMuchPostOnThisIPAdress"));
334  }
335 
336  if (!$error) {
337  $result = $adh->create($user);
338  if ($result > 0) {
339  require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php';
340  $object = $adh;
341 
342  $adht = new AdherentType($db);
343  $adht->fetch($object->typeid);
344 
345  if ($object->email) {
346  $subject = '';
347  $msg = '';
348 
349  // Send subscription email
350  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
351  $formmail = new FormMail($db);
352  // Set output language
353  $outputlangs = new Translate('', $conf);
354  $outputlangs->setDefaultLang(empty($object->thirdparty->default_lang) ? $mysoc->default_lang : $object->thirdparty->default_lang);
355  // Load traductions files required by page
356  $outputlangs->loadLangs(array("main", "members"));
357  // Get email content from template
358  $arraydefaultmessage = null;
359  $labeltouse = $conf->global->ADHERENT_EMAIL_TEMPLATE_AUTOREGISTER;
360 
361  if (!empty($labeltouse)) {
362  $arraydefaultmessage = $formmail->getEMailTemplate($db, 'member', $user, $outputlangs, 0, 1, $labeltouse);
363  }
364 
365  if (!empty($labeltouse) && is_object($arraydefaultmessage) && $arraydefaultmessage->id > 0) {
366  $subject = $arraydefaultmessage->topic;
367  $msg = $arraydefaultmessage->content;
368  }
369 
370  $substitutionarray = getCommonSubstitutionArray($outputlangs, 0, null, $object);
371  complete_substitutions_array($substitutionarray, $outputlangs, $object);
372  $subjecttosend = make_substitutions($subject, $substitutionarray, $outputlangs);
373  $texttosend = make_substitutions(dol_concatdesc($msg, $adht->getMailOnValid()), $substitutionarray, $outputlangs);
374 
375  if ($subjecttosend && $texttosend) {
376  $moreinheader = 'X-Dolibarr-Info: send_an_email by public/members/new.php'."\r\n";
377 
378  $result = $object->send_an_email($texttosend, $subjecttosend, array(), array(), array(), "", "", 0, -1, '', $moreinheader);
379  }
380  /*if ($result < 0) {
381  $error++;
382  setEventMessages($object->error, $object->errors, 'errors');
383  }*/
384  }
385 
386  // Send email to the foundation to say a new member subscribed with autosubscribe form
387  if (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL) && !empty($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT) &&
388  !empty($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL)) {
389  // Define link to login card
390  $appli = constant('DOL_APPLICATION_TITLE');
391  if (!empty($conf->global->MAIN_APPLICATION_TITLE)) {
392  $appli = $conf->global->MAIN_APPLICATION_TITLE;
393  if (preg_match('/\d\.\d/', $appli)) {
394  if (!preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) {
395  $appli .= " (".DOL_VERSION.")"; // If new title contains a version that is different than core
396  }
397  } else {
398  $appli .= " ".DOL_VERSION;
399  }
400  } else {
401  $appli .= " ".DOL_VERSION;
402  }
403 
404  $to = $adh->makeSubstitution($conf->global->MAIN_INFO_SOCIETE_MAIL);
405  $from = getDolGlobalString('ADHERENT_MAIL_FROM');
406  $mailfile = new CMailFile(
407  '['.$appli.'] '.$conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT,
408  $to,
409  $from,
410  $adh->makeSubstitution($conf->global->ADHERENT_AUTOREGISTER_NOTIF_MAIL),
411  array(),
412  array(),
413  array(),
414  "",
415  "",
416  0,
417  -1
418  );
419 
420  if (!$mailfile->sendfile()) {
421  dol_syslog($langs->trans("ErrorFailedToSendMail", $from, $to), LOG_ERR);
422  }
423  }
424 
425  // Auto-create thirdparty on member creation
426  if (!empty($conf->global->ADHERENT_DEFAULT_CREATE_THIRDPARTY)) {
427  $company = new Societe($db);
428  $result = $company->create_from_member($adh);
429  if ($result < 0) {
430  $error++;
431  $errmsg .= join('<br>', $company->errors);
432  }
433  }
434 
435  if (!empty($backtopage)) {
436  $urlback = $backtopage;
437  } elseif (!empty($conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION)) {
438  $urlback = $conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION;
439  // TODO Make replacement of __AMOUNT__, etc...
440  } else {
441  $urlback = $_SERVER["PHP_SELF"]."?action=added&token=".newToken();
442  }
443 
444  if (!empty($conf->global->MEMBER_NEWFORM_PAYONLINE) && $conf->global->MEMBER_NEWFORM_PAYONLINE != '-1') {
445  if (empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) { // If edition of amount not allowed
446  // TODO Check amount is same than the amount required for the type of member or if not defined as the defeault amount into $conf->global->MEMBER_NEWFORM_AMOUNT
447  // It is not so important because a test is done on return of payment validation.
448  }
449 
450  $urlback = getOnlinePaymentUrl(0, 'member', $adh->ref, price2num(GETPOST('amount', 'alpha'), 'MT'), '', 0);
451 
452  if (GETPOST('email')) {
453  $urlback .= '&email='.urlencode(GETPOST('email'));
454  }
455  if ($conf->global->MEMBER_NEWFORM_PAYONLINE != '-1' && $conf->global->MEMBER_NEWFORM_PAYONLINE != 'all') {
456  $urlback .= '&paymentmethod='.urlencode($conf->global->MEMBER_NEWFORM_PAYONLINE);
457  }
458  } else {
459  if (!empty($entity)) {
460  $urlback .= '&entity='.((int) $entity);
461  }
462  }
463  }
464 
465  if (!empty($backtopage)) {
466  $urlback = $backtopage;
467  dol_syslog("member ".$adh->ref." was created, we redirect to ".$urlback);
468  } elseif (!empty($conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION)) {
469  $urlback = $conf->global->MEMBER_URL_REDIRECT_SUBSCRIPTION;
470  // TODO Make replacement of __AMOUNT__, etc...
471  dol_syslog("member ".$adh->ref." was created, we redirect to ".$urlback);
472  } else {
473  $error++;
474  $errmsg .= join('<br>', $adh->errors);
475  }
476  }
477  }
478 
479  if (!$error) {
480  $db->commit();
481 
482  Header("Location: ".$urlback);
483  exit;
484  } else {
485  $db->rollback();
486  $action = "create";
487  }
488 }
489 
490 // Action called after a submitted was send and member created successfully
491 // If MEMBER_URL_REDIRECT_SUBSCRIPTION is set to url we never go here because a redirect was done to this url.
492 // backtopage parameter with an url was set on member submit page, we never go here because a redirect was done to this url.
493 
494 if (empty($reshook) && $action == 'added') {
495  llxHeaderVierge($langs->trans("NewMemberForm"));
496 
497  // If we have not been redirected
498  print '<br><br>';
499  print '<div class="center">';
500  print $langs->trans("NewMemberbyWeb");
501  print '</div>';
502 
503  llxFooterVierge();
504  exit;
505 }
506 
507 
508 
509 /*
510  * View
511  */
512 
513 $form = new Form($db);
514 $formcompany = new FormCompany($db);
515 $adht = new AdherentType($db);
516 $extrafields->fetch_name_optionals_label($object->table_element); // fetch optionals attributes and labels
517 
518 
519 llxHeaderVierge($langs->trans("NewSubscription"));
520 
521 
522 print load_fiche_titre($langs->trans("NewSubscription"), '', '', 0, 0, 'center');
523 
524 
525 print '<div align="center">';
526 print '<div id="divsubscribe">';
527 
528 print '<div class="center subscriptionformhelptext justify">';
529 if (!empty($conf->global->MEMBER_NEWFORM_TEXT)) {
530  print $langs->trans($conf->global->MEMBER_NEWFORM_TEXT)."<br>\n";
531 } else {
532  print $langs->trans("NewSubscriptionDesc", getDolGlobalString("MAIN_INFO_SOCIETE_MAIL"))."<br>\n";
533 }
534 print '</div>';
535 
536 dol_htmloutput_errors($errmsg);
538 
539 // Print form
540 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST" name="newmember">'."\n";
541 print '<input type="hidden" name="token" value="'.newToken().'" / >';
542 print '<input type="hidden" name="entity" value="'.$entity.'" />';
543 
544 if (!empty($conf->global->MEMBER_SKIP_TABLE) || !empty($conf->global->MEMBER_NEWFORM_FORCETYPE) || $action == 'create') {
545  print '<input type="hidden" name="action" value="add" />';
546  print '<br>';
547  print '<br><span class="opacitymedium">'.$langs->trans("FieldsWithAreMandatory", '*').'</span><br>';
548  //print $langs->trans("FieldsWithIsForPublic",'**').'<br>';
549 
550  print dol_get_fiche_head('');
551 
552  print '<script type="text/javascript">
553  jQuery(document).ready(function () {
554  jQuery(document).ready(function () {
555  function initmorphy()
556  {
557  console.log("Call initmorphy");
558  if (jQuery("#morphy").val() == \'phy\') {
559  jQuery("#trcompany").hide();
560  }
561  if (jQuery("#morphy").val() == \'mor\') {
562  jQuery("#trcompany").show();
563  }
564  }
565  initmorphy();
566  jQuery("#morphy").change(function() {
567  initmorphy();
568  });
569  jQuery("#selectcountry_id").change(function() {
570  document.newmember.action.value="create";
571  document.newmember.submit();
572  });
573  jQuery("#typeid").change(function() {
574  document.newmember.action.value="create";
575  document.newmember.submit();
576  });
577  });
578  });
579  </script>';
580 
581 
582  print '<table class="border" summary="form to subscribe" id="tablesubscribe">'."\n";
583 
584  // Type
585  if (empty($conf->global->MEMBER_NEWFORM_FORCETYPE)) {
586  $listoftype = $adht->liste_array();
587  $tmp = array_keys($listoftype);
588  $defaulttype = '';
589  $isempty = 1;
590  if (count($listoftype) == 1) {
591  $defaulttype = $tmp[0];
592  $isempty = 0;
593  }
594  print '<tr><td class="titlefield">'.$langs->trans("Type").' <span style="color: red">*</span></td><td>';
595  print $form->selectarray("typeid", $adht->liste_array(1), GETPOST('typeid') ? GETPOST('typeid') : $defaulttype, $isempty);
596  print '</td></tr>'."\n";
597  } else {
598  $adht->fetch($conf->global->MEMBER_NEWFORM_FORCETYPE);
599  print '<input type="hidden" id="typeid" name="typeid" value="'.$conf->global->MEMBER_NEWFORM_FORCETYPE.'">';
600  }
601 
602  // Moral/Physic attribute
603  $morphys["phy"] = $langs->trans("Physical");
604  $morphys["mor"] = $langs->trans("Moral");
605  if (empty($conf->global->MEMBER_NEWFORM_FORCEMORPHY)) {
606  print '<tr class="morphy"><td class="titlefield">'.$langs->trans('MemberNature').' <span style="color: red">*</span></td><td>'."\n";
607  print $form->selectarray("morphy", $morphys, GETPOST('morphy'), 1);
608  print '</td></tr>'."\n";
609  } else {
610  print $morphys[$conf->global->MEMBER_NEWFORM_FORCEMORPHY];
611  print '<input type="hidden" id="morphy" name="morphy" value="'.$conf->global->MEMBER_NEWFORM_FORCEMORPHY.'">';
612  }
613 
614  // Company // TODO : optional hide
615  print '<tr id="trcompany" class="trcompany"><td>'.$langs->trans("Company").'</td><td>';
616  print img_picto('', 'company', 'class="pictofixedwidth"');
617  print '<input type="text" name="societe" class="minwidth150 widthcentpercentminusx" value="'.dol_escape_htmltag(GETPOST('societe')).'"></td></tr>'."\n";
618 
619  // Title
620  print '<tr><td class="titlefield">'.$langs->trans('UserTitle').'</td><td>';
621  print $formcompany->select_civility(GETPOST('civility_id'), 'civility_id').'</td></tr>'."\n";
622 
623  // Lastname
624  print '<tr><td>'.$langs->trans("Lastname").' <span style="color: red">*</span></td><td><input type="text" name="lastname" class="minwidth150" value="'.dol_escape_htmltag(GETPOST('lastname')).'"></td></tr>'."\n";
625 
626  // Firstname
627  print '<tr><td>'.$langs->trans("Firstname").' <span style="color: red">*</span></td><td><input type="text" name="firstname" class="minwidth150" value="'.dol_escape_htmltag(GETPOST('firstname')).'"></td></tr>'."\n";
628 
629  // EMail
630  print '<tr><td>'.$langs->trans("Email").(getDolGlobalString("ADHERENT_MAIL_REQUIRED") ? ' <span style="color:red;">*</span>' : '').'</td><td>';
631  //print img_picto('', 'email', 'class="pictofixedwidth"');
632  print '<input type="text" name="email" maxlength="255" class="minwidth200" value="'.dol_escape_htmltag(GETPOST('email')).'"></td></tr>'."\n";
633 
634  // Login
635  if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) {
636  print '<tr><td>'.$langs->trans("Login").' <span style="color: red">*</span></td><td><input type="text" name="login" maxlength="50" class="minwidth100"value="'.dol_escape_htmltag(GETPOST('login')).'"></td></tr>'."\n";
637  print '<tr><td>'.$langs->trans("Password").' <span style="color: red">*</span></td><td><input type="password" maxlength="128" name="pass1" class="minwidth100" value="'.dol_escape_htmltag(GETPOST("pass1", "none", 2)).'"></td></tr>'."\n";
638  print '<tr><td>'.$langs->trans("PasswordRetype").' <span style="color: red">*</span></td><td><input type="password" maxlength="128" name="pass2" class="minwidth100" value="'.dol_escape_htmltag(GETPOST("pass2", "none", 2)).'"></td></tr>'."\n";
639  }
640 
641  // Gender
642  print '<tr><td>'.$langs->trans("Gender").'</td>';
643  print '<td>';
644  $arraygender = array('man'=>$langs->trans("Genderman"), 'woman'=>$langs->trans("Genderwoman"), 'other'=>$langs->trans("Genderother"));
645  print $form->selectarray('gender', $arraygender, GETPOST('gender', 'alphanohtml'), 1, 0, 0, '', 0, 0, 0, '', '', 1);
646  print '</td></tr>';
647 
648  // Address
649  print '<tr><td>'.$langs->trans("Address").'</td><td>'."\n";
650  print '<textarea name="address" id="address" wrap="soft" class="quatrevingtpercent" rows="'.ROWS_3.'">'.dol_escape_htmltag(GETPOST('address', 'restricthtml'), 0, 1).'</textarea></td></tr>'."\n";
651 
652  // Zip / Town
653  print '<tr><td>'.$langs->trans('Zip').' / '.$langs->trans('Town').'</td><td>';
654  print $formcompany->select_ziptown(GETPOST('zipcode'), 'zipcode', array('town', 'selectcountry_id', 'state_id'), 0, 1, '', 'width75');
655  print ' / ';
656  print $formcompany->select_ziptown(GETPOST('town'), 'town', array('zipcode', 'selectcountry_id', 'state_id'), 0, 1);
657  print '</td></tr>';
658 
659  // Country
660  print '<tr><td>'.$langs->trans('Country').'</td><td>';
661  print img_picto('', 'country', 'class="pictofixedwidth"');
662  $country_id = GETPOST('country_id', 'int');
663  if (!$country_id && !empty($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE)) {
664  $country_id = getCountry($conf->global->MEMBER_NEWFORM_FORCECOUNTRYCODE, 2, $db, $langs);
665  }
666  if (!$country_id && !empty($conf->geoipmaxmind->enabled)) {
667  $country_code = dol_user_country();
668  //print $country_code;
669  if ($country_code) {
670  $new_country_id = getCountry($country_code, 3, $db, $langs);
671  //print 'xxx'.$country_code.' - '.$new_country_id;
672  if ($new_country_id) {
673  $country_id = $new_country_id;
674  }
675  }
676  }
677  $country_code = getCountry($country_id, 2, $db, $langs);
678  print $form->select_country($country_id, 'country_id');
679  print '</td></tr>';
680  // State
681  if (empty($conf->global->SOCIETE_DISABLE_STATE)) {
682  print '<tr><td>'.$langs->trans('State').'</td><td>';
683  if ($country_code) {
684  print $formcompany->select_state(GETPOST("state_id"), $country_code);
685  }
686  print '</td></tr>';
687  }
688 
689  // Birthday
690  print '<tr id="trbirth" class="trbirth"><td>'.$langs->trans("DateOfBirth").'</td><td>';
691  print $form->selectDate(!empty($birthday) ? $birthday : "", 'birth', 0, 0, 1, "newmember", 1, 0);
692  print '</td></tr>'."\n";
693 
694  // Photo
695  print '<tr><td>'.$langs->trans("URLPhoto").'</td><td><input type="text" name="photo" class="minwidth150" value="'.dol_escape_htmltag(GETPOST('photo')).'"></td></tr>'."\n";
696 
697  // Public
698  print '<tr><td>'.$langs->trans("Public").'</td><td><input type="checkbox" name="public"></td></tr>'."\n";
699 
700  // Other attributes
701  $tpl_context = 'public'; // define template context to public
702  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
703 
704  // Comments
705  print '<tr>';
706  print '<td class="tdtop">'.$langs->trans("Comments").'</td>';
707  print '<td class="tdtop"><textarea name="note_private" id="note_private" wrap="soft" class="quatrevingtpercent" rows="'.ROWS_3.'">'.dol_escape_htmltag(GETPOST('note_private', 'restricthtml'), 0, 1).'</textarea></td>';
708  print '</tr>'."\n";
709 
710  // Add specific fields used by Dolibarr foundation for example
711  // TODO Move this into generic feature.
712  if (!empty($conf->global->MEMBER_NEWFORM_DOLIBARRTURNOVER)) {
713  $arraybudget = array('50'=>'<= 100 000', '100'=>'<= 200 000', '200'=>'<= 500 000', '300'=>'<= 1 500 000', '600'=>'<= 3 000 000', '1000'=>'<= 5 000 000', '2000'=>'5 000 000+');
714  print '<tr id="trbudget" class="trcompany"><td>'.$langs->trans("TurnoverOrBudget").' <span style="color: red">*</span></td><td>';
715  print $form->selectarray('budget', $arraybudget, GETPOST('budget'), 1);
716  print ' € or $';
717 
718  print '<script type="text/javascript">
719  jQuery(document).ready(function () {
720  initturnover();
721  jQuery("#morphy").click(function() {
722  initturnover();
723  });
724  jQuery("#budget").change(function() {
725  if (jQuery("#budget").val() > 0) { jQuery(".amount").val(jQuery("#budget").val()); }
726  else { jQuery("#budget").val(\'\'); }
727  });
728  /*jQuery("#typeid").change(function() {
729  if (jQuery("#typeid").val()==1) { jQuery("#morphy").val(\'mor\'); }
730  if (jQuery("#typeid").val()==2) { jQuery("#morphy").val(\'phy\'); }
731  if (jQuery("#typeid").val()==3) { jQuery("#morphy").val(\'mor\'); }
732  if (jQuery("#typeid").val()==4) { jQuery("#morphy").val(\'mor\'); }
733  initturnover();
734  });*/
735  function initturnover() {
736  if (jQuery("#morphy").val()==\'phy\') {
737  jQuery(".amount").val(20);
738  jQuery("#trbudget").hide();
739  jQuery("#trcompany").hide();
740  }
741  if (jQuery("#morphy").val()==\'mor\') {
742  jQuery(".amount").val(\'\');
743  jQuery("#trcompany").show();
744  jQuery("#trbirth").hide();
745  jQuery("#trbudget").show();
746  if (jQuery("#budget").val() > 0) { jQuery(".amount").val(jQuery("#budget").val()); }
747  else { jQuery("#budget").val(\'\'); }
748  }
749  }
750  });
751  </script>';
752  print '</td></tr>'."\n";
753  }
754 
755  if (!empty($conf->global->MEMBER_NEWFORM_PAYONLINE)) {
756  $typeid = $conf->global->MEMBER_NEWFORM_FORCETYPE ? $conf->global->MEMBER_NEWFORM_FORCETYPE : GETPOST('typeid', 'int');
757  $adht = new AdherentType($db);
758  $adht->fetch($typeid);
759  $caneditamount = $adht->caneditamount;
760 
761  // Set amount for the subscription:
762  // - First check the amount of the member type.
763  $amountbytype = $adht->amountByType(1); // Load the array of amount per type
764  $amount = empty($amountbytype[$typeid]) ? (isset($amount) ? $amount : 0) : $amountbytype[$typeid];
765  // - If not found, take the default amount only of the user is authorized to edit it
766  if ($caneditamount && empty($amount) && !empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
767  $amount = $conf->global->MEMBER_NEWFORM_AMOUNT;
768  }
769  // - If not set, we accept ot have amount defined as parameter (for backward compatibility).
770  if (empty($amount)) {
771  $amount = (GETPOST('amount') ? price2num(GETPOST('amount', 'alpha'), 'MT', 2) : '');
772  }
773 
774  // Clean the amount
775  $amount = price2num($amount);
776  $showedamount = $amount>0? $amount: 0;
777  // $conf->global->MEMBER_NEWFORM_PAYONLINE is 'paypal', 'paybox' or 'stripe'
778  print '<tr><td>'.$langs->trans("Subscription");
779  if (!empty($conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO)) {
780  print ' - <a href="'.$conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO.'" rel="external" target="_blank" rel="noopener noreferrer">'.$langs->trans("SeeHere").'</a>';
781  }
782  print '</td><td class="nowrap">';
783 
784  if (empty($amount) && !empty($conf->global->MEMBER_NEWFORM_AMOUNT)) {
785  $amount = $conf->global->MEMBER_NEWFORM_AMOUNT;
786  }
787 
788  if (!empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT) || $caneditamount) {
789  print '<input type="text" name="amount" id="amount" class="flat amount width50" value="'.$showedamount.'">';
790  print ' '.$langs->trans("Currency".$conf->currency).'<span class="opacitymedium"> – ';
791  print $amount > 0 ? $langs->trans("AnyAmountWithAdvisedAmount", price($amount, 0, $langs, 1, -1, -1, $conf->currency)): $langs->trans("AnyAmountWithoutAdvisedAmount");
792  print '</span>';
793  } else {
794  print '<input type="hidden" name="amount" id="amount" class="flat amount" value="'.$showedamount.'">';
795  print '<input type="text" name="amount" id="amounthidden" class="flat amount width50" disabled value="'.$showedamount.'">';
796  print ' '.$langs->trans("Currency".$conf->currency);
797  }
798  print '</td></tr>';
799  }
800 
801  // Display Captcha code if is enabled
802  if (!empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA)) {
803  require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
804  print '<tr><td class="titlefield"><label for="email"><span class="fieldrequired">'.$langs->trans("SecurityCode").'</span></label></td><td>';
805  print '<span class="span-icon-security inline-block">';
806  print '<input id="securitycode" placeholder="'.$langs->trans("SecurityCode").'" class="flat input-icon-security width150" type="text" maxlength="5" name="code" tabindex="3" />';
807  print '</span>';
808  print '<span class="nowrap inline-block">';
809  print '<img class="inline-block valignmiddle" src="'.DOL_URL_ROOT.'/core/antispamimage.php" border="0" width="80" height="32" id="img_securitycode" />';
810  print '<a class="inline-block valignmiddle" href="'.$php_self.'" tabindex="4" data-role="button">'.img_picto($langs->trans("Refresh"), 'refresh', 'id="captcha_refresh_img"').'</a>';
811  print '</span>';
812  print '</td></tr>';
813  }
814 
815  print "</table>\n";
816 
817  print dol_get_fiche_end();
818 
819  // Save / Submit
820  print '<div class="center">';
821  print '<input type="submit" value="'.$langs->trans("GetMembershipButtonLabel").'" id="submitsave" class="button">';
822  if (!empty($backtopage)) {
823  print ' &nbsp; &nbsp; <input type="submit" value="'.$langs->trans("Cancel").'" id="submitcancel" class="button button-cancel">';
824  }
825  print '</div>';
826 
827 
828  print "</form>\n";
829  print "<br>";
830  print '</div></div>';
831 } else { // Show the table of membership types
832  // Get units
833  $measuringUnits = new CUnits($db);
834  $result = $measuringUnits->fetchAll('', '', 0, 0, array('t.active' => 1));
835  $units = array();
836  foreach ($measuringUnits->records as $lines)
837  $units[$lines->short_label] = $langs->trans(ucfirst($lines->label));
838 
839  $publiccounters = getDolGlobalString("MEMBER_COUNTERS_ARE_PUBLIC");
840 
841  $sql = "SELECT d.rowid, d.libelle as label, d.subscription, d.amount, d.caneditamount, d.vote, d.note, d.duration, d.statut as status, d.morphy,";
842  $sql .= " COUNT(a.rowid) AS membercount";
843  $sql .= " FROM ".MAIN_DB_PREFIX."adherent_type as d";
844  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."adherent as a";
845  $sql .= " ON d.rowid = a.fk_adherent_type AND a.statut > 0";
846  $sql .= " WHERE d.entity IN (".getEntity('member_type').")";
847  $sql .= " AND d.statut=1";
848  $sql .= " GROUP BY d.rowid, d.libelle, d.subscription, d.amount, d.caneditamount, d.vote, d.note, d.duration, d.statut, d.morphy";
849 
850  $result = $db->query($sql);
851  if ($result) {
852  $num = $db->num_rows($result);
853 
854  print '<br><div class="div-table-responsive">';
855  print '<table class="tagtable liste">'."\n";
856  print '<input type="hidden" name="action" value="create">';
857 
858  print '<tr class="liste_titre">';
859  print '<th>'.$langs->trans("Label").'</th>';
860  print '<th class="center">'.$langs->trans("MembershipDuration").'</th>';
861  print '<th class="center">'.$langs->trans("Amount").'</th>';
862  print '<th class="center">'.$langs->trans("MembersNature").'</th>';
863  print '<th class="center">'.$langs->trans("VoteAllowed").'</th>';
864  if ($publiccounters) print '<th class="center">'.$langs->trans("Members").'</th>';
865  print '<th class="center">'.$langs->trans("NewSubscription").'</th>';
866  print "</tr>\n";
867 
868  $i = 0;
869  while ($i < $num) {
870  $objp = $db->fetch_object($result);
871 
872  print '<tr class="oddeven">';
873  print '<td>'.dol_escape_htmltag($objp->label).'</td>';
874  print '<td class="nowrap">';
875  $unit = preg_replace("/[^a-zA-Z]+/", "", $objp->duration);
876  print max(1, intval($objp->duration)).' '.$units[$unit];
877  print '</td>';
878  print '<td class="center"><span class="amount nowrap">';
879  $displayedamount = max(intval($objp->amount), intval(getDolGlobalInt("MEMBER_MIN_AMOUNT")));
880  $caneditamount = !empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT) || $objp->caneditamount;
881  if ($objp->subscription) {
882  if ($displayedamount > 0 || !$caneditamount) {
883  print $displayedamount.' '.strtoupper($conf->currency);
884  }
885  if ($caneditamount && $displayedamount>0) {
886  print $form->textwithpicto('', $langs->transnoentities("CanEditAmountShortForValues"), 1, 'help', '', 0, 3);
887  } elseif ($caneditamount) {
888  print $langs->transnoentities("CanEditAmountShort");
889  }
890  } else {
891  print "–"; // No subscription required
892  }
893  print '</span></td>';
894  print '<td class="center">';
895  if ($objp->morphy == 'phy') {
896  print $langs->trans("Physical");
897  } elseif ($objp->morphy == 'mor') {
898  print $langs->trans("Moral");
899  } else {
900  print $langs->trans("MorAndPhy");
901  }
902  print '</td>';
903  print '<td class="center">'.yn($objp->vote).'</td>';
904  $membercount = $objp->membercount>0? $objp->membercount: "–";
905  if ($publiccounters) print '<td class="center">'.$membercount.'</td>';
906  print '<td class="center"><button class="button button-save reposition" name="typeid" type="submit" name="submit" value="'.$objp->rowid.'">'.$langs->trans("GetMembershipButtonLabel").'</button></td>';
907  print "</tr>";
908  $i++;
909  }
910 
911  // If no record found
912  if ($num == 0) {
913  $colspan = 8;
914  print '<tr><td colspan="'.$colspan.'" class="opacitymedium">'.$langs->trans("NoRecordFound").'</td></tr>';
915  }
916 
917  print "</table>";
918  print '</div>';
919 
920  print '</form>';
921  } else {
922  dol_print_error($db);
923  }
924 }
925 
926 
928 
929 $db->close();
Class to manage members of a foundation.
Class to manage members type.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class of dictionary type of thirdparty (used by imports)
Class to manage standard extra fields.
Class to build HTML component for third parties management Only common components are here.
Class to manage generation of HTML components Only common components must be here.
Classe permettant la generation du formulaire html d'envoi de mail unitaire Usage: $formail = new For...
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
getCountry($searchkey, $withcode='', $dbtouse=0, $outputlangs='', $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition: date.lib.php:121
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_user_country()
Return country code for current user.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dol_htmloutput_events($disabledoutputofmessages=0)
Print formated messages to output (Used to show messages on html output).
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
if(!function_exists('utf8_encode')) if(!function_exists('utf8_decode')) getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null)
Return array of possible common substitutions.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getUserRemoteIP()
Return the IP of remote user.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formated error messages to output (Used to show messages on html output).
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Ouput html header of a page.
Definition: main.inc.php:1530
llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='')
Show header for new member.
Definition: new.php:116
llxFooterVierge()
Show footer for new member.
Definition: new.php:165
httponly_accessforbidden($message=1, $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.