dolibarr  20.0.0-beta
skill_card.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) 2021 Gauthier VERDOL <gauthier.verdol@atm-consulting.fr>
4  * Copyright (C) 2021 Greg Rastklan <greg.rastklan@atm-consulting.fr>
5  * Copyright (C) 2021 Jean-Pascal BOUDET <jean-pascal.boudet@atm-consulting.fr>
6  * Copyright (C) 2021 Grégory BLEMAND <gregory.blemand@atm-consulting.fr>
7  * Copyright (C) 2023 Frédéric France <frederic.france@netlogic.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  */
22 
30 // Load Dolibarr environment
31 require '../main.inc.php';
32 require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
33 require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php';
34 require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php';
35 require_once DOL_DOCUMENT_ROOT . '/hrm/class/skill.class.php';
36 require_once DOL_DOCUMENT_ROOT . '/hrm/lib/hrm_skill.lib.php';
37 
38 
39 // Load translation files required by the page
40 $langs->loadLangs(array('hrm', 'other', 'products')); // why products?
41 
42 // Get parameters
43 $id = GETPOSTINT('id');
44 $ref = GETPOST('ref', 'alpha');
45 $action = GETPOST('action', 'aZ09');
46 $confirm = GETPOST('confirm', 'alpha');
47 $cancel = GETPOST('cancel', 'aZ09');
48 $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'skillcard'; // To manage different context of search
49 $backtopage = GETPOST('backtopage', 'alpha');
50 $backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
51 $lineid = GETPOSTINT('lineid');
52 
53 // Initialize technical objects
54 $object = new Skill($db);
55 $extrafields = new ExtraFields($db);
56 //$diroutputmassaction = $conf->hrm->dir_output.'/temp/massgeneration/'.$user->id;
57 $hookmanager->initHooks(array('skillcard', 'globalcard')); // Note that conf->hooks_modules contains array
58 
59 // Fetch optionals attributes and labels
60 $extrafields->fetch_name_optionals_label($object->table_element);
61 
62 $search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
63 
64 
65 // Initialize array of search criteria
66 $search_all = GETPOST("search_all", 'alpha');
67 $search = array();
68 foreach ($object->fields as $key => $val) {
69  if (GETPOST('search_' . $key, 'alpha')) {
70  $search[$key] = GETPOST('search_' . $key, 'alpha');
71  }
72 }
73 
74 if (empty($action) && empty($id) && empty($ref)) {
75  $action = 'view';
76 }
77 
78 // Load object
79 include DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php'; // Must be include, not include_once.
80 
81 // Permissions
82 $permissiontoread = $user->hasRight('hrm', 'all', 'read');
83 $permissiontoadd = $user->hasRight('hrm', 'all', 'write'); // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
84 $permissiontodelete = $user->hasRight('hrm', 'all', 'delete');
85 $upload_dir = $conf->hrm->multidir_output[isset($object->entity) ? $object->entity : 1] . '/skill';
86 
87 // Security check (enable the most restrictive one)
88 //if ($user->socid > 0) accessforbidden();
89 //if ($user->socid > 0) $socid = $user->socid;
90 //$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
91 //restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
92 if (empty($conf->hrm->enabled)) {
94 }
95 if (!$permissiontoread || ($action === 'create' && !$permissiontoadd)) {
97 }
98 
99 $MaxNumberSkill = getDolGlobalInt('HRM_MAXRANK', Skill::DEFAULT_MAX_RANK_PER_SKILL);
100 
101 
102 /*
103  * Actions
104  */
105 
106 $parameters = array();
107 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
108 if ($reshook < 0) {
109  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
110 }
111 
112 if (empty($reshook)) {
113  $error = 0;
114 
115  $backurlforlist = DOL_URL_ROOT.'/hrm/skill_list.php';
116 
117  if (empty($backtopage) || ($cancel && empty($id))) {
118  if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
119  if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
120  $backtopage = $backurlforlist;
121  } else {
122  $backtopage = DOL_URL_ROOT.'/hrm/skill_card.php?id=' . ($id > 0 ? $id : '__ID__');
123  }
124  }
125  }
126 
127  $triggermodname = 'HRM_SKILL_MODIFY'; // Name of trigger action code to execute when we modify record
128 
129 
130  // Actions cancel, add, update, update_extras, confirm_validate, confirm_delete, confirm_deleteline, confirm_clone, confirm_close, confirm_setdraft, confirm_reopen
131  $noback = 1;
132  include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php';
133 
134  // action update on Skilldet
135  $skilldetArray = GETPOST("descriptionline", "array:alphanohtml");
136 
137  if (!$error) {
138  if (is_array($skilldetArray) && count($skilldetArray) > 0) {
139  foreach ($skilldetArray as $key => $SkValueToUpdate) {
140  $skilldetObj = new Skilldet($object->db);
141  $res = $skilldetObj->fetch($key);
142  if ($res > 0) {
143  $skilldetObj->description = $SkValueToUpdate;
144  $resupd = $skilldetObj->update($user);
145  if ($resupd <= 0) {
146  setEventMessage($langs->trans('errorUpdateSkilldet'));
147  }
148  }
149  }
150  }
151  }
152 
153 
154  // Actions when linking object each other
155  include DOL_DOCUMENT_ROOT . '/core/actions_dellink.inc.php';
156 
157  // Actions when printing a doc from card
158  include DOL_DOCUMENT_ROOT . '/core/actions_printing.inc.php';
159 
160  // Action to move up and down lines of object
161  //include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php';
162 
163  // Action to build doc
164  include DOL_DOCUMENT_ROOT . '/core/actions_builddoc.inc.php';
165 
166  if ($action == 'set_thirdparty' && $permissiontoadd) {
167  $object->setValueFrom('fk_soc', GETPOSTINT('fk_soc'), '', '', 'date', '', $user, $triggermodname);
168  }
169  if ($action == 'classin' && $permissiontoadd) {
170  $object->setProject(GETPOSTINT('projectid'));
171  }
172 
173  // Actions to send emails
174  $triggersendname = 'HRM_SKILL_SENTBYMAIL';
175  $autocopy = 'MAIN_MAIL_AUTOCOPY_SKILL_TO';
176  $trackid = 'skill' . $object->id;
177  include DOL_DOCUMENT_ROOT . '/core/actions_sendmails.inc.php';
178 
179  if ($action == 'confirm_clone' && $confirm != 'yes') {
180  $action = '';
181  }
182 
183  if ($action == 'confirm_clone' && $confirm == 'yes' && $permissiontoadd) {
184  $id = $result->id;
185  header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id);
186  exit;
187  }
188 }
189 
190 
191 /*
192  * View
193  */
194 
195 $form = new Form($db);
196 $formfile = new FormFile($db);
197 $formproject = new FormProjets($db);
198 
199 $title = $langs->trans("Skill");
200 $help_url = '';
201 llxHeader('', $title, $help_url);
202 
203 
204 // Part to create
205 if ($action == 'create') {
206  print load_fiche_titre($langs->trans("NewSkill"), '', 'object_' . $object->picto);
207 
208  print '<form method="POST" action="' . $_SERVER["PHP_SELF"] . '">';
209  print '<input type="hidden" name="token" value="' . newToken() . '">';
210  print '<input type="hidden" name="action" value="add">';
211  $backtopage .= (strpos($backtopage, '?') > 0 ? '&' : '?') ."objecttype=job";
212  if ($backtopage) {
213  print '<input type="hidden" name="backtopage" value="' . $backtopage . '">';
214  }
215  if ($backtopageforcancel) {
216  print '<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel . '">';
217  }
218 
219  print dol_get_fiche_head(array(), '');
220 
221  print '<table class="border centpercent tableforfieldcreate">' . "\n";
222 
223  // Common attributes
224  include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_add.tpl.php';
225 
226  // Other attributes
227  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_add.tpl.php';
228 
229 
230  // SKILLDET ADD
231  //@todo je stop ici ... à continuer (affichage des 5 skilled input pour create action
232  //print $object->showInputField($val, $key, $value, '', '['']', '', 0);
233 
234  print '</table>' . "\n";
235 
236  print dol_get_fiche_end();
237 
238  print '<div class="center">';
239  print '<input type="submit" class="button" name="add" value="' . dol_escape_htmltag($langs->trans("Create")) . '">';
240  print '&nbsp; ';
241 
242  print '<input type="' . ($backtopage ? "submit" : "button") . '" class="button button-cancel" name="cancel" value="' . dol_escape_htmltag($langs->trans("Cancel")) . '"' . ($backtopage ? '' : ' onclick="history.go(-1)"') . '>'; // Cancel for create does not post form if we don't know the backtopage
243  print '</div>';
244 
245  print '</form>';
246 
247  //dol_set_focus('input[name="ref"]');
248 }
249 
250 // Part to edit record
251 // and skilldet edition
252 if (($id || $ref) && $action == 'edit') {
253  print load_fiche_titre($langs->trans("Skill"), '', 'object_' . $object->picto);
254 
255  print '<form method="POST" action="' . $_SERVER["PHP_SELF"] . '">';
256  print '<input type="hidden" name="token" value="' . newToken() . '">';
257  print '<input type="hidden" name="action" value="update">';
258  print '<input type="hidden" name="id" value="' . $object->id . '">';
259  if ($backtopage) {
260  print '<input type="hidden" name="backtopage" value="' . $backtopage . '">';
261  }
262  if ($backtopageforcancel) {
263  print '<input type="hidden" name="backtopageforcancel" value="' . $backtopageforcancel . '">';
264  }
265 
266  print dol_get_fiche_head();
267 
268  print '<table class="border centpercent tableforfieldedit">' . "\n";
269 
270  // Common attributes
271  include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_edit.tpl.php';
272 
273  // Other attributes
274  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_edit.tpl.php';
275 
276  print '</table>';
277 
278  print '<hr>';
279 
280  // SKILLDET
281  $SkilldetRecords = $object->fetchLines();
282 
283  if (is_array($SkilldetRecords) && count($SkilldetRecords) == 0) {
284  $object->createSkills(1);
285  }
286 
287  if (is_array($SkilldetRecords) && count($SkilldetRecords) > 0) {
288  print '<table>';
289  foreach ($SkilldetRecords as $sk) {
290  if ($sk->rankorder > $MaxNumberSkill) {
291  continue;
292  }
293 
294  print '<table class="border centpercent =">' . "\n";
295  $sk->fields = dol_sort_array($sk->fields, 'position');
296  foreach ($sk->fields as $key => $val) {
297  if (abs($val['visible']) != 1 && abs($val['visible']) != 3 && abs($val['visible']) != 4) {
298  continue;
299  }
300 
301  if (array_key_exists('enabled', $val) && isset($val['enabled']) && !verifCond($val['enabled'])) {
302  continue; // We don't want this field
303  }
304 
305  print '<tr class="field_' . $key . '"><td';
306  print ' class="titlefieldcreate';
307  if (isset($val['notnull']) && $val['notnull'] > 0) {
308  print ' fieldrequired';
309  }
310  if (preg_match('/^(text|html)/', $val['type'])) {
311  print ' tdtop';
312  }
313  print '">';
314  // if (!empty($val['help'])) {
315  // print $form->textwithpicto($langs->trans($val['label']), $langs->trans($val['help']));
316  // } else {
317  print $langs->trans($val['label']).'&nbsp;'.$langs->trans('rank').'&nbsp;'.$sk->rankorder;
318  // }
319  print '</td>';
320  print '<td class="valuefieldcreate">';
321  // if (!empty($val['picto'])) {
322  // print img_picto('', $val['picto'], '', false, 0, 0, '', 'pictofixedwidth');
323  // }
324  // if (in_array($val['type'], array('int', 'integer'))) {
325  // $value = GETPOSTISSET($key) ? GETPOST($key, 'int') : $sk->$key;
326  // } elseif ($val['type'] == 'double') {
327  // $value = GETPOSTISSET($key) ? price2num(GETPOST($key, 'alphanohtml')) : $sk->$key;
328  // } elseif (preg_match('/^(text|html)/', $val['type'])) {
329  // $tmparray = explode(':', $val['type']);
330  if (!empty($tmparray[1])) {
331  $check = $tmparray[1];
332  } else {
333  $check = 'restricthtml';
334  }
335 
336  $skilldetArray = GETPOST("descriptionline", "array");
337  if (empty($skilldetArray)) {
338  $value = GETPOSTISSET($key) ? GETPOST($key, $check) : $sk->$key;
339  } else {
340  $value=$skilldetArray[$sk->id];
341  }
342  //
343  // } elseif ($val['type'] == 'price') {
344  // $value = GETPOSTISSET($key) ? price2num(GETPOST($key)) : price2num($sk->$key);
345  // } else {
346  // $value = GETPOSTISSET($key) ? GETPOST($key, 'alpha') : $sk->$key;
347  // }
348  //var_dump($val.' '.$key.' '.$value);
349  if (!empty($val['noteditable'])) {
350  print $sk->showOutputField($val, $key, $value, '', '', '', 0);
351  } else {
353  print $sk->showInputField($val, $key, $value, "", "line[" . $sk->id . "]", "", "");
354  }
355  print '</td>';
356  print '</tr>';
357  }
358  }
359  print '</table>';
360  }
361 
362 
363  print dol_get_fiche_end();
364 
365  print '<div class="center"><input type="submit" class="button button-save" name="save" value="' . $langs->trans("Save") . '">';
366  print ' &nbsp; <input type="submit" class="button button-cancel" name="cancel" value="' . $langs->trans("Cancel") . '">';
367  print '</div>';
368 
369  print '</form>';
370 }
371 
372 
373 // Part to show record
374 if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) {
375  $res = $object->fetch_optionals();
376 
377  $head = skillPrepareHead($object);
378  print dol_get_fiche_head($head, 'card', $langs->trans("Workstation"), -1, $object->picto);
379 
380  $formconfirm = '';
381 
382  // Confirmation to delete
383  if ($action == 'delete') {
384  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteSkill'), $langs->trans('ConfirmDeleteObject'), 'confirm_delete', '', 0, 1);
385  }
386  // Confirmation to delete line
387  if ($action == 'deleteline') {
388  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id . '&lineid=' . $lineid, $langs->trans('DeleteLine'), $langs->trans('ConfirmDeleteLine'), 'confirm_deleteline', '', 0, 1);
389  }
390  // Confirmation clone
391  if ($action === 'clone') {
392  $formquestion = array(
393  array('type' => 'text', 'name' => 'clone_label', 'label' => $langs->trans("Label"), 'value' => $langs->trans("CopyOf").' '.$object->label),
394  );
395  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneAsk', $object->label), 'confirm_clone', $formquestion, 'yes', 1, 280);
396  }
397 
398  // Confirmation of action xxxx
399  if ($action == 'xxx') {
400  $formquestion = array();
401  /*
402  $forcecombo=0;
403  if ($conf->browser->name == 'ie') $forcecombo = 1; // There is a bug in IE10 that make combo inside popup crazy
404  $formquestion = array(
405  // 'text' => $langs->trans("ConfirmClone"),
406  // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
407  // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
408  // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1, 0, 0, '', 0, $forcecombo))
409  );
410  */
411  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220);
412  }
413 
414  // Call Hook formConfirm
415  $parameters = array('formConfirm' => $formconfirm, 'lineid' => $lineid);
416  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
417  if (empty($reshook)) {
418  $formconfirm .= $hookmanager->resPrint;
419  } elseif ($reshook > 0) {
420  $formconfirm = $hookmanager->resPrint;
421  }
422 
423  // Print form confirm
424  print $formconfirm;
425 
426 
427  // Object card
428  // ------------------------------------------------------------
429  $linkback = '<a href="' . DOL_URL_ROOT.'/hrm/skill_list.php?restore_lastsearch_values=1' . (!empty($socid) ? '&socid=' . $socid : '') . '">' . $langs->trans("BackToList") . '</a>';
430 
431 
432  $morehtmlref = '<div class="refid">';
433  $morehtmlref.= $object->label;
434  $morehtmlref .= '</div>';
435  dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'rowid', $morehtmlref);
436 
437 
438  print '<div class="fichecenter">';
439  print '<div class="fichehalfleft">';
440  print '<div class="underbanner clearboth"></div>';
441  print '<table class="border centpercent tableforfield">' . "\n";
442 
443  $object->fields['label']['visible']=0; // Already in banner
444  include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php';
445 
446  // Other attributes. Fields from hook formObjectOptions and Extrafields.
447  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
448 
449 
450  print '</table>';
451  print '</div>';
452  print '</div>';
453 
454  print '<div class="clearboth"></div>';
455 
456  print dol_get_fiche_end();
457 
458 
459  //dol_include_once('/hrm/tpl/hrm_skillde.fiche.tpl.php');
460 
461  // Buttons for actions
462 
463  if ($action != 'presend' && $action != 'editline') {
464  print '<div class="tabsAction">' . "\n";
465  $parameters = array();
466  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
467  if ($reshook < 0) {
468  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
469  }
470 
471  if (empty($reshook)) {
472  // Back to draft
473  if ($object->status == $object::STATUS_VALIDATED) {
474  print dolGetButtonAction($langs->trans('SetToDraft'), '', 'default', $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=confirm_setdraft&confirm=yes&token=' . newToken(), '', $permissiontoadd);
475  }
476 
477  print dolGetButtonAction($langs->trans('Modify'), '', 'default', $_SERVER["PHP_SELF"] . '?id=' . $object->id . '&action=edit&token=' . newToken(), '', $permissiontoadd);
478 
479  // Clone
480  if ($permissiontoadd) {
481  print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER["PHP_SELF"].'?action=clone&token='.newToken().'&id='.$object->id, '');
482  }
483  // Delete (need delete permission, or if draft, just need create/modify permission)
484  print dolGetButtonAction($langs->trans('Delete'), '', 'delete', $_SERVER['PHP_SELF'] . '?id=' . $object->id . '&action=delete&token=' . newToken(), '', $permissiontodelete);
485  }
486  print '</div>' . "\n";
487  }
488 }
489 
490 
491 //*---------------------------------------------------------------------------
492 
493 if ($action != "create" && $action != "edit") {
494  require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php';
495  require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php';
496  require_once DOL_DOCUMENT_ROOT . '/core/lib/company.lib.php';
497 
498  // load hrm libraries
499  require_once __DIR__ . '/class/skilldet.class.php';
500 
501  // for other modules
502  //dol_include_once('/othermodule/class/otherobject.class.php');
503 
504  $action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
505  $massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
506  $show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
507  $confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
508  $cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
509  $toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
510  $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'skilldetlist'; // To manage different context of search
511  $backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
512  $optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
513 
514  $id = GETPOSTINT('id');
515 
516  // Load variable for pagination
517  $limit = 0;
518  $sortfield = GETPOST('sortfield', 'aZ09comma');
519  $sortorder = GETPOST('sortorder', 'aZ09comma');
520  $page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
521  if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
522  // If $page is not defined, or '' or -1 or if we click on clear filters
523  $page = 0;
524  }
525  $offset = $limit * $page;
526  $pageprev = $page - 1;
527  $pagenext = $page + 1;
528 
529  // Initialize technical objects
530  $objectline = new Skilldet($db);
531  // $diroutputmassaction = $conf->hrm->dir_output . '/temp/massgeneration/' . $user->id;
532  // $hookmanager->initHooks(array('skilldetlist')); // Note that conf->hooks_modules contains array
533 
534  // Default sort order (if not yet defined by previous GETPOST)
535  if (!$sortfield) {
536  reset($objectline->fields); // Reset is required to avoid key() to return null.
537  $sortfield = "t." . key($objectline->fields); // Set here default search field. By default 1st field in definition.
538  }
539  if (!$sortorder) {
540  $sortorder = "ASC";
541  }
542 
543  // Initialize array of search criteria
544  $search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
545  $search = array();
546  foreach ($objectline->fields as $key => $val) {
547  if (GETPOST('search_' . $key, 'alpha') !== '') {
548  $search[$key] = GETPOST('search_' . $key, 'alpha');
549  }
550  if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
551  $search[$key . '_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_' . $key . '_dtstartmonth'), GETPOSTINT('search_' . $key . '_dtstartday'), GETPOSTINT('search_' . $key . '_dtstartyear'));
552  $search[$key . '_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_' . $key . '_dtendmonth'), GETPOSTINT('search_' . $key . '_dtendday'), GETPOSTINT('search_' . $key . '_dtendyear'));
553  }
554  }
555 
556  // List of fields to search into when doing a "search in all"
557  $fieldstosearchall = array();
558  foreach ($objectline->fields as $key => $val) {
559  if (!empty($val['searchall'])) {
560  $fieldstosearchall['t.' . $key] = $val['label'];
561  }
562  }
563 
564  // Definition of array of fields for columns
565  $arrayfields = array();
566  foreach ($objectline->fields as $key => $val) {
567  // If $val['visible']==0, then we never show the field
568  if (!empty($val['visible'])) {
569  $visible = (int) dol_eval($val['visible'], 1, 1, '1');
570  $arrayfields['t.' . $key] = array(
571  'label' => $val['label'],
572  'checked' => (($visible < 0) ? 0 : 1),
573  'enabled' => (abs($visible) != 3 && (int) dol_eval($val['enabled'], 1, 1, '1')),
574  'position' => $val['position'],
575  'help' => isset($val['help']) ? $val['help'] : ''
576  );
577  }
578  }
579 
580  $objectline->fields = dol_sort_array($objectline->fields, 'position');
581  $arrayfields = dol_sort_array($arrayfields, 'position');
582 
583 
584  /*
585  * View
586  */
587 
588  $form = new Form($db);
589 
590  $now = dol_now();
591 
592  $help_url = '';
593  $title = $langs->transnoentitiesnoconv("Skilldets");
594  $morejs = array();
595  $morecss = array();
596  $nbtotalofrecords = '';
597 
598  // Build and execute select
599  // --------------------------------------------------------------------
600  $sql = 'SELECT ';
601  $sql .= $objectline->getFieldList('t');
602  $sql .= " FROM " . MAIN_DB_PREFIX . $objectline->table_element . " as t";
603  if ($objectline->ismultientitymanaged == 1) {
604  $sql .= " WHERE t.entity IN (" . getEntity($objectline->element) . ")";
605  } else {
606  $sql .= " WHERE 1 = 1 ";
607  }
608  $sql .= " AND fk_skill = ".((int) $id);
609 
610  $resql = $db->query($sql);
611  $nbtotalofrecords = $db->num_rows($resql);
612  $num = $db->num_rows($resql);
613 
614  print '<form method="POST" id="searchFormList" action="' . $_SERVER["PHP_SELF"] . '">' . "\n";
615  if ($optioncss != '') {
616  print '<input type="hidden" name="optioncss" value="' . $optioncss . '">';
617  }
618  print '<input type="hidden" name="token" value="' . newToken() . '">';
619  print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
620  print '<input type="hidden" name="action" value="list">';
621  print '<input type="hidden" name="sortfield" value="' . $sortfield . '">';
622  print '<input type="hidden" name="sortorder" value="' . $sortorder . '">';
623  print '<input type="hidden" name="page" value="' . $page . '">';
624  print '<input type="hidden" name="contextpage" value="' . $contextpage . '">';
625  if (!empty($id)) {
626  print '<input type="hidden" name="id" value="' . $id . '">';
627  }
628 
629  $param_fk = "&fk_skill=" . $id . "&fk_user_creat=" . (!empty($user->rowid) ? $user->rowid : 0);
630  $backtopage = dol_buildpath('/hrm/skill_card.php', 1) . '?id=' . $id;
631  $param = "";
632  $massactionbutton = "";
633  //$newcardbutton = dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/hrm/skilldet_card.php', 1) . '?action=create&backtopage=' . urlencode($_SERVER['PHP_SELF']) . $param_fk . '&backtopage=' . $backtopage, '', $permissiontoadd);
634 
635  print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_' . $object->picto, 0, "", '', '', 0, 0, 1);
636 
637  // Add code for pre mass action (confirmation or email presend form)
638  $topicmail = "SendSkilldetRef";
639  $modelmail = "skilldet";
640  $objecttmp = new Skilldet($db);
641  $trackid = 'xxxx' . $object->id;
642  //include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
643 
644  if ($search_all) {
645  foreach ($fieldstosearchall as $key => $val) {
646  $fieldstosearchall[$key] = $langs->trans($val);
647  }
648  print '<div class="divsearchfieldfilter">' . $langs->trans("FilterOnInto", $search_all) . implode(', ', $fieldstosearchall) . '</div>';
649  }
650 
651  $moreforfilter = '';
652  /*$moreforfilter.='<div class="divsearchfield">';
653  $moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
654  $moreforfilter.= '</div>';*/
655 
656  $parameters = array();
657  $reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $objectline); // Note that $action and $objectline may have been modified by hook
658  if (empty($reshook)) {
659  $moreforfilter .= $hookmanager->resPrint;
660  } else {
661  $moreforfilter = $hookmanager->resPrint;
662  }
663 
664  if (!empty($moreforfilter)) {
665  print '<div class="liste_titre liste_titre_bydiv centpercent">';
666  print $moreforfilter;
667  print '</div>';
668  }
669 
670  $varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
671  // $selectedfields = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields
672  // $selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
673 
674  print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
675  print '<table class="tagtable nobottomiftotal liste' . ($moreforfilter ? " listwithfilterbefore" : "") . '">' . "\n";
676 
677 
678  // Fields title label
679  // --------------------------------------------------------------------
680  print '<tr class="liste_titre">';
681  foreach ($objectline->fields as $key => $val) {
682  // $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
683  // if ($key == 'status') {
684  // $cssforfield .= ($cssforfield ? ' ' : '') . 'center';
685  // } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
686  // $cssforfield .= ($cssforfield ? ' ' : '') . 'center';
687  // } elseif (in_array($val['type'], array('timestamp'))) {
688  // $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap';
689  // } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
690  // $cssforfield .= ($cssforfield ? ' ' : '') . 'right';
691  // }
692  if (!empty($arrayfields['t.' . $key]['checked'])) {
693  print getTitleFieldOfList($arrayfields['t.' . $key]['label'], 0, $_SERVER['PHP_SELF'], 't.' . $key, '', $param, (!empty($cssforfield) ? 'class="' . $cssforfield . '"' : ''), $sortfield, $sortorder, (!empty($cssforfield) ? $cssforfield . ' ' : '')) . "\n";
694  }
695  }
696  //print '<td></td>';
697  print '<td></td>';
698  print '</tr>' . "\n";
699 
700 
701  // Display all ranks of skill
702  // --------------------------------------------------------------------
703 
704  $i = 0;
705  $totalarray = array();
706  $totalarray['nbfield'] = 0;
707  while ($i < ($limit ? min($num, $limit) : $num)) {
708  $obj = $db->fetch_object($resql);
709  if (empty($obj)) {
710  break; // Should not happen
711  }
712 
713  if ($obj->rankorder > $MaxNumberSkill) {
714  continue;
715  }
716 
717  // Store properties in $objectline
718  $objectline->setVarsFromFetchObj($obj);
719 
720  // Show here line of result
721  print '<tr class="oddeven">';
722  foreach ($objectline->fields as $key => $val) {
723  // $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
724  // if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
725  // $cssforfield .= ($cssforfield ? ' ' : '') . 'center';
726  // } elseif ($key == 'status') {
727  // $cssforfield .= ($cssforfield ? ' ' : '') . 'center';
728  // }
729  //
730  // if (in_array($val['type'], array('timestamp'))) {
731  // $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap';
732  // } elseif ($key == 'ref') {
733  // $cssforfield .= ($cssforfield ? ' ' : '') . 'nowrap';
734  // }
735  //
736  // if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
737  // $cssforfield .= ($cssforfield ? ' ' : '') . 'right';
738  // }
739  //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
740 
741  if (!empty($arrayfields['t.' . $key]['checked'])) {
742  print '<td' . (empty($cssforfield) ? '' : ' class="' . $cssforfield . '"') . '>';
743  if ($key == 'status') {
744  print $objectline->getLibStatut(5);
745  } elseif ($key == 'rowid') {
746  print $objectline->showOutputField($val, $key, $objectline->id, '');
747  // ajout pencil
748  print '<a class="timeline-btn" href="' . DOL_MAIN_URL_ROOT . '/comm/action/skilldet_card.php?action=edit&id=' . $objectline->id . '"><i class="fa fa-pencil" title="' . $langs->trans("Modify") . '" ></i></a>';
749  } else {
750  print $objectline->showOutputField($val, $key, $objectline->$key, '');
751  }
752  print '</td>';
753 
754 
755  if (!$i) {
756  $totalarray['nbfield']++;
757  }
758  if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
759  if (!$i) {
760  $totalarray['pos'][$totalarray['nbfield']] = 't.' . $key;
761  }
762  if (!isset($totalarray['val'])) {
763  $totalarray['val'] = array();
764  }
765  if (!isset($totalarray['val']['t.' . $key])) {
766  $totalarray['val']['t.' . $key] = 0;
767  }
768  $totalarray['val']['t.' . $key] += $objectline->$key;
769  }
770  }
771  }
772 
773 
774  // LINE EDITION | SUPPRESSION
775 
776  print '<td>';
777  print '</td>';
778 
779  // print '<td>';
780  // add pencil
781  //@todo change to proper call dol_
782  //print '<a class="timeline-btn" href="' . dol_buildpath("custom/hrm/skilldet_card.php?action=edit&id=" . $objectline->id, 1) . '"><i class="fa fa-pencil" title="' . $langs->trans("Modify") . '" ></i></a>';
783  // add trash
784  //@todo change to proper call dol_
785  //print '<a class="timeline-btn" href="'.dol_buildpath("custom/hrm/skilldet_card.php?action=delete&id=".$objectline->id,1) .'"><i class="fa fa-trash" title="'.$langs->trans("Delete").'" ></i></a>';
786  // print '</td>';
787 
788 
789  // Fields from hook
790  $parameters = array('arrayfields' => $arrayfields, 'object' => $objectline, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
791  $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $objectline); // Note that $action and $objectline may have been modified by hook
792  print $hookmanager->resPrint;
793  /*// Action column
794  print '<td class="nowrap center">';
795 
796  print '</td>';*/
797  if (!$i) {
798  $totalarray['nbfield']++;
799  }
800 
801  print '</tr>' . "\n";
802 
803  $i++;
804  }
805 
806 
807  // If no record found
808 
809  if ($num == 0) {
810  $colspan = 2;
811  foreach ($arrayfields as $key => $val) {
812  if (!empty($val['checked'])) {
813  $colspan++;
814  }
815  }
816  print '<tr><td colspan="' . $colspan . '"><span class="opacitymedium">' . $langs->trans("NoRecordFound") . '</span></td></tr>';
817  }
818 
819  if (!empty($resql)) {
820  $db->free($resql);
821  }
822 
823  $parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
824  $reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $objectline); // Note that $action and $objectline may have been modified by hook
825  print $hookmanager->resPrint;
826 
827  print '</table>' . "\n";
828  print '</div>' . "\n";
829 
830  print '</form>' . "\n";
831 
832  // if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
833  // $hidegeneratedfilelistifempty = 1;
834  // if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
835  // $hidegeneratedfilelistifempty = 0;
836  // }
837  //
838  // require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php';
839  // $formfile = new FormFile($db);
840  //
841  // // Show list of available documents
842  // $urlsource = $_SERVER['PHP_SELF'] . '?sortfield=' . $sortfield . '&sortorder=' . $sortorder;
843  // $urlsource .= str_replace('&amp;', '&', $param);
844  //
845  // $filedir = $diroutputmassaction;
846  // $genallowed = $permissiontoread;
847  // $delallowed = $permissiontoadd;
848  //
849  // print $formfile->showdocuments('massfilesarea_hrm', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
850  // }
851 
852  print '<div class="fichecenter"><div class="fichehalfleft">';
853 
854  // Show links to link elements
855  $linktoelem = $form->showLinkToObjectBlock($object, null, array('skill'));
856  $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
857 
858  print '</div><div class="fichehalfright">';
859 
860  $MAXEVENT = 10;
861 
862  $morehtmlcenter = dolGetButtonTitle($langs->trans('SeeAll'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/hrm/skill_agenda.php?id='.$object->id);
863 
864  // List of actions on element
865  include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php';
866  $formactions = new FormActions($db);
867  $somethingshown = $formactions->showactions($object, $object->element . '@' . $object->module, (is_object($object->thirdparty) ? $object->thirdparty->id : 0), 1, '', $MAXEVENT, '', $morehtmlcenter);
868 
869  print '</div></div>';
870 }
871 
872 // End of page
873 llxFooter();
874 $db->close();
if($user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition: card.php:58
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:55
llxFooter()
Empty footer.
Definition: wrapper.php:69
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class for Skill.
Definition: skill.class.php:37
Class for Skilldet.
if(isModEnabled('invoice') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&!getDolGlobalString('MAIN_USE_NEW_SUPPLIERMOD') && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') && $user->hasRight('tax', 'charges', 'lire')) if(isModEnabled('invoice') &&isModEnabled('order') && $user->hasRight("commande", "lire") &&!getDolGlobalString('WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER')) $sql
Social contributions to pay.
Definition: index.php:745
verifCond($strToEvaluate, $onlysimplestring='1')
Verify if condition in string is ok or not.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
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)
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by the value of a given key, which produces ascending (default) or descending out...
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
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...
skillPrepareHead($object)
Prepare array of tabs for Skill.
$formconfirm
if ($action == 'delbookkeepingyear') {
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.