dolibarr 21.0.0-alpha
skill_list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2007-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) 2024 Frédéric France <frederic.france@free.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
31require '../main.inc.php';
32
33require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
36
37// load module libraries
38require_once __DIR__.'/class/skill.class.php';
39
40// for other modules
41//dol_include_once('/othermodule/class/otherobject.class.php');
42
43// Load translation files required by the page
44$langs->loadLangs(array('hrm', 'other'));
45
46
47// Get Parameters
48$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'add', 'create', 'edit', 'update', 'view', ...
49$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
50$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
51$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
52$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
53$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list
54$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'skilllist'; // To manage different context of search
55$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
56$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
57$mode = GETPOST('mode', 'alpha'); // for mode view result
58
59$id = GETPOSTINT('id');
60
61// Load variable for pagination
62$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
63$sortfield = GETPOST('sortfield', 'aZ09comma');
64$sortorder = GETPOST('sortorder', 'aZ09comma');
65$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
66if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
67 // If $page is not defined, or '' or -1 or if we click on clear filters
68 $page = 0;
69}
70$offset = $limit * $page;
71$pageprev = $page - 1;
72$pagenext = $page + 1;
73
74// Initialize a technical objects
75$object = new Skill($db);
76$extrafields = new ExtraFields($db);
77$diroutputmassaction = $conf->hrm->dir_output.'/temp/massgeneration/'.$user->id;
78$hookmanager->initHooks(array('skilllist')); // Note that conf->hooks_modules contains array
79
80// Fetch optionals attributes and labels
81$extrafields->fetch_name_optionals_label($object->table_element);
82//$extrafields->fetch_name_optionals_label($object->table_element_line);
83
84$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
85
86// Default sort order (if not yet defined by previous GETPOST)
87if (!$sortfield) {
88 reset($object->fields); // Reset is required to avoid key() to return null.
89 $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
90}
91if (!$sortorder) {
92 $sortorder = "ASC";
93}
94
95// Initialize array of search criteria
96$search_all = GETPOST('search_all', 'alphanohtml') ? GETPOST('search_all', 'alphanohtml') : GETPOST('sall', 'alphanohtml');
97$search = array();
98foreach ($object->fields as $key => $val) {
99 if (GETPOST('search_'.$key, 'alpha') !== '') {
100 $search[$key] = GETPOST('search_'.$key, 'alpha');
101 }
102 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
103 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_'.$key.'_dtstartmonth'), GETPOSTINT('search_'.$key.'_dtstartday'), GETPOSTINT('search_'.$key.'_dtstartyear'));
104 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_'.$key.'_dtendmonth'), GETPOSTINT('search_'.$key.'_dtendday'), GETPOSTINT('search_'.$key.'_dtendyear'));
105 }
106}
107
108// List of fields to search into when doing a "search in all"
109$fieldstosearchall = array();
110foreach ($object->fields as $key => $val) {
111 if (!empty($val['searchall'])) {
112 $fieldstosearchall['t.'.$key] = $val['label'];
113 }
114}
115$parameters = array('fieldstosearchall'=>$fieldstosearchall);
116$reshook = $hookmanager->executeHooks('completeFieldsToSearchAll', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
117if ($reshook > 0) {
118 $fieldstosearchall = empty($hookmanager->resArray['fieldstosearchall']) ? array() : $hookmanager->resArray['fieldstosearchall'];
119} elseif ($reshook == 0) {
120 $fieldstosearchall = array_merge($fieldstosearchall, empty($hookmanager->resArray['fieldstosearchall']) ? array() : $hookmanager->resArray['fieldstosearchall']);
121}
122
123// Definition of array of fields for columns
124$arrayfields = array();
125foreach ($object->fields as $key => $val) {
126 // If $val['visible']==0, then we never show the field
127 if (!empty($val['visible'])) {
128 $visible = (int) dol_eval((string) $val['visible'], 1);
129 $arrayfields['t.'.$key] = array(
130 'label'=>$val['label'],
131 'checked'=>(($visible < 0) ? 0 : 1),
132 'enabled'=>(abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
133 'position'=>$val['position'],
134 'help'=> isset($val['help']) ? $val['help'] : ''
135 );
136 }
137}
138// Extra fields
139include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
140
141$object->fields = dol_sort_array($object->fields, 'position');
142$arrayfields = dol_sort_array($arrayfields, 'position');
143
144// Permissions
145$permissiontoread = $user->hasRight('hrm', 'all', 'read');
146$permissiontoadd = $user->hasRight('hrm', 'all', 'write');
147$permissiontodelete = $user->hasRight('hrm', 'all', 'delete');
148
149// Security check
150if (!isModEnabled('hrm')) {
151 accessforbidden('Module not enabled');
152}
153
154// Security check (enable the most restrictive one)
155if ($user->socid > 0) {
157}
158//if ($user->socid > 0) accessforbidden();
159//$socid = 0; if ($user->socid > 0) $socid = $user->socid;
160//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
161//restrictedArea($user, $object->element, $object->id, $object->table_element, '', 'fk_soc', 'rowid', $isdraft);
162//if (empty($conf->hrm->enabled)) accessforbidden();
163if (!$permissiontoread) {
165}
166
167
168
169/*
170 * Actions
171 */
172
173if (GETPOST('cancel', 'alpha')) {
174 $action = 'list';
175 $massaction = '';
176}
177if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
178 $massaction = '';
179}
180
181$parameters = array();
182$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
183if ($reshook < 0) {
184 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
185}
186
187if (empty($reshook)) {
188 // Selection of new fields
189 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
190
191 // Purge search criteria
192 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { // All tests are required to be compatible with all browsers
193 foreach ($object->fields as $key => $val) {
194 $search[$key] = '';
195 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
196 $search[$key.'_dtstart'] = '';
197 $search[$key.'_dtend'] = '';
198 }
199 }
200 $toselect = array();
201 $search_array_options = array();
202 }
203 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
204 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
205 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
206 }
207
208 // Mass actions
209 $objectclass = 'Skill';
210 $objectlabel = 'Skill';
211 $uploaddir = $conf->hrm->dir_output;
212 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
213}
214
215
216
217/*
218 * View
219 */
220
221$form = new Form($db);
222
223$now = dol_now();
224
225//$help_url="EN:Module_Skill|FR:Module_Skill_FR|ES:Módulo_Skill";
226$help_url = '';
227$title = $langs->trans("Skills");
228$morejs = array();
229$morecss = array();
230
231
232// Build and execute select
233// --------------------------------------------------------------------
234$sql = 'SELECT ';
235$sql .= $object->getFieldList('t');
236// Add fields from extrafields
237if (!empty($extrafields->attributes[$object->table_element]['label'])) {
238 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
239 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : '');
240 }
241}
242// Add fields from hooks
243$parameters = array();
244$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
245$sql .= $hookmanager->resPrint;
246$sql = preg_replace('/,\s*$/', '', $sql);
247//$sql .= ", COUNT(rc.rowid) as anotherfield";
248
249$sqlfields = $sql; // $sql fields to remove for count total
250
251$sql .= " FROM ".MAIN_DB_PREFIX.$object->table_element." as t";
252if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
253 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
254}
255// Add table from hooks
256$parameters = array();
257$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object); // Note that $action and $object may have been modified by hook
258$sql .= $hookmanager->resPrint;
259if ($object->ismultientitymanaged == 1) {
260 $sql .= " WHERE t.entity IN (".getEntity($object->element).")";
261} else {
262 $sql .= " WHERE 1 = 1";
263}
264foreach ($search as $key => $val) {
265 if (array_key_exists($key, $object->fields)) {
266 if ($key == 'status' && $search[$key] == -1) {
267 continue;
268 }
269 $mode_search = (($object->isInt($object->fields[$key]) || $object->isFloat($object->fields[$key])) ? 1 : 0);
270 if ((strpos($object->fields[$key]['type'], 'integer:') === 0) || (strpos($object->fields[$key]['type'], 'sellist:') === 0) || !empty($object->fields[$key]['arrayofkeyval'])) {
271 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($object->fields[$key]['arrayofkeyval']) || !array_key_exists('0', $object->fields[$key]['arrayofkeyval'])))) {
272 $search[$key] = '';
273 }
274 $mode_search = 2;
275 }
276 if ($search[$key] != '') {
277 $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
278 }
279 } else {
280 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
281 $columnName=preg_replace('/(_dtstart|_dtend)$/', '', $key);
282 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
283 if (preg_match('/_dtstart$/', $key)) {
284 $sql .= " AND t.".$db->escape($columnName)." >= '".$db->idate($search[$key])."'";
285 }
286 if (preg_match('/_dtend$/', $key)) {
287 $sql .= " AND t.".$db->escape($columnName)." <= '".$db->idate($search[$key])."'";
288 }
289 }
290 }
291 }
292}
293if ($search_all) {
294 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
295}
296
297//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
298// Add where from extra fields
299include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
300// Add where from hooks
301$parameters = array();
302$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
303$sql .= $hookmanager->resPrint;
304
305/* If a group by is required
306$sql .= " GROUP BY ";
307foreach($object->fields as $key => $val) {
308 $sql .= "t.".$db->escape($key).", ";
309}
310// Add fields from extrafields
311if (!empty($extrafields->attributes[$object->table_element]['label'])) {
312 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
313 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
314 }
315}
316// Add where from hooks
317$parameters = array();
318$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object); // Note that $action and $object may have been modified by hook
319$sql .= $hookmanager->resPrint;
320$sql = preg_replace('/,\s*$/', '', $sql);
321*/
322
323// Count total nb of records
324$nbtotalofrecords = '';
325if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
326 /* The fast and low memory method to get and count full list converts the sql into a sql count */
327 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
328 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
329 $resql = $db->query($sqlforcount);
330 if ($resql) {
331 $objforcount = $db->fetch_object($resql);
332 $nbtotalofrecords = $objforcount->nbtotalofrecords;
333 } else {
334 dol_print_error($db);
335 }
336
337 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
338 $page = 0;
339 $offset = 0;
340 }
341 $db->free($resql);
342}
343
344// Complete request and execute it with limit
345$sql .= $db->order($sortfield, $sortorder);
346if ($limit) {
347 $sql .= $db->plimit($limit + 1, $offset);
348}
349
350$resql = $db->query($sql);
351if (!$resql) {
352 dol_print_error($db);
353 exit;
354}
355
356$num = $db->num_rows($resql);
357
358
359// Direct jump if only one record found
360if ($num == 1 && getDolGlobalString('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
361 $obj = $db->fetch_object($resql);
362 $id = $obj->rowid;
363 header("Location: ".dol_buildpath('/hrm/skill_card.php', 1).'?id='.$id);
364 exit;
365}
366
367
368// Output page
369// --------------------------------------------------------------------
370
371llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'bodyforlist');
372
373$arrayofselected = is_array($toselect) ? $toselect : array();
374
375$param = '';
376if (!empty($mode)) {
377 $param .= '&mode='.urlencode($mode);
378}
379if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
380 $param .= '&contextpage='.urlencode($contextpage);
381}
382if ($limit > 0 && $limit != $conf->liste_limit) {
383 $param .= '&limit='.((int) $limit);
384}
385foreach ($search as $key => $val) {
386 if (is_array($search[$key])) {
387 foreach ($search[$key] as $skey) {
388 if ($skey != '') {
389 $param .= '&search_'.$key.'[]='.urlencode($skey);
390 }
391 }
392 } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
393 $param .= '&search_'.$key.'month='.(GETPOSTINT('search_'.$key.'month'));
394 $param .= '&search_'.$key.'day='.(GETPOSTINT('search_'.$key.'day'));
395 $param .= '&search_'.$key.'year='.(GETPOSTINT('search_'.$key.'year'));
396 } elseif ($search[$key] != '') {
397 $param .= '&search_'.$key.'='.urlencode($search[$key]);
398 }
399}
400if ($optioncss != '') {
401 $param .= '&optioncss='.urlencode($optioncss);
402}
403// Add $param from extra fields
404include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
405// Add $param from hooks
406$parameters = array('param' => &$param);
407$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object); // Note that $action and $object may have been modified by hook
408$param .= $hookmanager->resPrint;
409
410// List of mass actions available
411$arrayofmassactions = array(
412 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
413 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
414 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
415 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
416);
417if (!empty($permissiontodelete)) {
418 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
419}
420if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
421 $arrayofmassactions = array();
422}
423$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
424
425print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
426if ($optioncss != '') {
427 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
428}
429print '<input type="hidden" name="token" value="'.newToken().'">';
430print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
431print '<input type="hidden" name="action" value="list">';
432print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
433print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
434print '<input type="hidden" name="page" value="'.$page.'">';
435print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
436print '<input type="hidden" name="page_y" value="">';
437print '<input type="hidden" name="mode" value="'.$mode.'">';
438
439$newcardbutton = '';
440$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss'=>'reposition'));
441$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*mode=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss'=>'reposition'));
442$newcardbutton .= dolGetButtonTitleSeparator();
443$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/hrm/skill_card.php?action=create', '', $permissiontoadd);
444
445print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'object_'.$object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
446
447// Add code for pre mass action (confirmation or email presend form)
448$topicmail = "SendSkillRef";
449$modelmail = "skill";
450$objecttmp = new Skill($db);
451$trackid = 'xxxx'.$object->id;
452include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
453
454if ($search_all) {
455 $setupstring = '';
456 foreach ($fieldstosearchall as $key => $val) {
457 $fieldstosearchall[$key] = $langs->trans($val);
458 $setupstring .= $key."=".$val.";";
459 }
460 print '<!-- Search done like if HRM_SKILL_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
461 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
462}
463
464$moreforfilter = '';
465/*$moreforfilter.='<div class="divsearchfield">';
466$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
467$moreforfilter.= '</div>';*/
468
469$parameters = array();
470$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
471if (empty($reshook)) {
472 $moreforfilter .= $hookmanager->resPrint;
473} else {
474 $moreforfilter = $hookmanager->resPrint;
475}
476
477if (!empty($moreforfilter)) {
478 print '<div class="liste_titre liste_titre_bydiv centpercent">';
479 print $moreforfilter;
480 print '</div>';
481}
482
483$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
484$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
485$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
486$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
487
488print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
489print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
490
491
492// Fields title search
493// --------------------------------------------------------------------
494print '<tr class="liste_titre_filter">';
495// Action column
496if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
497 print '<td class="liste_titre maxwidthsearch center">';
498 $searchpicto = $form->showFilterButtons('left');
499 print $searchpicto;
500 print '</td>';
501}
502foreach ($object->fields as $key => $val) {
503 $searchkey = empty($search[$key]) ? '' : $search[$key];
504 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
505 if ($key == 'status') {
506 $cssforfield .= ($cssforfield ? ' ' : '').'center';
507 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
508 $cssforfield .= ($cssforfield ? ' ' : '').'center';
509 } elseif (in_array($val['type'], array('timestamp'))) {
510 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
511 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
512 $cssforfield .= ($cssforfield ? ' ' : '').'right';
513 }
514 if (!empty($arrayfields['t.'.$key]['checked'])) {
515 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
516 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
517 print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), $val['notnull'], 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
518 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
519 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
520 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
521 print '<div class="nowrap">';
522 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
523 print '</div>';
524 print '<div class="nowrap">';
525 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
526 print '</div>';
527 } elseif ($key == 'lang') {
528 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
529 $formadmin = new FormAdmin($db);
530 print $formadmin->select_language($search[$key], 'search_lang', 0, null, 1, 0, 0, 'minwidth100imp maxwidth125', 2);
531 } else {
532 print '<input type="text" class="flat maxwidth75" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
533 }
534 print '</td>';
535 }
536}
537// Extra fields
538include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
539
540// Fields from hook
541$parameters = array('arrayfields'=>$arrayfields);
542$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
543print $hookmanager->resPrint;
544// Action column
545if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
546 print '<td class="liste_titre center maxwidthsearch">';
547 $searchpicto = $form->showFilterButtons();
548 print $searchpicto;
549 print '</td>';
550}
551print '</tr>'."\n";
552
553$totalarray = array();
554$totalarray['nbfield'] = 0;
555
556// Fields title label
557// --------------------------------------------------------------------
558print '<tr class="liste_titre">';
559// Action column
560if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
561 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
562 $totalarray['nbfield']++;
563}
564foreach ($object->fields as $key => $val) {
565 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
566 if ($key == 'status') {
567 $cssforfield .= ($cssforfield ? ' ' : '').'center';
568 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
569 $cssforfield .= ($cssforfield ? ' ' : '').'center';
570 } elseif (in_array($val['type'], array('timestamp'))) {
571 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
572 } elseif (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && $val['label'] != 'TechnicalID' && empty($val['arrayofkeyval'])) {
573 $cssforfield .= ($cssforfield ? ' ' : '').'right';
574 }
575 $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
576 if (!empty($arrayfields['t.'.$key]['checked'])) {
577 print getTitleFieldOfList($arrayfields['t.'.$key]['label'], 0, $_SERVER['PHP_SELF'], 't.'.$key, '', $param, ($cssforfield ? 'class="'.$cssforfield.'"' : ''), $sortfield, $sortorder, ($cssforfield ? $cssforfield.' ' : ''), 0, (empty($val['helplist']) ? '' : $val['helplist']))."\n";
578 $totalarray['nbfield']++;
579 }
580}
581// Extra fields
582include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
583// Hook fields
584$parameters = array('arrayfields'=>$arrayfields, 'param'=>$param, 'sortfield'=>$sortfield, 'sortorder'=>$sortorder, 'totalarray'=>&$totalarray);
585$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
586print $hookmanager->resPrint;
587// Action column
588if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
589 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
590 $totalarray['nbfield']++;
591}
592print '</tr>'."\n";
593
594
595// Detect if we need a fetch on each output line
596$needToFetchEachLine = 0;
597if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
598 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
599 if (!is_null($val) && preg_match('/\$object/', $val)) {
600 $needToFetchEachLine++; // There is at least one compute field that use $object
601 }
602 }
603}
604
605
606// Loop on record
607// --------------------------------------------------------------------
608$i = 0;
609$savnbfield = $totalarray['nbfield'];
610$totalarray = array();
611$totalarray['nbfield'] = 0;
612$imaxinloop = ($limit ? min($num, $limit) : $num);
613while ($i < $imaxinloop) {
614 $obj = $db->fetch_object($resql);
615 if (empty($obj)) {
616 break; // Should not happen
617 }
618
619 // Store properties in $object
620 $object->setVarsFromFetchObj($obj);
621
622 if ($mode == 'kanban') {
623 if ($i == 0) {
624 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
625 print '<div class="box-flex-container kanban">';
626 }
627 // Output Kanban
628
629 $object->skill_type = $obj->skill_type;
630 $object->description = $obj->description;
631
632 // Output Kanban
633 $selected = -1;
634 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
635 $selected = 0;
636 if (in_array($object->id, $arrayofselected)) {
637 $selected = 1;
638 }
639 }
640 print $object->getKanbanView('', array('selected' => $selected));
641 if ($i == ($imaxinloop - 1)) {
642 print '</div>';
643 print '</td></tr>';
644 }
645 } else {
646 // Show here line of result
647 $j = 0;
648 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
649 // Action column
650 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
651 print '<td class="nowrap center">';
652 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
653 $selected = 0;
654 if (in_array($object->id, $arrayofselected)) {
655 $selected = 1;
656 }
657 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
658 }
659 print '</td>';
660 if (!$i) {
661 $totalarray['nbfield']++;
662 }
663 }
664 foreach ($object->fields as $key => $val) {
665 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
666 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
667 $cssforfield .= ($cssforfield ? ' ' : '').'center';
668 } elseif ($key == 'status') {
669 $cssforfield .= ($cssforfield ? ' ' : '').'center';
670 }
671
672 if (in_array($val['type'], array('timestamp'))) {
673 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
674 } elseif ($key == 'ref') {
675 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
676 }
677
678 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('rowid', 'status')) && empty($val['arrayofkeyval'])) {
679 $cssforfield .= ($cssforfield ? ' ' : '').'right';
680 }
681 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
682
683 if (!empty($arrayfields['t.'.$key]['checked'])) {
684 print '<td'.($cssforfield ? ' class="'.$cssforfield.(preg_match('/tdoverflow/', $cssforfield) ? ' classfortooltip' : '').'"' : '');
685 if (preg_match('/tdoverflow/', $cssforfield) && !is_numeric($object->$key)) {
686 print ' title="'.dol_escape_htmltag($object->$key).'"';
687 }
688 print '>';
689 if ($key == 'status') {
690 print $object->getLibStatut(5);
691 } elseif ($key == 'rowid') {
692 print $object->showOutputField($val, $key, $object->id, '');
693 } elseif ($key == 'label') {
694 print $object->getNomUrl(1);
695 } else {
696 print $object->showOutputField($val, $key, $object->$key, '');
697 }
698 print '</td>';
699 if (!$i) {
700 $totalarray['nbfield']++;
701 }
702 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
703 if (!$i) {
704 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
705 }
706 if (!isset($totalarray['val'])) {
707 $totalarray['val'] = array();
708 }
709 if (!isset($totalarray['val']['t.'.$key])) {
710 $totalarray['val']['t.'.$key] = 0;
711 }
712 $totalarray['val']['t.'.$key] += $object->$key;
713 }
714 }
715 }
716 // Extra fields
717 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
718 // Fields from hook
719 $parameters = array('arrayfields'=>$arrayfields, 'object'=>$object, 'obj'=>$obj, 'i'=>$i, 'totalarray'=>&$totalarray);
720 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
721 print $hookmanager->resPrint;
722 // Action column
723 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
724 print '<td class="nowrap center">';
725 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
726 $selected = 0;
727 if (in_array($object->id, $arrayofselected)) {
728 $selected = 1;
729 }
730 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
731 }
732 print '</td>';
733 if (!$i) {
734 $totalarray['nbfield']++;
735 }
736 }
737
738 print '</tr>'."\n";
739 }
740 $i++;
741}
742
743// Show total line
744include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
745
746// If no record found
747if ($num == 0) {
748 $colspan = 1;
749 foreach ($arrayfields as $key => $val) {
750 if (!empty($val['checked'])) {
751 $colspan++;
752 }
753 }
754 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
755}
756
757
758$db->free($resql);
759
760$parameters = array('arrayfields'=>$arrayfields, 'sql'=>$sql);
761$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
762print $hookmanager->resPrint;
763
764print '</table>'."\n";
765print '</div>'."\n";
766
767print '</form>'."\n";
768
769if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
770 $hidegeneratedfilelistifempty = 1;
771 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
772 $hidegeneratedfilelistifempty = 0;
773 }
774
775 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
776 $formfile = new FormFile($db);
777
778 // Show list of available documents
779 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
780 $urlsource .= str_replace('&amp;', '&', $param);
781
782 $filedir = $diroutputmassaction;
783 $genallowed = $permissiontoread;
784 $delallowed = $permissiontoadd;
785
786 print $formfile->showdocuments('massfilesarea_hrm', '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
787}
788
789// End of page
790llxFooter();
791$db->close();
$id
Definition account.php:39
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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:70
Class to manage standard extra fields.
Class to generate html code for admin pages.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class for Skill.
llxFooter()
Footer empty.
Definition document.php:107
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...
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)
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.
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_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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...
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
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.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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...
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.