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