dolibarr 24.0.0-beta
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2005-2021 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2017 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2011 Herve Prot <herve.prot@symeos.com>
6 * Copyright (C) 2012 Florian Henry <florian.henry@open-concept.pro>
7 * Copyright (C) 2018 Juanjo Menent <jmenent@2byte.es>
8 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2024-2026 Frédéric France <frederic.france@free.fr>
10 * Copyright (C) 2025 Charlene Benke <charlene@patas-monkey.com>
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
31// Load Dolibarr environment
32require '../../main.inc.php';
42require_once DOL_DOCUMENT_ROOT.'/user/class/usergroup.class.php';
43require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php';
44require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
45require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
46
47// Define if user can read permissions
48$permissiontoadd = ($user->admin || $user->hasRight("user", "user", "write"));
49$permissiontoread = ($user->admin || $user->hasRight("user", "user", "read"));
50$permissiontoedit = ($user->admin || $user->hasRight("user", "user", "write"));
51$permissiontodisable = ($user->admin || $user->hasRight("user", "user", "delete"));
52$feature2 = 'user';
53
54// Advanced permissions
55$advancedpermsactive = false;
56if (getDolGlobalString('MAIN_USE_ADVANCED_PERMS')) {
57 $advancedpermsactive = true;
58 $permissiontoread = ($user->admin || ($user->hasRight("user", "group_advance", "read") && $user->hasRight("user", "group_advance", "readperms")));
59 $permissiontoedit = ($user->admin || $user->hasRight("user", "group_advance", "write"));
60 $permissiontodisable = ($user->admin || $user->hasRight("user", "group_advance", "delete"));
61 $feature2 = 'group_advance';
62}
63
64// Load translation files required by page
65$langs->loadLangs(array('users', 'other'));
66
67$id = GETPOSTINT('id');
68$action = GETPOST('action', 'aZ09');
69$cancel = GETPOST('cancel');
70$confirm = GETPOST('confirm', 'alpha');
71$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'groupcard'; // To manage different context of search
72$backtopage = GETPOST('backtopage', 'alpha');
73
74$userid = GETPOSTINT('user');
75
76$object = new UserGroup($db);
77
78// fetch optionals attributes and labels
79$extrafields->fetch_name_optionals_label($object->table_element);
80
81// Load object
82include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be 'include', not 'include_once'.
83$object->loadRights();
84
85// Initialize a technical object to manage hooks. Note that conf->hooks_modules contains array
86$hookmanager->initHooks(array('groupcard', 'globalcard'));
87
88// Security check
89$result = restrictedArea($user, 'user', $id, 'usergroup&usergroup', $feature2);
90
91// Users/Groups management only in master entity if transverse mode
92if (isModEnabled('multicompany') && $conf->entity > 1 && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
94}
95
96
101$error = 0;
102$parameters = array('id' => $id, 'userid' => $userid, 'caneditperms' => $permissiontoedit);
103$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
104if ($reshook < 0) {
105 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
106}
107
108if (empty($reshook)) {
109 $backurlforlist = DOL_URL_ROOT.'/user/group/list.php';
110
111 if (empty($backtopage) || ($cancel && empty($id))) {
112 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
113 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
114 $backtopage = $backurlforlist;
115 } else {
116 $backtopage = DOL_URL_ROOT.'/user/group/card.php?id='.($id > 0 ? $id : '__ID__');
117 }
118 }
119 }
120
121 if ($cancel) {
122 header("Location: ".$backtopage);
123 exit;
124 }
125
126 // Action remove group
127 if ($action == 'confirm_delete' && $confirm == "yes" && $permissiontoedit) {
128 $object->fetch($id);
129 $object->delete($user);
130 header("Location: ".DOL_URL_ROOT."/user/group/list.php?restore_lastsearch_values=1");
131 exit;
132 }
133
134 // Action add group
135 if ($action == 'add' && $permissiontoedit) {
136 if (!GETPOST("nom", "alphanohtml")) {
137 setEventMessages($langs->trans("NameNotDefined"), null, 'errors');
138 $action = "create"; // Go back to create page
139 } else {
140 $object->name = GETPOST("nom", 'alphanohtml');
141 $object->note = dol_htmlcleanlastbr(trim(GETPOST("note", 'restricthtml')));
142 $object->color = GETPOST("color", 'alphanohtml');
143
144 // Fill array 'array_options' with data from add form
145 $ret = $extrafields->setOptionalsFromPost(null, $object);
146 if ($ret < 0) {
147 $error++;
148 }
149
150 if (isModEnabled('multicompany') && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
151 $object->entity = 0;
152 } else {
153 if ($conf->entity == 1 && $user->admin && !$user->entity) { // Same permissions test than the one used to show the combo of entities into the form
154 $object->entity = GETPOSTISSET("entity") ? GETPOST("entity") : $conf->entity;
155 } else {
156 $object->entity = $conf->entity;
157 }
158 }
159
160 $db->begin();
161
162 $id = $object->create();
163
164 if ($id > 0) {
165 $db->commit();
166
167 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
168 exit;
169 } else {
170 $db->rollback();
171
172 $langs->load("errors");
173 setEventMessages($langs->trans("ErrorGroupAlreadyExists", $object->name), null, 'errors');
174 $action = "create"; // Go back to create page
175 }
176 }
177 }
178
179 // Add/Remove user into group
180 if (($action == 'adduser' || $action == 'removeuser') && $permissiontoedit) {
181 if ($userid > 0) {
182 $object->fetch($id);
183 $object->oldcopy = clone $object; // @phan-suppress-current-line PhanTypeMismatchProperty
184
185 $edituser = new User($db);
186 $edituser->fetch($userid);
187 if ($action == 'adduser') { // Test on permission already done
188 $result = $edituser->SetInGroup($object->id, $object->entity);
189 }
190 if ($action == 'removeuser') { // Test on permission already done
191 $result = $edituser->RemoveFromGroup($object->id, $object->entity);
192 }
193
194 if ($result > 0) {
195 header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
196 exit;
197 } else {
198 setEventMessages($edituser->error, $edituser->errors, 'errors');
199 }
200 }
201 }
202
203
204 if ($action == 'update' && $permissiontoedit) {
205 $db->begin();
206
207 $object->fetch($id);
208
209 $object->oldcopy = clone $object; // @phan-suppress-current-line PhanTypeMismatchProperty
210
211 $object->name = GETPOST("nom", 'alphanohtml');
212 $object->note = dol_htmlcleanlastbr(trim(GETPOST("note", 'restricthtml')));
213 $object->color = GETPOST("color", 'alphanohtml');
214 $object->tms = dol_now();
215
216 // Fill array 'array_options' with data from add form
217 $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
218 if ($ret < 0) {
219 $error++;
220 }
221
222 if (isModEnabled('multicompany') && getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE')) {
223 $object->entity = 0;
224 } elseif (GETPOSTISSET("entity")) {
225 $object->entity = GETPOSTINT("entity");
226 }
227
228 $ret = $object->update();
229
230 if ($ret >= 0 && !count($object->errors)) {
231 setEventMessages($langs->trans("GroupModified"), null, 'mesgs');
232 $db->commit();
233 } else {
234 setEventMessages($object->error, $object->errors, 'errors');
235 $db->rollback();
236 }
237 }
238
239 // Actions to build doc
240 $upload_dir = $conf->user->dir_output.'/usergroups';
241 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
242}
243
244
245/*
246 * View
247 */
248
249$title = $object->name.' - '.$langs->trans("Card");
250if ($action == 'create') {
251 $title = $langs->trans("NewGroup");
252}
253$help_url = "";
254llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-user page-group_card');
255
256
257$form = new Form($db);
258$fuserstatic = new User($db);
259$form = new Form($db);
260$formfile = new FormFile($db);
261$formother = new FormOther($db);
262
263if ($action == 'create') {
264 print load_fiche_titre($langs->trans("NewGroup"), '', 'object_group');
265
266 dol_set_focus('#nom');
267
268 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
269 print '<input type="hidden" name="token" value="'.newToken().'">';
270 print '<input type="hidden" name="action" value="add">';
271 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
272
273 print dol_get_fiche_head(array(), '', '', 0, '');
274
275 print '<table class="border centpercent tableforfieldcreate">';
276
277 // Multicompany
278 if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
279 if (!getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE') && $conf->entity == 1 && $user->admin && !$user->entity) {
280 print "<tr>".'<td class="tdtop">'.$langs->trans("Entity").'</td>';
281 print "<td>".$mc->select_entities($conf->entity);
282 print "</td></tr>\n";
283 } else {
284 print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
285 }
286 }
287
288 unset($object->fields['color']);
289
290 // Common attributes
291 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_add.tpl.php';
292
293 print '<tr><td>'.$langs->trans("ColorGroup").'</td>';
294 print '<td>';
295 print $formother->selectColor(GETPOSTISSET('color') ? GETPOST('color', 'alphanohtml') : $object->color, 'color', null, 1, array(), 'hideifnotset');
296 print '</td></tr>';
297
298 // Other attributes
299 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
300
301 print "</table>\n";
302
303 print dol_get_fiche_end();
304
305 print '<div class="center">';
306 print '<input class="button" name="add" value="'.$langs->trans("CreateGroup").'" type="submit">';
307 print ' &nbsp; ';
308 print '<input class="button button-cancel" value="'.$langs->trans("Cancel").'" name="cancel" type="submit">';
309 print '</div>';
310
311 print "</form>";
312} else {
313 if ($id) {
314 $head = group_prepare_head($object);
315 $title = $langs->trans("Group");
316
317 /*
318 * Deletion confirmation
319 */
320 if ($action == 'delete') {
321 print $form->formconfirm($_SERVER['PHP_SELF']."?id=".$object->id, $langs->trans("DeleteAGroup"), $langs->trans("ConfirmDeleteGroup", $object->name), "confirm_delete", '', 0, 1);
322 }
323
324 /*
325 * Card in view mode
326 */
327
328 if ($action != 'edit') {
329 print dol_get_fiche_head($head, 'group', $title, -1, 'group');
330
331 $linkback = '<a href="'.DOL_URL_ROOT.'/user/group/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
332
333 dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin);
334
335 print '<div class="fichecenter">';
336 print '<div class="fichehalfleft">';
337
338 print '<div class="underbanner clearboth"></div>';
339
340 print '<table class="border centpercent tableforfield">';
341
342 // Name (already in dol_banner, we keep it to have the GlobalGroup picto, but we should move it in dol_banner)
343 if (isModEnabled('multicompany')) {
344 print '<tr><td class="titlefield">'.$langs->trans("Name").'</td>';
345 print '<td class="valeur">'.dol_escape_htmltag($object->name);
346 if (empty($object->entity)) {
347 print img_picto($langs->trans("GlobalGroup"), 'superadmin');
348 }
349 print "</td></tr>\n";
350 }
351
352 // Multicompany
353 if (isModEnabled('multicompany') && isset($mc) && is_object($mc) && !getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE') && $conf->entity == 1 && $user->admin && !$user->entity) {
354 $mc->getInfo($object->entity);
355 print "<tr>".'<td class="titlefield">'.$langs->trans("Entity").'</td>';
356 print '<td class="valeur">'.dol_escape_htmltag($mc->label);
357 print "</td></tr>\n";
358 }
359
360 unset($object->fields['nom']); // Name already displayed in banner
361 unset($object->fields['color']);
362
363 // Common attributes
364 $keyforbreak = '';
365 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_view.tpl.php';
366
367 print '<tr><td>'.$langs->trans("ColorGroup").'</td>';
368 print '<td>';
369 print $formother->showColor($object->color, '');
370 print '</td></tr>';
371
372 // Other attributes
373 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
374
375 print '</table>';
376 print '</div>';
377 print '</div>';
378
379 print '<div class="clearboth"></div>';
380
381 print dol_get_fiche_end();
382
383
384 /*
385 * Action bar
386 */
387 print '<div class="tabsAction">';
388
389 $parameters = array();
390 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
391 if ($reshook < 0) {
392 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
393 }
394
395 if ($permissiontoedit) {
396 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=edit&token='.newToken().'">'.$langs->trans("Modify").'</a>';
397 }
398
399 if ($permissiontodisable) {
400 print '<a class="butActionDelete" href="'.$_SERVER['PHP_SELF'].'?action=delete&token='.newToken().'&id='.$object->id.'">'.$langs->trans("DeleteGroup").'</a>';
401 }
402
403 print "</div>\n";
404
405 // List users in group
406
407 print load_fiche_titre($langs->trans("ListOfUsersInGroup"), '', 'user');
408
409 // Select the users that do not belong to the group yet
410 $exclude = array();
411
412 if (!empty($object->members)) {
413 foreach ($object->members as $useringroup) {
414 $exclude[] = $useringroup->id;
415 }
416 }
417
418 // Other form for add user to group
419 $parameters = array('caneditperms' => $permissiontoedit, 'exclude' => $exclude);
420 $reshook = $hookmanager->executeHooks('formAddUserToGroup', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
421 print $hookmanager->resPrint;
422
423 if (empty($reshook)) {
424 if ($permissiontoedit) {
425 print '<form action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'" method="POST">'."\n";
426 print '<input type="hidden" name="token" value="'.newToken().'">';
427 print '<input type="hidden" name="action" value="adduser">';
428 print '<div class="div-table-responsive-no-min">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
429 print '<table class="noborder centpercent">'."\n";
430 print '<tr class="liste_titre"><td class="titlefield liste_titre">'.$langs->trans("NonAffectedUsers").'</td>'."\n";
431 print '<td class="liste_titre">';
432 print $form->select_dolusers('', 'user', 1, $exclude, 0, '', '', (string) $object->entity, 0, 0, '', 0, '', 'minwidth200 maxwidth500');
433 print ' &nbsp; ';
434 print '<input type="hidden" name="entity" value="'.$conf->entity.'">';
435 print '<input type="submit" class="button buttongen button-add" value="'.$langs->trans("Add").'">';
436 print '</td></tr>'."\n";
437 print '</table>';
438 print '</div>';
439 print '</form>'."\n";
440 //print '<br>';
441 }
442
443 /*
444 * Group members
445 */
446
447 print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
448 print '<table class="noborder centpercent">';
449 print '<tr class="liste_titre">';
450 print '<td class="liste_titre">'.$langs->trans("Login").'</td>';
451 print '<td class="liste_titre">'.$langs->trans("Lastname").'</td>';
452 print '<td class="liste_titre">'.$langs->trans("Firstname").'</td>';
453 print '<td class="liste_titre center" width="5">'.$langs->trans("Status").'</td>';
454 print '<td class="liste_titre right" width="5">&nbsp;</td>';
455 print "</tr>\n";
456
457 $object->fetch($object->id, '', true); // true to force load of all users, member of the group
458
459 if (!empty($object->members)) {
460 foreach ($object->members as $useringroup) {
461 print '<tr class="oddeven">';
462 print '<td class="tdoverflowmax150">';
463 print $useringroup->getNomUrl(-1, '', 0, 0, 24, 0, 'login');
464 if (isModEnabled('multicompany') && $useringroup->admin && empty($useringroup->entity)) {
465 print img_picto($langs->trans("SuperAdministratorDesc"), 'superadmin', 'class="valignmiddle paddingright paddingleft"');
466 } elseif ($useringroup->admin) {
467 print img_picto($langs->trans("AdministratorDesc"), 'admin', 'class="valignmiddle paddingright paddingleft"');
468 }
469 print '</td>';
470 print '<td>'.$useringroup->lastname.'</td>';
471 print '<td>'.$useringroup->firstname.'</td>';
472 print '<td class="center">'.$useringroup->getLibStatut(5).'</td>';
473 print '<td class="right">';
474 if (!empty($user->admin)) {
475 print '<a href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=removeuser&token='.newToken().'&user='.$useringroup->id.'">';
476 print img_picto($langs->trans("RemoveFromGroup"), 'unlink');
477 print '</a>';
478 } else {
479 print "-";
480 }
481 print "</td></tr>\n";
482 }
483 } else {
484 print '<tr><td colspan="6"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
485 }
486 print "</table>";
487 print '</div>';
488 }
489
490 print "<br>";
491
492 print '<div class="fichecenter"><div class="fichehalfleft">';
493
494 /*
495 * Generated documents
496 */
497
498 $filename = dol_sanitizeFileName($object->ref);
499 $filedir = $conf->user->dir_output."/usergroups/".dol_sanitizeFileName($object->ref);
500 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
501 $genallowed = $user->hasRight("user", "user", "write");
502 $delallowed = $user->hasRight("user", "user", "delete");
503
504 $somethingshown = $formfile->showdocuments('usergroup', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $mysoc->default_lang);
505
506 // Show links to link elements
507 $tmparray = $form->showLinkToObjectBlock($object, array(), array(), 1);
508 $linktoelem = $tmparray['linktoelem'];
509 $htmltoenteralink = $tmparray['htmltoenteralink'];
510 print $htmltoenteralink;
511
512 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
513
514 print '</div><div class="fichehalfright">';
515
516 // List of actions on element
517 /*include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
518 $formactions = new FormActions($db);
519 $somethingshown = $formactions->showactions($object, 'usergroup', $socid, 1, '', $MAXEVENT);*/
520
521 print '</div></div>';
522 }
523
524 /*
525 * Card in edit mode
526 */
527
528 if ($action == 'edit' && $permissiontoedit) {
529 print '<form action="'.$_SERVER['PHP_SELF'].'" method="post" name="updategroup" enctype="multipart/form-data">';
530 print '<input type="hidden" name="token" value="'.newToken().'">';
531 print '<input type="hidden" name="action" value="update">';
532 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
533 print '<input type="hidden" name="id" value="'.$object->id.'">';
534
535 print dol_get_fiche_head($head, 'group', $title, 0, 'group');
536
537 print '<table class="border centpercent tableforfieldedit">'."\n";
538
539 // Multicompany
540 if (isModEnabled('multicompany') && isset($mc) && is_object($mc)) {
541 if (!getDolGlobalString('MULTICOMPANY_TRANSVERSE_MODE') && $conf->entity == 1 && $user->admin && !$user->entity) {
542 print "<tr>".'<td class="tdtop">'.$langs->trans("Entity").'</td>';
543 print "<td>".$mc->select_entities($object->entity);
544 print "</td></tr>\n";
545 } else {
546 print '<input type="hidden" name="entity" value="'.$conf->entity.'" />';
547 }
548 }
549
550 unset($object->fields['color']);
551
552 // Common attributes
553 include DOL_DOCUMENT_ROOT.'/core/tpl/commonfields_edit.tpl.php';
554
555 print '<tr><td>'.$langs->trans("ColorGroup").'</td>';
556 print '<td>';
557 print $formother->selectColor(GETPOSTISSET('color') ? GETPOST('color', 'alphanohtml') : $object->color, 'color', null, 1, array(), 'hideifnotset');
558 print '</td></tr>';
559
560 // Other attributes
561 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
562
563 print '</table>';
564
565 print dol_get_fiche_end();
566
567 print $form->buttonsSaveCancel();
568
569 print '</form>';
570 }
571 }
572}
573
574// End of page
575llxFooter();
576$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to help generate other html components Only common components are here.
Class to manage user groups.
Class to manage Dolibarr users.
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
dol_now($mode='gmt')
Return date for now.
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.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
group_prepare_head($object)
Prepare array with list of tabs.