dolibarr 23.0.3
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-2025 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$object = new Societe($db);
104$user->loadDefaultValues();
105
106$extrafields->fetch_name_optionals_label($object->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 $societe->ip = getUserRemoteIP();
211
212 // Fill array 'array_options' with data from add form
213 /*
214 $extrafields->fetch_name_optionals_label($societe->table_element);
215 $ret = $extrafields->setOptionalsFromPost(null, $societe);
216 if ($ret < 0) {
217 $error++;
218 $errmsg .= $societe->error;
219 }
220 */
221
222 $nb_post_max = getDolGlobalInt("MAIN_SECURITY_MAX_POST_ON_PUBLIC_PAGES_BY_IP_ADDRESS", 200);
223
224 if (checkNbPostsForASpeceificIp($societe, $nb_post_max) <= 0) {
225 $error++;
226 $errmsg .= implode('<br>', $societe->errors);
227 }
228
229 if (!$error) {
230 $result = $societe->create($user);
231 if ($result > 0) {
232 require_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
233 $object = $societe;
234
235 if (!empty($backtopage)) {
236 $urlback = $backtopage;
237 } elseif (getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION')) {
238 $urlback = getDolGlobalString('MEMBER_URL_REDIRECT_SUBSCRIPTION');
239 // TODO Make replacement of __AMOUNT__, etc...
240 } else {
241 $urlback = $_SERVER["PHP_SELF"] . "?action=added&token=" . newToken();
242 }
243 } else {
244 $error++;
245 $errmsg .= implode('<br>', $societe->errors);
246 }
247 }
248 }
249
250 if (!$error) {
251 $db->commit();
252
253 header("Location: " . $urlback);
254 exit;
255 } else {
256 $db->rollback();
257 $action = "create";
258 }
259}
260
261// Action called after a submitted was send and prospect created successfully
262// 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.
263// backtopage parameter with an url was set on prospect submit page, we never go here because a redirect was done to this url.
264
265if (empty($reshook) && $action == 'added') { // Test on permission not required here
266 llxHeaderVierge("newSocieteAdded");
267
268 // If we have not been redirected
269 print '<br><br>';
270 print '<div class="center">';
271 print $langs->trans("newSocieteAdded");
272 print '</div>';
273
275 exit;
276}
277
278
279
280/*
281 * View
282 */
283
284$form = new Form($db);
285$formcompany = new FormCompany($db);
286$adht = new AdherentType($db);
287$formadmin = new FormAdmin($db);
288
289
290llxHeaderVierge($langs->trans("ContactUs"));
291
292print '<br>';
293print load_fiche_titre(img_picto('', 'member_nocolor', 'class="pictofixedwidth"') . ' &nbsp; ' . $langs->trans("ContactUs"), '', '', 0, '', 'center');
294
295
296print '<div align="center">';
297print '<div id="divsubscribe">';
298
299print '<div class="center subscriptionformhelptext opacitymedium justify">';
300if (getDolGlobalString('COMPANY_NEWFORM_TEXT')) {
301 print $langs->trans(getDolGlobalString('COMPANY_NEWFORM_TEXT')) . "<br>\n";
302} else {
303 print $langs->trans("ContactUsDesc", getDolGlobalString("MAIN_INFO_SOCIETE_MAIL")) . "<br>\n";
304}
305print '</div>';
306
307dol_htmloutput_errors($errmsg);
309
310// Print form
311print '<form action="' . $_SERVER["PHP_SELF"] . '" method="POST" name="newprospect">' . "\n";
312print '<input type="hidden" name="token" value="' . newToken() . '" / >';
313print '<input type="hidden" name="entity" value="' . $entity . '" />';
314print '<input type="hidden" name="action" value="add" />';
315print '<br>';
316
317$messagemandatory = '<span class="">' . $langs->trans("FieldsWithAreMandatory", '*') . '</span>';
318//print '<br><span class="opacitymedium">'.$langs->trans("FieldsWithAreMandatory", '*').'</span><br>';
319//print $langs->trans("FieldsWithIsForPublic",'**').'<br>';
320
321print dol_get_fiche_head();
322
323print '<script type="text/javascript">
324jQuery(document).ready(function () {
325 jQuery(document).ready(function () {
326 function initmorphy()
327 {
328 console.log("Call initmorphy");
329 if (jQuery("#morphy").val() == \'phy\') {
330 jQuery("#trcompany").hide();
331 }
332 if (jQuery("#morphy").val() == \'mor\') {
333 jQuery("#trcompany").show();
334 }
335 }
336 initmorphy();
337 jQuery("#morphy").change(function() {
338 initmorphy();
339 });
340 jQuery("#selectcountry_id").change(function() {
341 document.newprospect.action.value="create";
342 document.newprospect.submit();
343 });
344 jQuery("#typeid").change(function() {
345 document.newprospect.action.value="create";
346 document.newprospect.submit();
347 });
348 });
349});
350</script>';
351
352
353print '<table class="border" summary="form to subscribe" id="tablesubscribe">' . "\n";
354//Third party name
355/*
356if ($object->particulier || $private) {
357 print '<span id="TypeName" class="fieldrequired">'.$langs->trans('ThirdPartyName').' / '.$langs->trans('LastName', 'name').'</span>';
358} else {
359 print '<span id="TypeName" class="fieldrequired">'.$form->editfieldkey('ThirdPartyName', 'name', '', $object, 0).'</span>';
360}
361*/
362print '<tr class="tr-field-thirdparty-name"><td class="titlefieldcreate">'; // text appreas left
363print '<input type="hidden" name="ThirdPartyName" value="' . $langs->trans('ThirdPartyName') . '">';
364print '<span id="TypeName" class="fieldrequired" title="' .dol_escape_htmltag($langs->trans("FieldsWithAreMandatory", '*')) . '" >' . $form->editfieldkey('Company', 'name', '', $object, 0) . '<span class="star"> *</span></span>';
365print '</td><td>'; // inline input
366print '<input type="text" class="minwidth300" maxlength="128" name="name" id="name" value="' . dol_escape_htmltag($object->name) . '" autofocus="autofocus">';
367//
368
369// Name and lastname
370print '<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";
371
372print '<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";
373
374// Address
375print '<tr><td class="tdtop">';
376print $form->editfieldkey('Address', 'address', '', $object, 0);
377print '</td>';
378print '<td>';
379print '<textarea name="address" id="address" class="quatrevingtpercent" rows="' . ROWS_2 . '" wrap="soft">';
380print dol_escape_htmltag($object->address, 0, 1);
381print '</textarea>';
382print $form->widgetForTranslation("address", $object, $permissiontoadd, 'textarea', 'alphanohtml', 'quatrevingtpercent');
383print '</td></tr>';
384
385// Country
386print '<tr><td>' . $form->editfieldkey('Country', 'selectcountry_id', '', $object, 0) . '</td><td class="maxwidthonsmartphone">';
387print img_picto('', 'country', 'class="pictofixedwidth"');
388print $form->select_country((GETPOSTISSET('country_id') ? GETPOST('country_id') : $object->country_id), 'country_id', '', 0, 'minwidth300 maxwidth500 widthcentpercentminusx');
389if ($user->admin) {
390 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
391}
392print '</td></tr>';
393
394// Phone / Fax
395print '<tr><td>' . $form->editfieldkey('Phone', 'phone', '', $object, 0) . '</td>';
396print '<td>' . img_picto('', 'object_phoning', 'class="pictofixedwidth"') . ' <input type="text" name="phone" id="phone" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('phone') ? GETPOST('phone', 'alpha') : $object->phone) . '"></td>';
397print '</tr>';
398
399print '<tr>';
400print '<td>' . $form->editfieldkey('Fax', 'fax', '', $object, 0) . '</td>';
401print '<td>' . img_picto('', 'object_phoning_fax', 'class="pictofixedwidth"') . ' <input type="text" name="fax" id="fax" class="maxwidth200 widthcentpercentminusx" value="' . (GETPOSTISSET('fax') ? GETPOST('fax', 'alpha') : $object->fax) . '"></td>';
402print '</tr>';
403
404// Email / Web
405print '<tr><td>' . $form->editfieldkey('EMail', 'email', '', $object, 0, 'string', '', !getDolGlobalString('SOCIETE_EMAIL_MANDATORY') ? '' : $conf->global->SOCIETE_EMAIL_MANDATORY) . '</td>';
406print '<td>' . img_picto('', 'object_email', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth200 widthcentpercentminusx" name="email" id="email" value="' . $object->email . '"></td>';
407if (isModEnabled('mailing') && getDolGlobalString('THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION')) {
408 if ($conf->browser->layout == 'phone') {
409 print '</tr><tr>';
410 }
411 print '<td class="individualline noemail">' . $form->editfieldkey($langs->trans('No_Email') . ' (' . $langs->trans('Contact') . ')', 'contact_no_email', '', $object, 0) . '</td>';
412 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($object->no_email) ? 0 : 1)), 1, false, 1) . '</td>';
413}
414print '</tr>';
415
416print '<tr><td>' . $form->editfieldkey('Web', 'url', '', $object, 0) . '</td>';
417print '<td>' . img_picto('', 'globe', 'class="pictofixedwidth"') . ' <input type="text" class="maxwidth500 widthcentpercentminusx" name="url" id="url" value="' . $object->url . '"></td></tr>';
418
419
420// Comments
421print '<tr>';
422print '<td class="tdtop">' . $langs->trans("Comments") . '</td>';
423print '<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>';
424print '</tr>' . "\n";
425
426
427// Other attributes
428$parameters['tpl_context'] = 'public'; // define template context to public
429include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
430
431
432// TODO Move this into generic feature.
433
434// Display Captcha code if is enabled
435if (getDolGlobalString('MAIN_SECURITY_ENABLECAPTCHA_THIRDPARTY')) {
436 require_once DOL_DOCUMENT_ROOT . '/core/lib/security2.lib.php';
437 print '<tr><td class="titlefield"><label for="email"><span class="fieldrequired">' . $langs->trans("SecurityCode") . '</span></label></td><td>';
438 print '<span class="span-icon-security inline-block">';
439 print '<input id="securitycode" placeholder="' . $langs->trans("SecurityCode") . '" class="flat input-icon-security width150" type="text" maxlength="5" name="code" tabindex="3" />';
440 print '</span>';
441 print '<span class="nowrap inline-block">';
442 print '<img class="inline-block valignmiddle" src="' . DOL_URL_ROOT . '/core/antispamimage.php" border="0" width="80" height="32" id="img_securitycode" />';
443 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>';
444 print '</span>';
445 print '</td></tr>';
446}
447
448print "</table>\n";
449
450print dol_get_fiche_end();
451
452// Save / Submit
453print '<div class="center">';
454print '<input type="submit" value="' . $langs->trans("Send") . '" id="submitsave" class="button">';
455if (!empty($backtopage)) {
456 print ' &nbsp; &nbsp; <input type="submit" value="' . $langs->trans("Cancel") . '" id="submitcancel" class="button button-cancel">';
457}
458print '</div>';
459
460
461print "</form>\n";
462print "<br>";
463print '</div></div>';
464
465
466
468
469$db->close();
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
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.
global $mysoc
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.
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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.
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.