dolibarr 22.0.5
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-2024 Frédéric France <frederic.france@free.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 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 */
26
33if (!defined('NOLOGIN')) {
34 define("NOLOGIN", 1); // This means this output page does not require to be logged.
35}
36if (!defined('NOCSRFCHECK')) {
37 define("NOCSRFCHECK", 1); // We accept to go on this page from external web site.
38}
39if (!defined('NOBROWSERNOTIF')) {
40 define('NOBROWSERNOTIF', '1');
41}
42
43
44// For MultiCompany module.
45// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php
46// Because 2 entities can have the same ref
47$entity = (!empty($_GET['entity']) ? (int) $_GET['entity'] : (!empty($_POST['entity']) ? (int) $_POST['entity'] : 1));
48// if (is_numeric($entity)) { // value is casted to int so always numeric
49define("DOLENTITY", $entity);
50// }
51
52
53// Load Dolibarr environment
54require '../../main.inc.php';
55require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
56require_once DOL_DOCUMENT_ROOT . '/core/lib/payments.lib.php';
57require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
58require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent_type.class.php';
59require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php';
60require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
61require_once DOL_DOCUMENT_ROOT . '/core/class/cunits.class.php';
62require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
63require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php';
64require_once DOL_DOCUMENT_ROOT . '/core/lib/public.lib.php';
65
73// Init vars
74$backtopage = GETPOST('backtopage', 'alpha');
75$action = GETPOST('action', 'aZ09');
76
77$errmsg = '';
78$num = 0;
79$error = 0;
80
81// Load translation files
82$langs->loadLangs(array("main", "members", "companies", "install", "other", "errors"));
83
84// Security check
85if (!isModEnabled('societe')) {
86 httponly_accessforbidden('Module Thirdparty not enabled');
87}
88
89if (!getDolGlobalString('SOCIETE_ENABLE_PUBLIC')) {
90 httponly_accessforbidden("Online form for contact for public visitors has not been enabled (option SOCIETE_ENABLE_PUBLIC)");
91}
92
93
94// permissions
95
96$permissiontoadd = $user->hasRight('societe', 'creer');
97
98// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
99$hookmanager->initHooks(array('publicnewmembercard', 'globalcard'));
100
101$extrafields = new ExtraFields($db);
102
103$objectsoc = new Societe($db);
104$user->loadDefaultValues();
105
106$extrafields->fetch_name_optionals_label($objectsoc->table_element); // fetch optionals attributes and labels
107
108
122function llxHeaderVierge($title, $head = "", $disablejs = 0, $disablehead = 0, $arrayofjs = [], $arrayofcss = []) // @phan-suppress-current-line PhanRedefineFunction
123{
124 global $conf, $langs, $mysoc;
125
126 top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers
127
128 print '<body id="mainbody" class="publicnewmemberform">';
129
130 include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
131 htmlPrintOnlineHeader($mysoc, $langs, 1, getDolGlobalString('THIRDPARTY_PUBLIC_INTERFACE_TOPIC'), 'THIRDPARTY_PUBLIC_INTERFACE_IMAGE');
132
133 print '<div class="divmainbodylarge">';
134}
135
143function llxFooterVierge() // @phan-suppress-current-line PhanRedefineFunction
144{
145 global $conf, $langs;
146
147 print '</div>';
148
149 printCommonFooter('public');
150
151 if (!empty($conf->use_javascript_ajax)) {
152 print "\n" . '<!-- Includes JS Footer of Dolibarr -->' . "\n";
153 print '<script src="' . DOL_URL_ROOT . '/core/js/lib_foot.js.php?lang=' . $langs->defaultlang . '"></script>' . "\n";
154 }
155
156 print "</body>\n";
157 print "</html>\n";
158}
159
160
161
162/*
163 * Actions
164 */
165
166$parameters = array();
167// Note that $action and $object may have been modified by some hooks
168$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action);
169if ($reshook < 0) {
170 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
171}
172
173// Action called when page is submitted
174if (empty($reshook) && $action == 'add') { // Test on permission not required here. This is a public page. Security is done on constant and mitigation.
175 $error = 0;
176 $urlback = '';
177
178 $db->begin();
179
180 if (!GETPOST('name')) {
181 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Company")), null, 'errors');
182 $error++;
183 }
184
185 // Check Captcha code if is enabled
186 if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA_THIRDPARTY')) {
187 $sessionkey = 'dol_antispam_value';
188 $ok = (array_key_exists($sessionkey, $_SESSION) && (strtolower($_SESSION[$sessionkey]) == strtolower(GETPOST('code'))));
189 if (!$ok) {
190 $error++;
191 $errmsg .= $langs->trans("ErrorBadValueForCode") . "<br>\n";
192 $action = '';
193 }
194 }
195
196 if (!$error) {
197 $societe = new Societe($db);
198
199 $societe->name = GETPOST('name', 'alphanohtml');
200 $societe->client = GETPOSTINT('client') ? GETPOSTINT('client') : $societe->client;
201 $societe->address = GETPOST('address', 'alphanohtml');
202 $societe->country_id = GETPOSTINT('country_id');
203 $societe->phone = GETPOST('phone', 'alpha');
204 $societe->fax = GETPOST('fax', 'alpha');
205 $societe->email = trim(GETPOST('email', 'email'));
206 $societe->client = 2 ; // our client is a prospect
207 $societe->code_client = '-1';
208 $societe->name_alias = GETPOST('name_alias', 'alphanohtml');
209 $societe->note_private = GETPOST('note_private', 'alphanohtml');
210
211 // Fill array 'array_options' with data from add form
212 /*
213 $extrafields->fetch_name_optionals_label($societe->table_element);
214 $ret = $extrafields->setOptionalsFromPost(null, $societe);
215 if ($ret < 0) {
216 $error++;
217 $errmsg .= $societe->error;
218 }
219 */
220
221 $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
222
223 if (checkNbPostsForASpeceificIp($societe, $nb_post_max) <= 0) {
224 $error++;
225 $errmsg .= implode('<br>', $societe->errors);
226 }
227
228 if (!$error) {
229 $result = $societe->create($user);
230 if ($result > 0) {
231 require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
232 $objectsoc = $societe;
233
234 if (!empty($backtopage)) {
235 $urlback = $backtopage;
236 } elseif (getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION')) {
237 $urlback = getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION');
238 // TODO Make replacement of __AMOUNT__, etc...
239 } else {
240 $urlback = $_SERVER["PHP_SELF"] . "?action=added&token=" . newToken();
241 }
242 } else {
243 $error++;
244 $errmsg .= implode('<br>', $societe->errors);
245 }
246 }
247 }
248
249 if (!$error) {
250 $db->commit();
251
252 header("Location: " . $urlback);
253 exit;
254 } else {
255 $db->rollback();
256 $action = "create";
257 }
258}
259
260// Action called after a submitted was send and prospect created successfully
261// If MEMBER_URL_REDIRECT_SUBSCRIPTION is set to an url, we never go here because a redirect was done to this url. Same if we ask to redirect to the payment page.
262// backtopage parameter with an url was set on prospect submit page, we never go here because a redirect was done to this url.
263
264if (empty($reshook) && $action == 'added') { // Test on permission not required here
265 llxHeaderVierge("newSocieteAdded");
266
267 // If we have not been redirected
268 print '<br><br>';
269 print '<div class="center">';
270 print $langs->trans("newSocieteAdded");
271 print '</div>';
272
274 exit;
275}
276
277
278
279/*
280 * View
281 */
282
283$form = new Form($db);
284$formcompany = new FormCompany($db);
285$adht = new AdherentType($db);
286$formadmin = new FormAdmin($db);
287
288
289llxHeaderVierge($langs->trans("ContactUs"));
290
291print '<br>';
292print load_fiche_titre(img_picto('', 'member_nocolor', 'class="pictofixedwidth"') . ' &nbsp; ' . $langs->trans("ContactUs"), '', '', 0, '', 'center');
293
294
295print '<div align="center">';
296print '<div id="divsubscribe">';
297
298print '<div class="center subscriptionformhelptext opacitymedium justify">';
299if (getDolGlobalString('COMPANY_NEWFORM_TEXT')) {
300 print $langs->trans(getDolGlobalString('COMPANY_NEWFORM_TEXT')) . "<br>\n";
301} else {
302 print $langs->trans("ContactUsDesc", getDolGlobalString("MAIN_INFO_SOCIETE_MAIL")) . "<br>\n";
303}
304print '</div>';
305
306dol_htmloutput_errors($errmsg);
308
309// Print form
310print '<form action="' . $_SERVER["PHP_SELF"] . '" method="POST" name="newprospect">' . "\n";
311print '<input type="hidden" name="token" value="' . newToken() . '" / >';
312print '<input type="hidden" name="entity" value="' . $entity . '" />';
313print '<input type="hidden" name="action" value="add" />';
314print '<br>';
315
316$messagemandatory = '<span class="">' . $langs->trans("FieldsWithAreMandatory", '*') . '</span>';
317//print '<br><span class="opacitymedium">'.$langs->trans("FieldsWithAreMandatory", '*').'</span><br>';
318//print $langs->trans("FieldsWithIsForPublic",'**').'<br>';
319
320print dol_get_fiche_head();
321
322print '<script type="text/javascript">
323jQuery(document).ready(function () {
324 jQuery(document).ready(function () {
325 function initmorphy()
326 {
327 console.log("Call initmorphy");
328 if (jQuery("#morphy").val() == \'phy\') {
329 jQuery("#trcompany").hide();
330 }
331 if (jQuery("#morphy").val() == \'mor\') {
332 jQuery("#trcompany").show();
333 }
334 }
335 initmorphy();
336 jQuery("#morphy").change(function() {
337 initmorphy();
338 });
339 jQuery("#selectcountry_id").change(function() {
340 document.newprospect.action.value="create";
341 document.newprospect.submit();
342 });
343 jQuery("#typeid").change(function() {
344 document.newprospect.action.value="create";
345 document.newprospect.submit();
346 });
347 });
348});
349</script>';
350
351
352print '<table class="border" summary="form to subscribe" id="tablesubscribe">' . "\n";
353//Third party name
354/*
355if ($objectsoc->particulier || $private) {
356 print '<span id="TypeName" class="fieldrequired">'.$langs->trans('ThirdPartyName').' / '.$langs->trans('LastName', 'name').'</span>';
357} else {
358 print '<span id="TypeName" class="fieldrequired">'.$form->editfieldkey('ThirdPartyName', 'name', '', $objectsoc, 0).'</span>';
359}
360*/
361print '<tr class="tr-field-thirdparty-name"><td class="titlefieldcreate">'; // text appreas left
362print '<input type="hidden" name="ThirdPartyName" value="' . $langs->trans('ThirdPartyName') . '">';
363print '<span id="TypeName" class="fieldrequired" title="' .dol_escape_htmltag($langs->trans("FieldsWithAreMandatory", '*')) . '" >' . $form->editfieldkey('Company', 'name', '', $objectsoc, 0) . '<span class="star"> *</span></span>';
364print '</td><td>'; // inline input
365print '<input type="text" class="minwidth300" maxlength="128" name="name" id="name" value="' . dol_escape_htmltag($objectsoc->name) . '" autofocus="autofocus">';
366//
367
368// Name and lastname
369print '<tr><td class="classfortooltip" title="' . dol_escape_htmltag($messagemandatory) . '">' . $langs->trans("Firstname") . ' <span class="star">*</span></td><td><input type="text" name="firstname" class="minwidth150" value="' . dol_escape_htmltag(GETPOST('firstname')) . '"></td></tr>' . "\n";
370
371print '<tr><td class="classfortooltip" title="' . dol_escape_htmltag($messagemandatory) . '">' . $langs->trans("Lastname") . ' <span class="star">*</span></td><td><input type="text" name="lastname" class="minwidth150" value="' . dol_escape_htmltag(GETPOST('lastname')) . '"></td></tr>' . "\n";
372
373// Address
374print '<tr><td class="tdtop">';
375print $form->editfieldkey('Address', 'address', '', $objectsoc, 0);
376print '</td>';
377print '<td>';
378print '<textarea name="address" id="address" class="quatrevingtpercent" rows="' . ROWS_2 . '" wrap="soft">';
379print dol_escape_htmltag($objectsoc->address, 0, 1);
380print '</textarea>';
381print $form->widgetForTranslation("address", $objectsoc, $permissiontoadd, 'textarea', 'alphanohtml', 'quatrevingtpercent');
382print '</td></tr>';
383
384// Country
385print '<tr><td>' . $form->editfieldkey('Country', 'selectcountry_id', '', $objectsoc, 0) . '</td><td class="maxwidthonsmartphone">';
386print img_picto('', 'country', 'class="pictofixedwidth"');
387print $form->select_country((GETPOSTISSET('country_id') ? GETPOST('country_id') : $objectsoc->country_id), 'country_id', '', 0, 'minwidth300 maxwidth500 widthcentpercentminusx');
388if ($user->admin) {
389 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
390}
391print '</td></tr>';
392
393// Phone / Fax
394print '<tr><td>' . $form->editfieldkey('Phone', 'phone', '', $objectsoc, 0) . '</td>';
395print '<td>' . img_picto('', 'object_phoning', 'class="pictofixedwidth"') . ' <input type="text" name="phone" id="phone" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('phone') ? GETPOST('phone', 'alpha') : $objectsoc->phone) . '"></td>';
396print '</tr>';
397
398print '<tr>';
399print '<td>' . $form->editfieldkey('Fax', 'fax', '', $objectsoc, 0) . '</td>';
400print '<td>' . img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"') . ' <input type="text" name="fax" id="fax" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $objectsoc->fax) . '"></td>';
401print '</tr>';
402
403// Email / Web
404print '<tr><td>' . $form->editfieldkey('EMail', 'email', '', $objectsoc, 0, 'string', '', !getDolGlobalString('SOCIETE_EMAIL_MANDATORY') ? '' : $conf->global->SOCIETE_EMAIL_MANDATORY) . '</td>';
405print '<td>' . img_picto('', 'object_email', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth200 widthcentpercentminusx" name="email" id="email" value="' . $objectsoc->email . '"></td>';
406if (isModEnabled('mailing') && getDolGlobalString('THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION')) {
407 if ($conf->browser->layout == 'phone') {
408 print '</tr><tr>';
409 }
410 print '<td class="individualline noemail">' . $form->editfieldkey($langs->trans('No_Email') . ' (' . $langs->trans('Contact') . ')', 'contact_no_email', '', $objectsoc, 0) . '</td>';
411 print '<td class="individualline" ' . (($conf->browser->layout == 'phone') /* || !isModEnabled('mailing') */ ? ' colspan="3"' : '') . '>' . $form->selectyesno('contact_no_email', (GETPOSTISSET("contact_no_email") ? GETPOST("contact_no_email", 'alpha') : (empty($objectsoc->no_email) ? 0 : 1)), 1, false, 1) . '</td>';
412}
413print '</tr>';
414
415print '<tr><td>' . $form->editfieldkey('Web', 'url', '', $objectsoc, 0) . '</td>';
416print '<td>' . img_picto('', 'globe', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth500 widthcentpercentminusx" name="url" id="url" value="' . $objectsoc->url . '"></td></tr>';
417
418
419// Comments
420print '<tr>';
421print '<td class="tdtop">' . $langs->trans("Comments") . '</td>';
422print '<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>';
423print '</tr>' . "\n";
424
425
426// Other attributes
427$parameters['tpl_context'] = 'public'; // define template context to public
428include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
429
430
431// TODO Move this into generic feature.
432
433// Display Captcha code if is enabled
434if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA_THIRDPARTY')) {
435 require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php';
436 print '<tr><td class="titlefield"><label for="email"><span class="fieldrequired">' . $langs->trans("SecurityCode") . '</span></label></td><td>';
437 print '<span class="span-icon-security inline-block">';
438 print '<input id="securitycode" placeholder="' . $langs->trans("SecurityCode") . '" class="flat input-icon-security width150" type="text" maxlength="5" name="code" tabindex="3" />';
439 print '</span>';
440 print '<span class="nowrap inline-block">';
441 print '<img class="inline-block valignmiddle" src="' . DOL_URL_ROOT . '/core/antispamimage.php" border="0" width="80" height="32" id="img_securitycode" />';
442 print '<a class="inline-block valignmiddle" href="' . $_SERVER['PHP_SELF'] . '" tabindex="4" data-role="button">' . img_picto($langs->trans("Refresh"), 'refresh', 'id="captcha_refresh_img"') . '</a>';
443 print '</span>';
444 print '</td></tr>';
445}
446
447print "</table>\n";
448
449print dol_get_fiche_end();
450
451// Save / Submit
452print '<div class="center">';
453print '<input type="submit" value="' . $langs->trans("Send") . '" id="submitsave" class="button">';
454if (!empty($backtopage)) {
455 print ' &nbsp; &nbsp; <input type="submit" value="' . $langs->trans("Cancel") . '" id="submitcancel" class="button button-cancel">';
456}
457print '</div>';
458
459
460print "</form>\n";
461print "<br>";
462print '</div></div>';
463
464
465
467
468$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:67
Class to manage members type.
Class to manage standard extra fields.
Class to generate html code for admin pages.
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.
Class to manage third parties objects (customers, suppliers, prospects...)
llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs=[], $arrayofcss=[])
Show header for new prospect.
Definition new.php:122
llxFooterVierge()
Show footer for new societe.
Definition new.php:143
htmlPrintOnlineHeader($mysoc, $langs, $showlogo=1, $alttext='', $subimageconst='', $altlogo1='', $altlogo2='')
Show the header of a company in HTML public pages.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formatted messages to output (Used to show messages on html output).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formatted error messages to output (Used to show messages on html output).
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...
top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs=array(), $arrayofcss=array(), $disableforlogin=0, $disablenofollow=0, $disablenoindex=0)
Output html header of a page.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
checkNbPostsForASpeceificIp($object, $nb_post_max)
Check if the object exceeded the number of posts for a specific ip in the same week.
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.