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