dolibarr 23.0.3
myobject_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) 2024 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) ---Replace with your own copyright and developer email---
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
26// General defined Options
27//if (! defined('CSRFCHECK_WITH_TOKEN')) define('CSRFCHECK_WITH_TOKEN', '1'); // Force use of CSRF protection with tokens even for GET
28//if (! defined('MAIN_AUTHENTICATION_MODE')) define('MAIN_AUTHENTICATION_MODE', 'aloginmodule'); // Force authentication handler
29//if (! defined('MAIN_LANG_DEFAULT')) define('MAIN_LANG_DEFAULT', 'auto'); // Force LANG (language) to a particular value
30//if (! defined('MAIN_SECURITY_FORCECSP')) define('MAIN_SECURITY_FORCECSP', 'none'); // Disable all Content Security Policies
31//if (! defined('NOBROWSERNOTIF')) define('NOBROWSERNOTIF', '1'); // Disable browser notification
32//if (! defined('NOIPCHECK')) define('NOIPCHECK', '1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
33//if (! defined('NOLOGIN')) define('NOLOGIN', '1'); // Do not use login - if this page is public (can be called outside logged session). This includes the NOIPCHECK too.
34//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1'); // Do not load ajax.lib.php library
35//if (! defined('NOREQUIREDB')) define('NOREQUIREDB', '1'); // Do not create database handler $db
36//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1'); // Do not load html.form.class.php
37//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1'); // Do not load and show top and left menu
38//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC', '1'); // Do not load object $mysoc
39//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN', '1'); // Do not load object $langs
40//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER', '1'); // Do not load object $user
41//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION', '1'); // Do not check injection attack on GET parameters
42//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION', '1'); // Do not check injection attack on POST parameters
43//if (! defined('NOSESSION')) define('NOSESSION', '1'); // On CLI mode, no need to use web sessions
44//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK', '1'); // Do not check style html tag into posted data
45//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
46
47
48// Load Dolibarr environment
49$res = 0;
50// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
51if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) {
52 $res = @include str_replace("..", "", $_SERVER["CONTEXT_DOCUMENT_ROOT"])."/main.inc.php";
53}
54// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
55$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME'];
56$tmp2 = realpath(__FILE__);
57$i = strlen($tmp) - 1;
58$j = strlen($tmp2) - 1;
59while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) {
60 $i--;
61 $j--;
62}
63if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) {
64 $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php";
65}
66if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) {
67 $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php";
68}
69// Try main.inc.php using relative path
70if (!$res && file_exists("../main.inc.php")) {
71 $res = @include "../main.inc.php";
72}
73if (!$res && file_exists("../../main.inc.php")) {
74 $res = @include "../../main.inc.php";
75}
76if (!$res && file_exists("../../../main.inc.php")) {
77 $res = @include "../../../main.inc.php";
78}
79if (!$res) {
80 die("Include of main fails");
81}
90include_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php';
91include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
92include_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
93// load module libraries
94include_once __DIR__.'/class/myobject.class.php';
95// for other modules
96//dol_include_once('/othermodule/class/otherobject.class.php');
97
98// Load translation files required by the page
99$langs->loadLangs(array("mymodule@mymodule", "other"));
100
101// Get parameters
102$action = GETPOST('action', 'aZ09') ? GETPOST('action', 'aZ09') : 'view'; // The action 'create'/'add', 'edit'/'update', 'view', ...
103$massaction = GETPOST('massaction', 'alpha'); // The bulk action (combo box choice into lists)
104$show_files = GETPOSTINT('show_files'); // Show files area generated by bulk actions ?
105$confirm = GETPOST('confirm', 'alpha'); // Result of a confirmation
106$cancel = GETPOST('cancel', 'alpha'); // We click on a Cancel button
107$toselect = GETPOST('toselect', 'array:int'); // Array of ids of elements selected into a list
108$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : getDolDefaultContextPage(__FILE__); // To manage different context of search
109$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page
110$optioncss = GETPOST('optioncss', 'aZ'); // Option for the css output (always '' except when 'print')
111$mode = GETPOST('mode', 'aZ'); // The display mode ('list', 'kanban', 'hierarchy', 'calendar', 'gantt', ...)
112$groupby = GETPOST('groupby', 'aZ09'); // Example: $groupby = 'p.fk_opp_status' or $groupby = 'p.fk_statut'
113
114$id = GETPOSTINT('id');
115$ref = GETPOST('ref', 'alpha');
116
117// Load variable for pagination
118$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
119$sortfield = GETPOST('sortfield', 'aZ09comma');
120$sortorder = GETPOST('sortorder', 'aZ09comma');
121$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
122if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
123 // If $page is not defined, or '' or -1 or if we click on clear filters
124 $page = 0;
125}
126$offset = $limit * $page;
127$pageprev = $page - 1;
128$pagenext = $page + 1;
129
130// Initialize technical objects
131$object = new MyObject($db);
132$extrafields = new ExtraFields($db);
133$diroutputmassaction = $conf->mymodule->dir_output.'/temp/massgeneration/'.$user->id;
134$hookmanager->initHooks(array($contextpage)); // Note that conf->hooks_modules contains array of activated contexes
135
136// Fetch optionals attributes and labels
137$extrafields->fetch_name_optionals_label($object->table_element);
138//$extrafields->fetch_name_optionals_label($object->table_element_line);
139
140$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
141
142// Default sort order (if not yet defined by previous GETPOST)
143if (!$sortfield) {
144 reset($object->fields); // Reset is required to avoid key() to return null.
145 $sortfield = "t.".key($object->fields); // Set here default search field. By default 1st field in definition.
146}
147if (!$sortorder) {
148 $sortorder = "ASC";
149}
150
151// Initialize array of search criteria
152$search_all = trim(GETPOST('search_all', 'alphanohtml'));
153$search = array();
154foreach ($object->fields as $key => $val) {
155 if (GETPOST('search_'.$key, 'alpha') !== '') {
156 $search[$key] = GETPOST('search_'.$key, 'alpha');
157 }
158 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
159 $search[$key.'_dtstart'] = dol_mktime(0, 0, 0, GETPOSTINT('search_'.$key.'_dtstartmonth'), GETPOSTINT('search_'.$key.'_dtstartday'), GETPOSTINT('search_'.$key.'_dtstartyear'));
160 $search[$key.'_dtend'] = dol_mktime(23, 59, 59, GETPOSTINT('search_'.$key.'_dtendmonth'), GETPOSTINT('search_'.$key.'_dtendday'), GETPOSTINT('search_'.$key.'_dtendyear'));
161 }
162}
163
164// List of fields to search into when doing a "search in all"
165$fieldstosearchall = array();
166// foreach ($object->fields as $key => $val) {
167// if (!empty($val['searchall'])) {
168// $fieldstosearchall['t.'.$key] = $val['label'];
169// }
170// }
171// $parameters = array('fieldstosearchall'=>$fieldstosearchall);
172// $reshook = $hookmanager->executeHooks('completeFieldsToSearchAll', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
173// if ($reshook > 0) {
174// $fieldstosearchall = empty($hookmanager->resArray['fieldstosearchall']) ? array() : $hookmanager->resArray['fieldstosearchall'];
175// } elseif ($reshook == 0) {
176// $fieldstosearchall = array_merge($fieldstosearchall, empty($hookmanager->resArray['fieldstosearchall']) ? array() : $hookmanager->resArray['fieldstosearchall']);
177// }
178
179// Definition of array of fields for columns from ->fields
180$tableprefix = 't';
181$arrayfields = array();
182foreach ($object->fields as $key => $val) {
183 // If $val['visible']==0, then we never show the field
184 if (!empty($val['visible'])) {
185 $visible = (int) dol_eval((string) $val['visible'], 1);
186 $arrayfields[$tableprefix.'.'.$key] = array(
187 'label' => $val['label'],
188 'checked' => (($visible < 0) ? '0' : '1'),
189 'enabled' => (string) (int) (abs($visible) != 3 && (bool) dol_eval((string) $val['enabled'], 1)),
190 'position' => $val['position'],
191 'help' => isset($val['help']) ? $val['help'] : ''
192 );
193 }
194}
195
196// Extra fields
197include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
198// Add hook to complete $arrayfield
199$parameters = array('arrayfields' => &$arrayfields);
200$reshook = $hookmanager->executeHooks('completeArrayFields', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
201$sql .= $hookmanager->resPrint;
202
203// Complete arrayfields with special fields
204/*$arrayfields = array_merge($arrayfields, array(
205 'anotherfield' => array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>'1', 'enabled'=>'1', 'position'=>'90', 'csslist'=>'right'),
206));*/
207
208$object->fields = dol_sort_array($object->fields, 'position');
209$arrayfields = dol_sort_array($arrayfields, 'position');
210
211// There is several ways to check permission.
212// Set $enablepermissioncheck to 1 to enable a minimum low level of checks
213$enablepermissioncheck = getDolGlobalInt('MYMODULE_ENABLE_PERMISSION_CHECK');
214if ($enablepermissioncheck) {
215 $permissiontoread = $user->hasRight('mymodule', 'myobject', 'read');
216 $permissiontoadd = $user->hasRight('mymodule', 'myobject', 'write');
217 $permissiontodelete = $user->hasRight('mymodule', 'myobject', 'delete');
218} else {
219 $permissiontoread = 1;
220 $permissiontoadd = 1;
221 $permissiontodelete = 1;
222}
223
224// Security check (enable the most restrictive one)
225if ($user->socid > 0) {
227}
228//if ($user->socid > 0) accessforbidden();
229//$socid = 0; if ($user->socid > 0) $socid = $user->socid;
230//$isdraft = (($object->status == $object::STATUS_DRAFT) ? 1 : 0);
231//restrictedArea($user, $object->module, 0, $object->table_element, $object->element, 'fk_soc', 'rowid', $isdraft);
232if (!isModEnabled("mymodule")) {
233 accessforbidden('Module mymodule not enabled');
234}
235if (!$permissiontoread) {
237}
238
239
240/*
241 * Actions
242 */
243
244if (GETPOST('cancel', 'alpha')) {
245 $action = 'list';
246 $massaction = '';
247}
248if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
249 $massaction = '';
250}
251
252$parameters = array('arrayfields' => &$arrayfields);
253$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
254if ($reshook < 0) {
255 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
256}
257
258if (empty($reshook)) {
259 // Selection of new fields
260 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
261
262 // Purge search criteria
263 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
264 foreach ($object->fields as $key => $val) {
265 $search[$key] = '';
266 if (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
267 $search[$key.'_dtstart'] = '';
268 $search[$key.'_dtend'] = '';
269 }
270 }
271 $search_all = '';
272 $toselect = array();
273 $search_array_options = array();
274 }
275 if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')
276 || GETPOST('button_search_x', 'alpha') || GETPOST('button_search.x', 'alpha') || GETPOST('button_search', 'alpha')) {
277 $massaction = ''; // Protection to avoid mass action if we force a new search during a mass action confirmation
278 }
279
280 // Mass actions
281 $objectclass = 'MyObject';
282 $objectlabel = 'MyObject';
283 $uploaddir = $conf->mymodule->dir_output;
284
285 global $error;
286 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
287
288 // You can add more action here
289 // if ($action == 'xxx' && $permissiontoxxx) ...
290}
291
292
293
294/*
295 * View
296 */
297
298$form = new Form($db);
299
300$now = dol_now();
301
302$title = $langs->trans("MyObjects");
303//$help_url = "EN:Module_MyObject|FR:Module_MyObject_FR|ES:Módulo_MyObject";
304$help_url = '';
305$morejs = array();
306$morecss = array();
307
308
309// Build and execute select
310// --------------------------------------------------------------------
311$sql = "SELECT";
312$sql .= " ".$object->getFieldList('t');
313// Add fields from extrafields
314if (!empty($extrafields->attributes[$object->table_element]['label'])) {
315 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
316 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
317 }
318}
319// Add fields from hooks
320$parameters = array();
321$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
322$sql .= $hookmanager->resPrint;
323$sql = preg_replace('/,\s*$/', '', $sql);
324
325$sqlfields = $sql; // $sql fields to remove for count total
326
327$sql .= " FROM ".$db->prefix().$object->table_element." as t";
328//$sql .= " LEFT JOIN ".$db->prefix()."anothertable as rc ON rc.parent = t.rowid";
329if (isset($extrafields->attributes[$object->table_element]['label']) && is_array($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
330 $sql .= " LEFT JOIN ".$db->prefix().$object->table_element."_extrafields as ef on (t.rowid = ef.fk_object)";
331}
332// Add table from hooks
333$parameters = array();
334$reshook = $hookmanager->executeHooks('printFieldListFrom', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
335$sql .= $hookmanager->resPrint;
336
337if (!empty($object->ismultientitymanaged) && (int) $object->ismultientitymanaged == 1) {
338 $sql .= " WHERE t.entity IN (".getEntity($object->element, (GETPOSTINT('search_current_entity') ? 0 : 1)).")";
339} elseif (preg_match('/^\w+@\w+$/', (string) $object->ismultientitymanaged)) {
340 $tmparray = explode('@', (string) $object->ismultientitymanaged);
341 $sql .= " LEFT JOIN ".$object->db->prefix().$tmparray[1]." as pt ON t.".$db->sanitize($tmparray[0])." = pt.rowid";
342 $sql .= " WHERE pt.entity IN (".getEntity($object->element, (GETPOSTINT('search_current_entity') ? 0 : 1)).")";
343} else {
344 $sql .= " WHERE 1 = 1";
345}
346foreach ($search as $key => $val) {
347 if (array_key_exists($key, $object->fields)) {
348 if ($key == 'status' && $search[$key] == -1) {
349 continue;
350 }
351 $field_spec = $object->fields[$key];
352 if ($field_spec === null) {
353 continue;
354 }
355 $mode_search = (($object->isInt($field_spec) || $object->isFloat($field_spec)) ? 1 : 0);
356 if ((strpos($field_spec['type'], 'integer:') === 0) || (strpos($field_spec['type'], 'sellist:') === 0) || !empty($field_spec['arrayofkeyval'])) {
357 if ($search[$key] == '-1' || ($search[$key] === '0' && (empty($field_spec['arrayofkeyval']) || !array_key_exists('0', $field_spec['arrayofkeyval'])))) {
358 $search[$key] = '';
359 }
360 $mode_search = 2;
361 }
362 if ($field_spec['type'] === 'boolean') {
363 $mode_search = 1;
364 if ($search[$key] == '-1') {
365 $search[$key] = '';
366 }
367 }
368 if (empty($field_spec['searchmulti'])) {
369 if (!is_array($search[$key]) && $search[$key] != '') {
370 $sql .= natural_search("t.".$db->escape($key), $search[$key], (($key == 'status') ? 2 : $mode_search));
371 }
372 } else {
373 if (is_array($search[$key]) && !empty($search[$key])) {
374 $sql .= natural_search("t.".$db->escape($key), implode(',', $search[$key]), (($key == 'status') ? 2 : $mode_search));
375 }
376 }
377 } else {
378 if (preg_match('/(_dtstart|_dtend)$/', $key) && $search[$key] != '') {
379 $columnName = preg_replace('/(_dtstart|_dtend)$/', '', $key);
380 if (preg_match('/^(date|timestamp|datetime)/', $object->fields[$columnName]['type'])) {
381 if (preg_match('/_dtstart$/', $key)) {
382 $sql .= " AND t.".$db->sanitize($columnName)." >= '".$db->idate($search[$key])."'";
383 }
384 if (preg_match('/_dtend$/', $key)) {
385 $sql .= " AND t.".$db->sanitize($columnName)." <= '".$db->idate($search[$key])."'";
386 }
387 }
388 }
389 }
390}
391if ($search_all) {
392 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
393}
394/*
395// If the internal user must only see his customers, force searching by him
396$search_sale = 0;
397if (!$user->hasRight('societe', 'client', 'voir')) {
398 $search_sale = $user->id;
399}
400// Search on sale representative
401if ($search_sale && $search_sale != '-1') {
402 if ($search_sale == -2) {
403 $sql .= " AND NOT EXISTS (SELECT sc.fk_soc FROM ".$db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc)";
404 } elseif ($search_sale > 0) {
405 $sql .= " AND EXISTS (SELECT sc.fk_soc FROM ".$db->prefix()."societe_commerciaux as sc WHERE sc.fk_soc = t.fk_soc AND sc.fk_user = ".((int) $search_sale).")";
406 }
407}
408// Search on socid
409if ($socid) {
410 $sql .= " AND t.fk_soc = ".((int) $socid);
411}
412*/
413//$sql.= dolSqlDateFilter("t.field", $search_xxxday, $search_xxxmonth, $search_xxxyear);
414// Add where from extra fields
415include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
416// Add where from hooks
417$parameters = array();
418$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
419$sql .= $hookmanager->resPrint;
420
421/* If a group by is required
422$sql .= " GROUP BY ";
423foreach($object->fields as $key => $val) {
424 $sql .= "t.".$db->sanitize($key).", ";
425}
426// Add fields from extrafields
427if (!empty($extrafields->attributes[$object->table_element]['label'])) {
428 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
429 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? "ef.".$key.', ' : '');
430 }
431}
432// Add groupby from hooks
433$parameters = array();
434$reshook = $hookmanager->executeHooks('printFieldListGroupBy', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
435if (empty($reshook)) {
436 $sql .= $hookmanager->resPrint;
437} else {
438 $sql = $hookmanager->resPrint;
439}
440
441$sql = preg_replace('/,\s*$/', '', $sql);
442*/
443
444// Add HAVING from hooks
445/*
446$parameters = array();
447$reshook = $hookmanager->executeHooks('printFieldListHaving', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
448if (empty($reshook)) {
449 $sql .= empty($hookmanager->resPrint) ? "" : " HAVING 1=1 ".$hookmanager->resPrint;
450} else {
451 $sql = $hookmanager->resPrint;
452}
453*/
454
455// Count total nb of records
456$nbtotalofrecords = '';
457if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
458 /* The fast and low memory method to get and count full list converts the sql into a sql count */
459 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
460 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
461
462 $resql = $db->query($sqlforcount);
463 if ($resql) {
464 $objforcount = $db->fetch_object($resql);
465 $nbtotalofrecords = $objforcount->nbtotalofrecords;
466 } else {
467 dol_print_error($db);
468 }
469
470 if (($page * $limit) > (int) $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
471 $page = 0;
472 $offset = 0;
473 }
474 $db->free($resql);
475}
476
477// Complete request and execute it with limit
478$sql .= $db->order($sortfield, $sortorder);
479if ($limit) {
480 $sql .= $db->plimit($limit + 1, $offset);
481}
482
483$resql = $db->query($sql);
484if (!$resql) {
485 dol_print_error($db);
486 exit;
487}
488
489$num = $db->num_rows($resql);
490
491
492// Direct jump if only one record found
493if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
494 $obj = $db->fetch_object($resql);
495 $id = $obj->rowid;
496 header("Location: ".dol_buildpath('/mymodule/myobject_card.php', 1).'?id='.((int) $id));
497 exit;
498}
499
500
501// Output page
502// --------------------------------------------------------------------
503
504llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'mod-mymodule page-list bodyforlist'); // Can use also classforhorizontalscrolloftabs instead of bodyforlist for a horizontal scroll in the table instead of page
505
506// Example : Adding jquery code
507// print '<script type="text/javascript">
508// jQuery(document).ready(function() {
509// function init_myfunc()
510// {
511// jQuery("#myid").removeAttr(\'disabled\');
512// jQuery("#myid").attr(\'disabled\',\'disabled\');
513// }
514// init_myfunc();
515// jQuery("#mybutton").click(function() {
516// init_myfunc();
517// });
518// });
519// </script>';
520
521$arrayofselected = is_array($toselect) ? $toselect : array();
522
523$param = '';
524if (!empty($mode)) {
525 $param .= '&mode='.urlencode($mode);
526}
527if (!empty($contextpage) && $contextpage != getDolDefaultContextPage(__FILE__)) {
528 $param .= '&contextpage='.urlencode($contextpage);
529}
530if ($limit > 0 && $limit != $conf->liste_limit) {
531 $param .= '&limit='.((int) $limit);
532}
533if ($optioncss != '') {
534 $param .= '&optioncss='.urlencode($optioncss);
535}
536if ($groupby != '') {
537 $param .= '&groupby='.urlencode($groupby);
538}
539foreach ($search as $key => $val) {
540 if (is_array($search[$key])) {
541 foreach ($search[$key] as $skey) {
542 if ($skey != '') {
543 $param .= '&search_'.$key.'[]='.urlencode($skey);
544 }
545 }
546 } elseif (preg_match('/(_dtstart|_dtend)$/', $key) && !empty($val)) {
547 $param .= '&search_'.$key.'month='.GETPOSTINT('search_'.$key.'month');
548 $param .= '&search_'.$key.'day='.GETPOSTINT('search_'.$key.'day');
549 $param .= '&search_'.$key.'year='.GETPOSTINT('search_'.$key.'year');
550 } elseif ($search[$key] != '') {
551 $param .= '&search_'.$key.'='.urlencode($search[$key]);
552 }
553}
554// Add $param from extra fields
555include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
556// Add $param from hooks
557$parameters = array('param' => &$param);
558$reshook = $hookmanager->executeHooks('printFieldListSearchParam', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
559$param .= $hookmanager->resPrint;
560
561// List of mass actions available
562$arrayofmassactions = array(
563 //'validate'=>img_picto('', 'check', 'class="pictofixedwidth"').$langs->trans("Validate"),
564 //'generate_doc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("ReGeneratePDF"),
565 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
566 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
567);
568if (!empty($permissiontodelete)) {
569 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
570}
571if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete'))) {
572 $arrayofmassactions = array();
573}
574$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
575
576print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
577if ($optioncss != '') {
578 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
579}
580print '<input type="hidden" name="token" value="'.newToken().'">';
581print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
582print '<input type="hidden" name="action" value="list">';
583print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
584print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
585print '<input type="hidden" name="page" value="'.$page.'">';
586print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
587print '<input type="hidden" name="page_y" value="">';
588print '<input type="hidden" name="mode" value="'.$mode.'">';
589
590
591$newcardbutton = '';
592$newcardbutton .= dolGetButtonTitle($langs->trans('ViewList'), '', 'fa fa-bars imgforviewmode', $_SERVER["PHP_SELF"].'?mode=common'.preg_replace('/(&|\?)*(mode|groupby)=[^&]+/', '', $param), '', ((empty($mode) || $mode == 'common') ? 2 : 1), array('morecss' => 'reposition'));
593$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanban'), '', 'fa fa-th-list imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanban'.preg_replace('/(&|\?)*(mode|groupby)=[^&]+/', '', $param), '', ($mode == 'kanban' ? 2 : 1), array('morecss' => 'reposition'));
594//$newcardbutton .= dolGetButtonTitle($langs->trans('ViewKanbanGroupBy'), '', 'fa fa-grip-vertical imgforviewmode', $_SERVER["PHP_SELF"].'?mode=kanbangroupby&groupby=p.fk_opp_status'.preg_replace('/(&|\?)*(mode|groupby)=[^&]+/', '', $param), '', ($mode == 'kanbangroupby' ? 2 : 1), array('morecss' => 'reposition'));
595//$newcardbutton .= dolGetButtonTitle($langs->trans('HierarchicView'), '', 'fa fa-stream paddingleft imgforviewmode', $_SERVER["PHP_SELF"].'?mode=hierarchy'.preg_replace('/(&|\?)*(mode|groupby)=[^&]+/', '', $param), '', (($mode == 'hierarchy') ? 2 : 1), array('morecss' => 'reposition'));
596$newcardbutton .= dolGetButtonTitleSeparator();
597$newcardbutton .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', dol_buildpath('/mymodule/myobject_card.php', 1).'?action=create&backtopage='.urlencode($_SERVER['PHP_SELF']), '', $permissiontoadd);
598
599print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
600
601// Add code for pre mass action (confirmation or email presend form)
602$topicmail = "SendMyObjectRef";
603$modelmail = "myobject";
604$objecttmp = new MyObject($db);
605$trackid = 'xxxx'.$object->id;
606include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
607
608if ($search_all) {
609 $setupstring = '';
610 // @phan-suppress-next-line PhanEmptyForeach
611 foreach ($fieldstosearchall as $key => $val) {
612 $fieldstosearchall[$key] = $langs->trans($val);
613 $setupstring .= $key."=".$val.";";
614 }
615 print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
616 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
617}
618
619$moreforfilter = '';
620/*$moreforfilter.='<div class="divsearchfield">';
621$moreforfilter.= $langs->trans('MyFilter') . ': <input type="text" name="search_myfield" value="'.dol_escape_htmltag($search_myfield).'">';
622$moreforfilter.= '</div>';*/
623
624$parameters = array();
625$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
626if (empty($reshook)) {
627 $moreforfilter .= $hookmanager->resPrint;
628} else {
629 $moreforfilter = $hookmanager->resPrint;
630}
631$parameters = array(
632 'arrayfields' => &$arrayfields,
633);
634
635if (!empty($moreforfilter)) {
636 print '<div class="liste_titre liste_titre_bydiv centpercent">';
637 print $moreforfilter;
638 print '</div>';
639}
640
641$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
642$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, $conf->main_checkbox_left_column); // This also change content of $arrayfields with user setup
643$selectedfields = (($mode != 'kanban' && $mode != 'kanbangroupby') ? $htmlofselectarray : '');
644$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
645
646print '<div class="div-table-responsive">'; // You can use div-table-responsive-no-min if you don't need reserved height for your table
647print '<table class="tagtable nobottomiftotal noborder liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
648
649// Fields title search
650// --------------------------------------------------------------------
651print '<tr class="liste_titre_filter">';
652// Action column
653if ($conf->main_checkbox_left_column) {
654 print '<td class="liste_titre center maxwidthsearch">';
655 $searchpicto = $form->showFilterButtons('left');
656 print $searchpicto;
657 print '</td>';
658}
659foreach ($object->fields as $key => $val) {
660 //$searchkey = empty($search[$key]) ? '' : $search[$key];
661 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
662 if ($key == 'status') {
663 $cssforfield .= ($cssforfield ? ' ' : '').'center';
664 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
665 $cssforfield .= ($cssforfield ? ' ' : '').'center';
666 } elseif (in_array($val['type'], array('timestamp'))) {
667 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
668 } 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'])) {
669 $cssforfield .= ($cssforfield ? ' ' : '').'right';
670 }
671 if (!empty($arrayfields['t.'.$key]['checked'])) {
672 print '<td class="liste_titre'.($cssforfield ? ' '.$cssforfield : '').($key == 'status' ? ' parentonrightofpage' : '').'">';
673 if (!empty($val['arrayofkeyval']) && is_array($val['arrayofkeyval'])) {
674 if (empty($val['searchmulti'])) {
675 print $form->selectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 1, 0, 0, '', 1, 0, 0, '', 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
676 } else {
677 print $form->multiselectarray('search_'.$key, $val['arrayofkeyval'], (isset($search[$key]) ? $search[$key] : ''), 0, 0, 'maxwidth100'.($key == 'status' ? ' search_status width100 onrightofpage' : ''), 1);
678 }
679 } elseif ((strpos($val['type'], 'integer:') === 0) || (strpos($val['type'], 'sellist:') === 0)) {
680 print $object->showInputField($val, $key, (isset($search[$key]) ? $search[$key] : ''), '', '', 'search_', $cssforfield.' maxwidth250', 1);
681 } elseif (preg_match('/^(date|timestamp|datetime)/', $val['type'])) {
682 print '<div class="nowrap">';
683 print $form->selectDate($search[$key.'_dtstart'] ? $search[$key.'_dtstart'] : '', "search_".$key."_dtstart", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
684 print '</div>';
685 print '<div class="nowrap">';
686 print $form->selectDate($search[$key.'_dtend'] ? $search[$key.'_dtend'] : '', "search_".$key."_dtend", 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
687 print '</div>';
688 } elseif ($key == 'lang') {
689 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
690 $formadmin = new FormAdmin($db);
691 print $formadmin->select_language((isset($search[$key]) ? $search[$key] : ''), 'search_lang', 0, array(), 1, 0, 0, 'minwidth100imp maxwidth125', 2);
692 } elseif ($val['type'] === 'boolean') {
693 print $form->selectyesno('search_' . $key, $search[$key] ?? '', 1, false, 1);
694 } else {
695 print '<input type="text" class="flat maxwidth'.(in_array($val['type'], array('integer', 'price')) ? '50' : '75').'" name="search_'.$key.'" value="'.dol_escape_htmltag(isset($search[$key]) ? $search[$key] : '').'">';
696 }
697 print '</td>';
698 }
699}
700// Extra fields
701include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
702
703// Fields from hook
704$parameters = array('arrayfields' => $arrayfields);
705$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
706print $hookmanager->resPrint;
707/*if (!empty($arrayfields['anotherfield']['checked'])) {
708 print '<td class="liste_titre"></td>';
709}*/
710// Action column
711if (!$conf->main_checkbox_left_column) {
712 print '<td class="liste_titre center maxwidthsearch">';
713 $searchpicto = $form->showFilterButtons();
714 print $searchpicto;
715 print '</td>';
716}
717print '</tr>'."\n";
718
719$totalarray = array();
720$totalarray['nbfield'] = 0;
721
722// Fields title label
723// --------------------------------------------------------------------
724print '<tr class="liste_titre">';
725// Action column
726if ($conf->main_checkbox_left_column) {
727 print getTitleFieldOfList($selectedfields, 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
728 $totalarray['nbfield']++;
729}
730foreach ($object->fields as $key => $val) {
731 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
732 if ($key == 'status') {
733 $cssforfield .= ($cssforfield ? ' ' : '').'center';
734 } elseif (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
735 $cssforfield .= ($cssforfield ? ' ' : '').'center';
736 } elseif (in_array($val['type'], array('timestamp'))) {
737 $cssforfield .= ($cssforfield ? ' ' : '').'nowrap';
738 } 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'])) {
739 $cssforfield .= ($cssforfield ? ' ' : '').'right';
740 }
741 $cssforfield = preg_replace('/small\s*/', '', $cssforfield); // the 'small' css must not be used for the title label
742 if (!empty($arrayfields['t.'.$key]['checked'])) {
743 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";
744 $totalarray['nbfield']++;
745 }
746}
747// Extra fields
748include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
749// Hook fields
750$parameters = array('arrayfields' => $arrayfields, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'totalarray' => &$totalarray);
751$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
752print $hookmanager->resPrint;
753/*if (!empty($arrayfields['anotherfield']['checked'])) {
754 print '<th class="liste_titre">'.$langs->trans("AnotherField").'</th>';
755 $totalarray['nbfield']++;
756}*/
757// Action column
758if (!$conf->main_checkbox_left_column) {
759 print getTitleFieldOfList(($mode != 'kanban' ? $selectedfields : ''), 0, $_SERVER["PHP_SELF"], '', '', '', '', $sortfield, $sortorder, 'center maxwidthsearch ')."\n";
760 $totalarray['nbfield']++;
761}
762print '</tr>'."\n";
763
764// Detect if we need a fetch on each output line
765$needToFetchEachLine = 0;
766if (isset($extrafields->attributes[$object->table_element]['computed']) && is_array($extrafields->attributes[$object->table_element]['computed']) && count($extrafields->attributes[$object->table_element]['computed']) > 0) {
767 foreach ($extrafields->attributes[$object->table_element]['computed'] as $key => $val) {
768 if (!is_null($val) && preg_match('/\$object/', $val)) {
769 $needToFetchEachLine++; // There is at least one compute field that use $object
770 }
771 }
772}
773
774
775// Loop on record
776// --------------------------------------------------------------------
777$i = 0;
778$savnbfield = $totalarray['nbfield'];
779$totalarray = array();
780$totalarray['nbfield'] = 0;
781$imaxinloop = ($limit ? min($num, $limit) : $num);
782while ($i < $imaxinloop) {
783 $obj = $db->fetch_object($resql);
784 if (empty($obj)) {
785 break; // Should not happen
786 }
787
788 // Store properties in $object
789 $object->setVarsFromFetchObj($obj);
790
791 /*
792 $object->thirdparty = null;
793 if ($obj->fk_soc > 0) {
794 if (!empty($conf->cache['thirdparty'][$obj->fk_soc])) {
795 $companyobj = $conf->cache['thirdparty'][$obj->fk_soc];
796 } else {
797 $companyobj = new Societe($db);
798 $companyobj->fetch($obj->fk_soc);
799 $conf->cache['thirdparty'][$obj->fk_soc] = $companyobj;
800 }
801
802 $object->thirdparty = $companyobj;
803 }*/
804
805 if ($mode == 'kanban' || $mode == 'kanbangroupby') {
806 if ($i == 0) {
807 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
808 print '<div class="box-flex-container kanban">';
809 }
810 // Output Kanban
811 $selected = -1;
812 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
813 $selected = 0;
814 if (in_array($object->id, $arrayofselected)) {
815 $selected = 1;
816 }
817 }
818 //print $object->getKanbanView('', array('thirdparty'=>$object->thirdparty, 'selected' => $selected));
819 print $object->getKanbanView('', array('selected' => $selected));
820 if ($i == ($imaxinloop - 1)) {
821 print '</div>';
822 print '</td></tr>';
823 }
824 } else {
825 // Show line of result
826 $j = 0;
827 print '<tr data-rowid="'.$object->id.'" class="oddeven row-with-select">';
828
829 // Action column
830 if ($conf->main_checkbox_left_column) {
831 print '<td class="nowrap center">';
832 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
833 $selected = 0;
834 if (in_array($object->id, $arrayofselected)) {
835 $selected = 1;
836 }
837 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
838 }
839 print '</td>';
840 if (!$i) {
841 $totalarray['nbfield']++;
842 }
843 }
844 // Fields
845 foreach ($object->fields as $key => $val) {
846 $cssforfield = (empty($val['csslist']) ? (empty($val['css']) ? '' : $val['css']) : $val['csslist']);
847 if (in_array($val['type'], array('date', 'datetime', 'timestamp'))) {
848 $cssforfield .= ($cssforfield ? ' ' : '').'center';
849 } elseif ($key == 'status') {
850 $cssforfield .= ($cssforfield ? ' ' : '').'center';
851 }
852
853 if (in_array($val['type'], array('timestamp'))) {
854 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
855 } elseif ($key == 'ref') {
856 $cssforfield .= ($cssforfield ? ' ' : '').'nowraponall';
857 }
858
859 if (in_array($val['type'], array('double(24,8)', 'double(6,3)', 'integer', 'real', 'price')) && !in_array($key, array('id', 'rowid', 'ref', 'status')) && empty($val['arrayofkeyval'])) {
860 $cssforfield .= ($cssforfield ? ' ' : '').'right';
861 }
862 //if (in_array($key, array('fk_soc', 'fk_user', 'fk_warehouse'))) $cssforfield = 'tdoverflowmax100';
863
864 if (!empty($arrayfields['t.'.$key]['checked'])) {
865 print '<td'.($cssforfield ? ' class="'.$cssforfield.((preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key)) ? ' classfortooltip' : '').'"' : '');
866 if (preg_match('/tdoverflow/', $cssforfield) && !in_array($val['type'], array('ip', 'url')) && !is_numeric($object->$key) && !in_array($key, array('ref'))) {
867 print ' title="'.dol_escape_htmltag((string) $object->$key).'"';
868 }
869 print '>';
870 if ($key == 'status') {
871 print $object->getLibStatut(5);
872 } elseif ($key == 'rowid') {
873 print $object->showOutputField($val, $key, (string) $object->id, '');
874 } else {
875 if ($val['type'] == 'html') {
876 print '<div class="small lineheightsmall twolinesmax-normallineheight">';
877 }
878 print $object->showOutputField($val, $key, (string) $object->$key, '');
879 if ($val['type'] == 'html') {
880 print '</div>';
881 }
882 }
883 print '</td>';
884 if (!$i) {
885 $totalarray['nbfield']++;
886 }
887 if (!empty($val['isameasure']) && $val['isameasure'] == 1) {
888 if (!$i) {
889 $totalarray['pos'][$totalarray['nbfield']] = 't.'.$key;
890 }
891 if (!isset($totalarray['val'])) {
892 $totalarray['val'] = array();
893 }
894 if (!isset($totalarray['val']['t.'.$key])) {
895 $totalarray['val']['t.'.$key] = 0;
896 }
897 $totalarray['val']['t.'.$key] += $object->$key;
898 }
899 }
900 }
901 // Extra fields
902 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
903 // Fields from hook
904 $parameters = array('arrayfields' => $arrayfields, 'object' => $object, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
905 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
906 print $hookmanager->resPrint;
907
908 /*if (!empty($arrayfields['anotherfield']['checked'])) {
909 print '<td class="right">'.$obj->anotherfield.'</td>';
910 }*/
911
912 // Action column
913 if (empty($conf->main_checkbox_left_column)) {
914 print '<td class="nowrap center">';
915 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
916 $selected = 0;
917 if (in_array($object->id, $arrayofselected)) {
918 $selected = 1;
919 }
920 print '<input id="cb'.$object->id.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$object->id.'"'.($selected ? ' checked="checked"' : '').'>';
921 }
922 print '</td>';
923 if (!$i) {
924 $totalarray['nbfield']++;
925 }
926 }
927
928 print '</tr>'."\n";
929 }
930
931 $i++;
932}
933
934// Show total line
935include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
936
937// If no record found
938if ($num == 0) {
939 $colspan = 1;
940 foreach ($arrayfields as $key => $val) {
941 if (!empty($val['checked'])) {
942 $colspan++;
943 }
944 }
945 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
946}
947
948
949$db->free($resql);
950
951$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
952$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
953print $hookmanager->resPrint;
954
955print '</table>'."\n";
956print '</div>'."\n";
957
958print '</form>'."\n";
959
960if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
961 $hidegeneratedfilelistifempty = 1;
962 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
963 $hidegeneratedfilelistifempty = 0;
964 }
965
966 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
967 $formfile = new FormFile($db);
968
969 // Show list of available documents
970 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
971 $urlsource .= str_replace('&amp;', '&', $param);
972
973 $filedir = $diroutputmassaction;
974 $genallowed = $permissiontoread;
975 $delallowed = $permissiontoadd;
976
977 print $formfile->showdocuments('massfilesarea_'.$object->module, '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
978}
979
980// End of page
981llxFooter();
982$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
$totalarray
Definition export.php:1216
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to 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 MyObject.
dol_now($mode='gmt')
Return date for now.
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, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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.
getDolDefaultContextPage($s)
Return the default context page string.
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...
isModEnabled($module)
Is Dolibarr module enabled.
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.