dolibarr 21.0.4
list.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2002-2003 Jean-Louis Bergamo <jlb@j1b.org>
4 * Copyright (C) 2004-2022 Laurent Destailleur <eldy@users.sourceforge.net>
5 * Copyright (C) 2013-2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
6 * Copyright (C) 2014-2016 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2018-2024 Alexandre Spangaro <aspangaro@open-dsi.fr>
8 * Copyright (C) 2021-2024 Frédéric France <frederic.france@free.fr>
9 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
10 * Copyright (C) 2024 Benjamin Falière <benjamin.faliere@altairis.fr>
11 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 3 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 */
26
34// Load Dolibarr environment
35require '../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
37require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
40
41
50// Load translation files required by the page
51$langs->loadLangs(array("members", "companies", "categories"));
52
53
54// Get parameters
55$action = GETPOST('action', 'aZ09');
56$massaction = GETPOST('massaction', 'alpha');
57$show_files = GETPOSTINT('show_files');
58$confirm = GETPOST('confirm', 'alpha');
59$cancel = GETPOST('cancel', 'alpha');
60$toselect = GETPOST('toselect', 'array');
61$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'memberslist'; // To manage different context of search
62$backtopage = GETPOST('backtopage', 'alpha');
63$optioncss = GETPOST('optioncss', 'aZ');
64$mode = GETPOST('mode', 'alpha');
65$groupby = GETPOST('groupby', 'aZ09'); // Example: $groupby = 'p.fk_opp_status' or $groupby = 'p.fk_statut'
66
67// Search fields
68$search = GETPOST("search", 'alpha');
69$search_id = GETPOST('search_id', 'int');
70$search_ref = GETPOST("search_ref", 'alpha');
71$search_lastname = GETPOST("search_lastname", 'alpha');
72$search_firstname = GETPOST("search_firstname", 'alpha');
73$search_gender = GETPOST("search_gender", 'alpha');
74$search_civility = GETPOST("search_civility", 'alpha');
75$search_company = GETPOST('search_company', 'alphanohtml');
76$search_login = GETPOST("search_login", 'alpha');
77$search_address = GETPOST("search_address", 'alpha');
78$search_zip = GETPOST("search_zip", 'alpha');
79$search_town = GETPOST("search_town", 'alpha');
80$search_state = GETPOST("search_state", 'alpha'); // county / departement / federal state
81$search_country = GETPOST("search_country", 'alpha');
82$search_phone = GETPOST("search_phone", 'alpha');
83$search_phone_perso = GETPOST("search_phone_perso", 'alpha');
84$search_phone_mobile = GETPOST("search_phone_mobile", 'alpha');
85$search_type = GETPOST("search_type", 'alpha');
86$search_email = GETPOST("search_email", 'alpha');
87$search_categ = GETPOST("search_categ", 'intcomma');
88$search_morphy = GETPOST("search_morphy", 'alpha');
89$search_import_key = trim(GETPOST("search_import_key", 'alpha'));
90
91$socid = GETPOSTINT('socid');
92if (GETPOSTINT('catid') && empty($search_categ)) {
93 $search_categ = GETPOSTINT('catid');
94}
95
96$search_filter = GETPOST("search_filter", 'alpha');
97$search_status = GETPOST("search_status", 'intcomma'); // status
98$search_datec_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datec_start_month'), GETPOSTINT('search_datec_start_day'), GETPOSTINT('search_datec_start_year'));
99$search_datec_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datec_end_month'), GETPOSTINT('search_datec_end_day'), GETPOSTINT('search_datec_end_year'));
100$search_datem_start = dol_mktime(0, 0, 0, GETPOSTINT('search_datem_start_month'), GETPOSTINT('search_datem_start_day'), GETPOSTINT('search_datem_start_year'));
101$search_datem_end = dol_mktime(23, 59, 59, GETPOSTINT('search_datem_end_month'), GETPOSTINT('search_datem_end_day'), GETPOSTINT('search_datem_end_year'));
102
103$filter = GETPOST("filter", 'alpha');
104if ($filter) {
105 $search_filter = $filter; // For backward compatibility
106}
107
108$statut = GETPOST("statut", 'alpha');
109if ($statut != '') {
110 $search_status = $statut; // For backward compatibility
111}
112
113$search_all = trim(GETPOST('search_all', 'alphanohtml'));
114
115if ($search_status < -2) {
116 $search_status = '';
117}
118
119// Load variable for pagination
120$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
121$sortfield = GETPOST('sortfield', 'aZ09comma');
122$sortorder = GETPOST('sortorder', 'aZ09comma');
123$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT('page');
124if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
125 // If $page is not defined, or '' or -1 or if we click on clear filters
126 $page = 0;
127}
128$offset = $limit * $page;
129$pageprev = $page - 1;
130$pagenext = $page + 1;
131if (!$sortorder) {
132 $sortorder = ($filter == 'outofdate' ? "DESC" : "ASC");
133}
134if (!$sortfield) {
135 $sortfield = ($filter == 'outofdate' ? "d.datefin" : "d.lastname");
136}
137
138$object = new Adherent($db);
139
140// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
141$hookmanager->initHooks(array('memberlist'));
142$extrafields = new ExtraFields($db);
143
144// Fetch optionals attributes and labels
145$extrafields->fetch_name_optionals_label($object->table_element);
146
147$search_array_options = $extrafields->getOptionalsFromPost($object->table_element, '', 'search_');
148
149// List of fields to search into when doing a "search in all"
150$fieldstosearchall = array(
151 'd.ref' => 'Ref',
152 'd.login' => 'Login',
153 'd.lastname' => 'Lastname',
154 'd.firstname' => 'Firstname',
155 'd.societe' => "Company",
156 'd.email' => 'EMail',
157 'd.address' => 'Address',
158 'd.zip' => 'Zip',
159 'd.town' => 'Town',
160 'd.phone' => "Phone",
161 'd.phone_perso' => "PhonePerso",
162 'd.phone_mobile' => "PhoneMobile",
163 'd.note_public' => 'NotePublic',
164 'd.note_private' => 'NotePrivate',
165);
166
167$arrayfields = array(
168 'd.rowid' => array('label' => 'ID', 'checked' => 1, 'enabled' => getDolGlobalInt('MAIN_SHOW_TECHNICAL_ID'), 'position' => 1),
169 'd.ref' => array('label' => "Ref", 'checked' => 1),
170 'd.civility' => array('label' => "Civility", 'checked' => 0),
171 'd.lastname' => array('label' => "Lastname", 'checked' => 1),
172 'd.firstname' => array('label' => "Firstname", 'checked' => 1),
173 'd.gender' => array('label' => "Gender", 'checked' => 0),
174 'd.company' => array('label' => "Company", 'checked' => 1, 'position' => 70),
175 'd.login' => array('label' => "Login", 'checked' => 1),
176 'd.morphy' => array('label' => "MemberNature", 'checked' => 1),
177 't.libelle' => array('label' => "MemberType", 'checked' => 1, 'position' => 55),
178 'd.address' => array('label' => "Address", 'checked' => 0),
179 'd.zip' => array('label' => "Zip", 'checked' => 0),
180 'd.town' => array('label' => "Town", 'checked' => 0),
181 'd.phone' => array('label' => "Phone", 'checked' => 0),
182 'd.phone_perso' => array('label' => "PhonePerso", 'checked' => 0),
183 'd.phone_mobile' => array('label' => "PhoneMobile", 'checked' => 0),
184 'd.email' => array('label' => "Email", 'checked' => 1),
185 'state.nom' => array('label' => "State", 'checked' => 0, 'position' => 90),
186 'country.code_iso' => array('label' => "Country", 'checked' => 0, 'position' => 95),
187 /*'d.note_public'=>array('label'=>"NotePublic", 'checked'=>0),
188 'd.note_private'=>array('label'=>"NotePrivate", 'checked'=>0),*/
189 'd.datefin' => array('label' => "EndSubscription"),
190 'd.datec' => array('label' => "DateCreation"),
191 'd.birth' => array('label' => "Birthday"),
192 'd.tms' => array('label' => "DateModificationShort"),
193 'd.statut' => array('label' => "Status"),
194 'd.import_key' => array('label' => "ImportId"),
195);
196
197// Complete array of fields for columns
198$tableprefix = 'd';
199foreach ($object->fields as $key => $val) {
200 // If $val['visible']==0, then we never show the field
201 if (!empty($val['visible'])) {
202 // Special case already added
203 if (in_array($key, array('fk_adherent_type', 'state_id', 'country'))) { // Already managed by another field key in arrayfields
204 continue;
205 }
206 $visible = (int) dol_eval((string) $val['visible'], 1);
207 $arrayfields[$tableprefix.'.'.$key] = array(
208 'label' => $val['label'],
209 'checked' => (($visible < 0) ? 0 : 1),
210 'enabled' => (int) (abs($visible) != 3 && (bool) dol_eval($val['enabled'], 1)),
211 'position' => (int) $val['position'],
212 'help' => isset($val['help']) ? $val['help'] : ''
213 );
214 }
215}
216
217// Extra fields
218include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_array_fields.tpl.php';
219
220$object->fields = dol_sort_array($object->fields, 'position');
221//$arrayfields['anotherfield'] = array('type'=>'integer', 'label'=>'AnotherField', 'checked'=>1, 'enabled'=>1, 'position'=>90, 'csslist'=>'right');
222
223$arrayfields = dol_sort_array($arrayfields, 'position');
224'@phan-var-force array<string,array{label:string,checked?:int<0,1>,position?:int,help?:string}> $arrayfields'; // dol_sort_array looses type for Phan
225
226// Security check
227$result = restrictedArea($user, 'adherent');
228
229/*
230 * Actions
231 */
232
233if (GETPOST('cancel', 'alpha')) {
234 $action = 'list';
235 $massaction = '';
236}
237if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
238 $massaction = '';
239}
240
241$permissiontoread = $user->hasRight('adherent', 'lire');
242$permissiontodelete = $user->hasRight('adherent', 'supprimer');
243$permissiontoadd = $user->hasRight('adherent', 'creer');
244$uploaddir = $conf->member->dir_output;
245$error = 0;
246
247$parameters = array('socid' => isset($socid) ? $socid : null, 'arrayfields' => &$arrayfields);
248$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
249if ($reshook < 0) {
250 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
251}
252
253if (empty($reshook)) {
254 // Selection of new fields
255 include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
256
257 // Purge search criteria
258 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
259 $statut = '';
260 $filter = '';
261
262 $search = "";
263 $search_id = '';
264 $search_ref = "";
265 $search_lastname = "";
266 $search_firstname = "";
267 $search_gender = "";
268 $search_civility = "";
269 $search_login = "";
270 $search_company = "";
271 $search_type = "";
272 $search_email = "";
273 $search_address = "";
274 $search_zip = "";
275 $search_town = "";
276 $search_state = "";
277 $search_country = '';
278 $search_phone = '';
279 $search_phone_perso = '';
280 $search_phone_mobile = '';
281 $search_morphy = "";
282 $search_categ = "";
283 $search_filter = "";
284 $search_status = "";
285 $search_import_key = '';
286 $search_all = "";
287 $toselect = array();
288 $search_datec_start = '';
289 $search_datec_end = '';
290 $search_datem_start = '';
291 $search_datem_end = '';
292 $search_array_options = array();
293 }
294
295 // Close
296 if ($massaction == 'close' && $user->hasRight('adherent', 'creer')) {
297 $tmpmember = new Adherent($db);
298 $nbclose = 0;
299
300 $db->begin();
301
302 foreach ($toselect as $idtoclose) {
303 $tmpmember->fetch($idtoclose);
304 $result = $tmpmember->resiliate($user);
305
306 if ($result < 0 && !count($tmpmember->errors)) {
307 setEventMessages($tmpmember->error, $tmpmember->errors, 'errors');
308 } else {
309 if ($result > 0) {
310 $nbclose++;
311 }
312 }
313 }
314
315 if (!$error) {
316 setEventMessages($langs->trans("XMembersClosed", $nbclose), null, 'mesgs');
317
318 $db->commit();
319 } else {
320 $db->rollback();
321 }
322 }
323
324 // Create external user
325 if ($massaction == 'createexternaluser' && $user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) {
326 $tmpmember = new Adherent($db);
327 $nbcreated = 0;
328
329 $db->begin();
330
331 foreach ($toselect as $idtoclose) {
332 $tmpmember->fetch($idtoclose);
333
334 if (!empty($tmpmember->socid)) {
335 $nuser = new User($db);
336 $tmpuser = dol_clone($tmpmember, 2);
337
338 $result = $nuser->create_from_member($tmpuser, $tmpmember->login);
339
340 if ($result < 0 && !count($tmpmember->errors)) {
341 setEventMessages($tmpmember->error, $tmpmember->errors, 'errors');
342 } else {
343 if ($result > 0) {
344 $nbcreated++;
345 }
346 }
347 }
348 }
349
350 if (!$error) {
351 setEventMessages($langs->trans("XExternalUserCreated", $nbcreated), null, 'mesgs');
352
353 $db->commit();
354 } else {
355 $db->rollback();
356 }
357 }
358
359 // Create external user
360 if ($action == 'createsubscription_confirm' && $confirm == "yes" && $user->hasRight('adherent', 'creer')) {
361 $tmpmember = new Adherent($db);
362 $adht = new AdherentType($db);
363 $nbcreated = 0;
364 $now = dol_now();
365 $amount = price2num(GETPOST('amount', 'alpha'));
366 // Honour MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH and
367 // MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR the same way as the
368 // single subscription form (adherents/subscription.php), otherwise
369 // the mass action falls back to a one-year duration in
370 // Adherent::subscription() and ignores the global setting.
371 $datesubend = 0;
372 if (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH')) {
373 $datesubend = dol_get_last_day((int) dol_print_date($now, "%Y"), (int) dol_print_date($now, "%m"));
374 } elseif (getDolGlobalInt('MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR')) {
375 $datesubend = dol_get_last_day((int) dol_print_date($now, "%Y"));
376 }
377 $db->begin();
378 foreach ($toselect as $id) {
379 $res = $tmpmember->fetch($id);
380 if ($res > 0) {
381 $result = $tmpmember->subscription($now, $amount, 0, '', '', '', '', '', $datesubend);
382 if ($result < 0) {
383 $error++;
384 } else {
385 $nbcreated++;
386 }
387 } else {
388 $error++;
389 }
390 }
391
392 if (!$error) {
393 setEventMessages($langs->trans("XSubsriptionCreated", $nbcreated), null, 'mesgs');
394 $db->commit();
395 } else {
396 setEventMessages($langs->trans("XSubsriptionError", $error), null, 'mesgs');
397 $db->rollback();
398 }
399 }
400
401 // Mass actions
402 $objectclass = 'Adherent';
403 $objectlabel = 'Members';
404 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
405}
406
407
408/*
409 * View
410 */
411
412$form = new Form($db);
413$formother = new FormOther($db);
414$membertypestatic = new AdherentType($db);
415$memberstatic = new Adherent($db);
416
417$now = dol_now();
418
419// Page Header
420$title = $langs->trans("Members")." - ".$langs->trans("List");
421$help_url = 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder';
422$morejs = array();
423$morecss = array();
424
425
426// Build and execute select
427// --------------------------------------------------------------------
428$sql = "SELECT";
429$sql .= " d.rowid, d.ref, d.login, d.lastname, d.firstname, d.gender, d.societe as company, d.fk_soc,";
430$sql .= " d.civility, d.datefin, d.address, d.zip, d.town, d.state_id, d.country,";
431$sql .= " d.email, d.phone, d.phone_perso, d.phone_mobile, d.birth, d.public, d.photo,";
432$sql .= " d.fk_adherent_type as type_id, d.morphy, d.statut as status, d.datec as date_creation, d.tms as date_modification,";
433$sql .= " d.note_private, d.note_public, d.import_key,";
434$sql .= " s.nom,";
435$sql .= " ".$db->ifsql("d.societe IS NULL", "s.nom", "d.societe")." as companyname,";
436$sql .= " t.libelle as type, t.subscription,";
437$sql .= " state.code_departement as state_code, state.nom as state_name";
438
439// Add fields from extrafields
440if (!empty($extrafields->attributes[$object->table_element]['label'])) {
441 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
442 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
443 }
444}
445
446// Add fields from hooks
447$parameters = array();
448$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
449$sql .= $hookmanager->resPrint;
450$sql = preg_replace('/,\s*$/', '', $sql);
451
452$sqlfields = $sql; // $sql fields to remove for count total
453
454// SQL Alias adherent
455$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d";
456if (!empty($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
457 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (d.rowid = ef.fk_object)";
458}
459$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = d.country)";
460$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = d.state_id)";
461$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on (s.rowid = d.fk_soc)";
462
463// SQL Alias adherent_type
464$sql .= ", ".MAIN_DB_PREFIX."adherent_type as t";
465$sql .= " WHERE d.fk_adherent_type = t.rowid";
466
467$searchCategoryContactList = $search_categ ? array($search_categ) : array();
468$searchCategoryContactOperator = 0;
469// Search for tag/category ($searchCategoryContactList is an array of ID)
470if (!empty($searchCategoryContactList)) {
471 $searchCategoryContactSqlList = array();
472 $listofcategoryid = '';
473 foreach ($searchCategoryContactList as $searchCategoryContact) {
474 if (intval($searchCategoryContact) == -2) {
475 $searchCategoryContactSqlList[] = "NOT EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member)";
476 } elseif (intval($searchCategoryContact) > 0) {
477 if ($searchCategoryContactOperator == 0) {
478 $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member AND ck.fk_categorie = ".((int) $searchCategoryContact).")";
479 } else {
480 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryContact);
481 }
482 }
483 }
484 if ($listofcategoryid) {
485 $searchCategoryContactSqlList[] = " EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member AND ck.fk_categorie IN (".$db->sanitize($listofcategoryid)."))";
486 }
487 if ($searchCategoryContactOperator == 1) {
488 if (!empty($searchCategoryContactSqlList)) {
489 $sql .= " AND (".implode(' OR ', $searchCategoryContactSqlList).")";
490 }
491 } else {
492 if (!empty($searchCategoryContactSqlList)) {
493 $sql .= " AND (".implode(' AND ', $searchCategoryContactSqlList).")";
494 }
495 }
496}
497
498$sql .= " AND d.entity IN (".getEntity('adherent').")";
499if ($search_all) {
500 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
501}
502if ($search_type > 0) {
503 $sql .= " AND t.rowid=".((int) $search_type);
504}
505if ($search_filter == 'withoutsubscription') {
506 $sql .= " AND (datefin IS NULL)";
507}
508if ($search_filter == 'waitingsubscription') {
509 $sql .= " AND (datefin IS NULL AND t.subscription = '1')";
510}
511if ($search_filter == 'uptodate') {
512 //$sql .= " AND (datefin >= '".$db->idate($now)."')";
513 // Up to date subscription OR no subscription required
514 $sql .= " AND (datefin >= '".$db->idate($now)."' OR (datefin IS NULL AND t.subscription = '0'))";
515}
516if ($search_filter == 'outofdate') {
517 $sql .= " AND (datefin < '".$db->idate($now)."')";
518}
519if ($search_status != '') {
520 // Peut valoir un nombre ou liste de nombre separates par virgules
521 $sql .= " AND d.statut in (".$db->sanitize($db->escape($search_status)).")";
522}
523if ($search_morphy != '' && $search_morphy != '-1') {
524 $sql .= natural_search("d.morphy", $search_morphy);
525}
526if ($search_id) {
527 $sql .= natural_search("d.rowid", $search_id);
528}
529if ($search_ref) {
530 $sql .= natural_search("d.ref", $search_ref);
531}
532if ($search_civility) {
533 $sql .= natural_search("d.civility", $search_civility);
534}
535if ($search_firstname) {
536 $sql .= natural_search("d.firstname", $search_firstname);
537}
538if ($search_lastname) {
539 $sql .= natural_search("d.lastname", $search_lastname);
540}
541if ($search_gender != '' && $search_gender != '-1') {
542 $sql .= natural_search("d.gender", $search_gender);
543}
544if ($search_login) {
545 $sql .= natural_search("d.login", $search_login);
546}
547if ($search_company) {
548 $sql .= natural_search(array("s.nom", "d.societe"), $search_company);
549}
550if ($search_email) {
551 $sql .= natural_search("d.email", $search_email);
552}
553if ($search_address) {
554 $sql .= natural_search("d.address", $search_address);
555}
556if ($search_town) {
557 $sql .= natural_search("d.town", $search_town);
558}
559if ($search_zip) {
560 $sql .= natural_search("d.zip", $search_zip);
561}
562if ($search_state) {
563 $sql .= natural_search("state.nom", $search_state);
564}
565if ($search_phone) {
566 $sql .= natural_search("d.phone", $search_phone);
567}
568if ($search_phone_perso) {
569 $sql .= natural_search("d.phone_perso", $search_phone_perso);
570}
571if ($search_phone_mobile) {
572 $sql .= natural_search("d.phone_mobile", $search_phone_mobile);
573}
574if ($search_country) {
575 $sql .= " AND d.country IN (".$db->sanitize($search_country).')';
576}
577if ($search_import_key) {
578 $sql .= natural_search("d.import_key", $search_import_key);
579}
580if ($search_datec_start) {
581 $sql .= " AND d.datec >= '".$db->idate($search_datec_start)."'";
582}
583if ($search_datec_end) {
584 $sql .= " AND d.datec <= '".$db->idate($search_datec_end)."'";
585}
586if ($search_datem_start) {
587 $sql .= " AND d.tms >= '".$db->idate($search_datem_start)."'";
588}
589if ($search_datem_end) {
590 $sql .= " AND d.tms <= '".$db->idate($search_datem_end)."'";
591}
592// Add where from extra fields
593include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
594// Add where from hooks
595$parameters = array();
596$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
597$sql .= $hookmanager->resPrint;
598
599// Count total nb of records
600$nbtotalofrecords = '';
601if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
602 /* The fast and low memory method to get and count full list converts the sql into a sql count */
603 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
604 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
605 $resql = $db->query($sqlforcount);
606 if ($resql) {
607 $objforcount = $db->fetch_object($resql);
608 $nbtotalofrecords = $objforcount->nbtotalofrecords;
609 } else {
610 dol_print_error($db);
611 }
612
613 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
614 $page = 0;
615 $offset = 0;
616 }
617 $db->free($resql);
618}
619//print $sql;
620
621// Complete request and execute it with limit
622$sql .= $db->order($sortfield, $sortorder);
623if ($limit) {
624 $sql .= $db->plimit($limit + 1, $offset);
625}
626
627$resql = $db->query($sql);
628if (!$resql) {
629 dol_print_error($db);
630 exit;
631}
632
633$num = $db->num_rows($resql);
634
635
636// Direct jump if only one record found
637if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
638 $obj = $db->fetch_object($resql);
639 $id = $obj->rowid;
640 header("Location: ".DOL_URL_ROOT.'/adherents/card.php?id='.$id);
641 exit;
642}
643
644// Output page
645// --------------------------------------------------------------------
646
647llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'mod-member page-list bodyforlist'); // Can use also classforhorizontalscrolloftabs instead of bodyforlist for no horizontal scroll
648
649$arrayofselected = is_array($toselect) ? $toselect : array();
650
651
652if ($search_type > 0) {
653 $membertype = new AdherentType($db);
654 $result = $membertype->fetch($search_type);
655 $title .= " (".$membertype->label.")";
656}
657
658// $parameters
659$param = '';
660if (!empty($mode)) {
661 $param .= '&mode='.urlencode($mode);
662}
663if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
664 $param .= '&contextpage='.urlencode($contextpage);
665}
666if ($limit > 0 && $limit != $conf->liste_limit) {
667 $param .= '&limit='.((int) $limit);
668}
669if ($optioncss != '') {
670 $param .= '&optioncss='.urlencode($optioncss);
671}
672if ($groupby != '') {
673 $param .= '&groupby='.urlencode($groupby);
674}
675if ($search_all != "") {
676 $param .= "&search_all=".urlencode($search_all);
677}
678if ($search_ref) {
679 $param .= "&search_ref=".urlencode($search_ref);
680}
681if ($search_civility) {
682 $param .= "&search_civility=".urlencode($search_civility);
683}
684if ($search_firstname) {
685 $param .= "&search_firstname=".urlencode($search_firstname);
686}
687if ($search_lastname) {
688 $param .= "&search_lastname=".urlencode($search_lastname);
689}
690if ($search_gender) {
691 $param .= "&search_gender=".urlencode($search_gender);
692}
693if ($search_login) {
694 $param .= "&search_login=".urlencode($search_login);
695}
696if ($search_email) {
697 $param .= "&search_email=".urlencode($search_email);
698}
699if ($search_categ > 0 || $search_categ == -2) {
700 $param .= "&search_categ=".urlencode((string) ($search_categ));
701}
702if ($search_company) {
703 $param .= "&search_company=".urlencode($search_company);
704}
705if ($search_address != '') {
706 $param .= "&search_address=".urlencode($search_address);
707}
708if ($search_town != '') {
709 $param .= "&search_town=".urlencode($search_town);
710}
711if ($search_zip != '') {
712 $param .= "&search_zip=".urlencode($search_zip);
713}
714if ($search_state != '') {
715 $param .= "&search_state=".urlencode($search_state);
716}
717if ($search_country != '') {
718 $param .= "&search_country=".urlencode($search_country);
719}
720if ($search_phone != '') {
721 $param .= "&search_phone=".urlencode($search_phone);
722}
723if ($search_phone_perso != '') {
724 $param .= "&search_phone_perso=".urlencode($search_phone_perso);
725}
726if ($search_phone_mobile != '') {
727 $param .= "&search_phone_mobile=".urlencode($search_phone_mobile);
728}
729if ($search_filter && $search_filter != '-1') {
730 $param .= "&search_filter=".urlencode($search_filter);
731}
732if ($search_status != "" && $search_status != -3) {
733 $param .= "&search_status=".urlencode($search_status);
734}
735if ($search_import_key != '') {
736 $param .= '&search_import_key='.urlencode($search_import_key);
737}
738if ($search_type > 0) {
739 $param .= "&search_type=".urlencode($search_type);
740}
741if ($search_datec_start) {
742 $param .= '&search_datec_start_day='.dol_print_date($search_datec_start, '%d').'&search_datec_start_month='.dol_print_date($search_datec_start, '%m').'&search_datec_start_year='.dol_print_date($search_datec_start, '%Y');
743}
744if ($search_datem_end) {
745 $param .= '&search_datem_end_day='.dol_print_date($search_datem_end, '%d').'&search_datem_end_month='.dol_print_date($search_datem_end, '%m').'&search_datem_end_year='.dol_print_date($search_datem_end, '%Y');
746}
747
748// Add $param from extra fields
749include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
750
751// List of mass actions available
752$arrayofmassactions = array(
753 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
754 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
755);
756if ($user->hasRight('adherent', 'creer')) {
757 $arrayofmassactions['close'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Resiliate");
758}
759if ($user->hasRight('adherent', 'supprimer')) {
760 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
761}
762if (isModEnabled('category') && $user->hasRight('adherent', 'creer')) {
763 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
764}
765if ($user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) {
766 $arrayofmassactions['createexternaluser'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("CreateExternalUser");
767}
768if ($user->hasRight('adherent', 'creer')) {
769 $arrayofmassactions['createsubscription'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("CreateSubscription");
770}
771if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) {
772 $arrayofmassactions = array();
773}
774$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
775
776print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
777if ($optioncss != '') {
778 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
779}
780print '<input type="hidden" name="token" value="'.newToken().'">';
781print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
782print '<input type="hidden" name="action" value="list">';
783print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
784print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
785print '<input type="hidden" name="page" value="'.$page.'">';
786print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
787print '<input type="hidden" name="page_y" value="">';
788print '<input type="hidden" name="mode" value="'.$mode.'">';
789
790
791$newcardbutton = '';
792$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'));
793$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'));
794$newcardbutton .= dolGetButtonTitleSeparator();
795$newcardbutton .= dolGetButtonTitle($langs->trans('NewMember'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/card.php?action=create', '', $user->hasRight('adherent', 'creer'));
796
797print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
798
799// Add code for pre mass action (confirmation or email presend form)
800$topicmail = "Information";
801$modelmail = "member";
802$objecttmp = new Adherent($db);
803$trackid = 'mem'.$object->id;
804if ($massaction == 'createsubscription') {
805 $tmpmember = new Adherent($db);
806 $adht = new AdherentType($db);
807 $amount = 0;
808 foreach ($toselect as $id) {
809 $now = dol_now();
810 $tmpmember->fetch($id);
811 $res = $adht->fetch($tmpmember->typeid);
812 if ($res > 0) {
813 $amounttmp = $adht->amount;
814 if (!empty($tmpmember->last_subscription_amount) && !GETPOSTISSET('newamount') && is_numeric($amounttmp)) {
815 $amounttmp = max($tmpmember->last_subscription_amount, $amount);
816 }
817 $amount = max(0, $amounttmp, $amount);
818 } else {
819 $error++;
820 }
821 }
822
823 $date = dol_print_date(dol_now(), "%d/%m/%Y");
824 $formquestion = array(
825 array('label' => $langs->trans("DateSubscription"), 'type' => 'other', 'value' => $date),
826 array('label' => $langs->trans("Amount"), 'type' => 'text', 'value' => price($amount, 0, '', 0), 'name' => 'amount'),
827 array('type' => 'separator'),
828 array('label' => $langs->trans("MoreActions"), 'type' => 'other', 'value' => $langs->trans("None").' '.img_warning($langs->trans("WarningNoComplementaryActionDone"))),
829 );
830 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassSubsriptionCreation"), $langs->trans("ConfirmMassSubsriptionCreationQuestion", count($toselect)), "createsubscription_confirm", $formquestion, '', 0, 200, 500, 1);
831}
832include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
833
834if ($search_all) {
835 $setupstring = '';
836 foreach ($fieldstosearchall as $key => $val) {
837 $fieldstosearchall[$key] = $langs->trans($val);
838 $setupstring .= $key."=".$val.";";
839 }
840 print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
841 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
842}
843
844$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
845$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
846$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
847$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
848
849$moreforfilter = '';
850// Filter on categories
851if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
852 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
853 $moreforfilter .= '<div class="divsearchfield">';
854 $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedwidth"').$formother->select_categories(Categorie::TYPE_MEMBER, $search_categ, 'search_categ', 1, $langs->trans("MembersCategoriesShort"));
855 $moreforfilter .= '</div>';
856}
857$parameters = array(
858 'arrayfields' => &$arrayfields,
859);
860$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
861if (empty($reshook)) {
862 $moreforfilter .= $hookmanager->resPrint;
863} else {
864 $moreforfilter = $hookmanager->resPrint;
865}
866if (!empty($moreforfilter)) {
867 print '<div class="liste_titre liste_titre_bydiv centpercent">';
868 print $moreforfilter;
869 print '</div>';
870}
871
872print '<div class="div-table-responsive">';
873print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
874
875// Fields title search
876// --------------------------------------------------------------------
877print '<tr class="liste_titre_filter">';
878
879// Action column
880if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
881 print '<td class="liste_titre center maxwidthsearch">';
882 $searchpicto = $form->showFilterButtons('left');
883 print $searchpicto;
884 print '</td>';
885}
886
887// Line numbering
888if (!empty($arrayfields['d.rowid']['checked'])) {
889 print '<td class="liste_titre">';
890 print '<input class="flat" size="6" type="text" name="search_id" value="'.dol_escape_htmltag($search_id).'">';
891 print '</td>';
892}
893
894// Ref
895if (!empty($arrayfields['d.ref']['checked'])) {
896 print '<td class="liste_titre">';
897 print '<input type="text" class="flat maxwidth75imp" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
898 print '</td>';
899}
900
901// Civility
902if (!empty($arrayfields['d.civility']['checked'])) {
903 print '<td class="liste_titre left">';
904 print '<input class="flat maxwidth50imp" type="text" name="search_civility" value="'.dol_escape_htmltag($search_civility).'"></td>';
905}
906
907// First Name
908if (!empty($arrayfields['d.firstname']['checked'])) {
909 print '<td class="liste_titre left">';
910 print '<input class="flat maxwidth75imp" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).'"></td>';
911}
912
913// Last Name
914if (!empty($arrayfields['d.lastname']['checked'])) {
915 print '<td class="liste_titre left">';
916 print '<input class="flat maxwidth75imp" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).'"></td>';
917}
918
919// Gender
920if (!empty($arrayfields['d.gender']['checked'])) {
921 print '<td class="liste_titre">';
922 $arraygender = array('man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother"));
923 print $form->selectarray('search_gender', $arraygender, $search_gender, 1);
924 print '</td>';
925}
926
927// Company
928if (!empty($arrayfields['d.company']['checked'])) {
929 print '<td class="liste_titre left">';
930 print '<input class="flat maxwidth75imp" type="text" name="search_company" value="'.dol_escape_htmltag($search_company).'"></td>';
931}
932
933// Login
934if (!empty($arrayfields['d.login']['checked'])) {
935 print '<td class="liste_titre left">';
936 print '<input class="flat maxwidth75imp" type="text" name="search_login" value="'.dol_escape_htmltag($search_login).'"></td>';
937}
938
939// Nature
940if (!empty($arrayfields['d.morphy']['checked'])) {
941 print '<td class="liste_titre center">';
942 $arraymorphy = array('mor' => $langs->trans("Moral"), 'phy' => $langs->trans("Physical"));
943 print $form->selectarray('search_morphy', $arraymorphy, $search_morphy, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
944 print '</td>';
945}
946
947// Member Type
948if (!empty($arrayfields['t.libelle']['checked'])) {
949 print '</td>';
950}
951if (!empty($arrayfields['t.libelle']['checked'])) {
952 print '<td class="liste_titre">';
953 $listetype = $membertypestatic->liste_array();
954 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
955 print $form->selectarray("search_type", $listetype, $search_type, 1, 0, 0, '', 0, 32);
956 print '</td>';
957}
958
959// Address - Street
960if (!empty($arrayfields['d.address']['checked'])) {
961 print '<td class="liste_titre left">';
962 print '<input class="flat maxwidth75imp" type="text" name="search_address" value="'.dol_escape_htmltag($search_address).'"></td>';
963}
964
965// ZIP
966if (!empty($arrayfields['d.zip']['checked'])) {
967 print '<td class="liste_titre left">';
968 print '<input class="flat maxwidth50imp" type="text" name="search_zip" value="'.dol_escape_htmltag($search_zip).'"></td>';
969}
970
971// Town/City
972if (!empty($arrayfields['d.town']['checked'])) {
973 print '<td class="liste_titre left">';
974 print '<input class="flat maxwidth75imp" type="text" name="search_town" value="'.dol_escape_htmltag($search_town).'"></td>';
975}
976
977// State / County / Departement
978if (!empty($arrayfields['state.nom']['checked'])) {
979 print '<td class="liste_titre">';
980 print '<input class="flat searchstring maxwidth75imp" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
981 print '</td>';
982}
983
984// Country
985if (!empty($arrayfields['country.code_iso']['checked'])) {
986 print '<td class="liste_titre center">';
987 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
988 print '</td>';
989}
990
991// Phone pro
992if (!empty($arrayfields['d.phone']['checked'])) {
993 print '<td class="liste_titre left">';
994 print '<input class="flat maxwidth75imp" type="text" name="search_phone" value="'.dol_escape_htmltag($search_phone).'"></td>';
995}
996
997// Phone perso
998if (!empty($arrayfields['d.phone_perso']['checked'])) {
999 print '<td class="liste_titre left">';
1000 print '<input class="flat maxwidth75imp" type="text" name="search_phone_perso" value="'.dol_escape_htmltag($search_phone_perso).'"></td>';
1001}
1002
1003// Phone mobile
1004if (!empty($arrayfields['d.phone_mobile']['checked'])) {
1005 print '<td class="liste_titre left">';
1006 print '<input class="flat maxwidth75imp" type="text" name="search_phone_mobile" value="'.dol_escape_htmltag($search_phone_mobile).'"></td>';
1007}
1008
1009// Email
1010if (!empty($arrayfields['d.email']['checked'])) {
1011 print '<td class="liste_titre left">';
1012 print '<input class="flat maxwidth75imp" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).'"></td>';
1013}
1014
1015// End of subscription date
1016if (!empty($arrayfields['d.datefin']['checked'])) {
1017 print '<td class="liste_titre center">';
1018 //$selectarray = array('-1'=>'', 'withoutsubscription'=>$langs->trans("WithoutSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
1019 $selectarray = array('-1' => '', 'waitingsubscription' => $langs->trans("WaitingSubscription"), 'uptodate' => $langs->trans("UpToDate"), 'outofdate' => $langs->trans("OutOfDate"));
1020 print $form->selectarray('search_filter', $selectarray, $search_filter);
1021 print '</td>';
1022}
1023
1024// Extra fields
1025include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1026
1027// Fields from hook
1028$parameters = array('arrayfields' => $arrayfields);
1029$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1030print $hookmanager->resPrint;
1031
1032// Date creation
1033if (!empty($arrayfields['d.datec']['checked'])) {
1034 print '<td class="liste_titre">';
1035 print '<div class="nowrapfordate">';
1036 print $form->selectDate($search_datec_start ? $search_datec_start : -1, 'search_datec_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1037 print '</div>';
1038 print '<div class="nowrapfordate">';
1039 print $form->selectDate($search_datec_end ? $search_datec_end : -1, 'search_datec_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1040 print '</div>';
1041 print '</td>';
1042}
1043
1044// Birthday
1045if (!empty($arrayfields['d.birth']['checked'])) {
1046 print '<td class="liste_titre">';
1047 print '</td>';
1048}
1049
1050// Date modification
1051if (!empty($arrayfields['d.tms']['checked'])) {
1052 print '<td class="liste_titre">';
1053 print '<div class="nowrapfordate">';
1054 print $form->selectDate($search_datem_start ? $search_datem_start : -1, 'search_datem_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1055 print '</div>';
1056 print '<div class="nowrapfordate">';
1057 print $form->selectDate($search_datem_end ? $search_datem_end : -1, 'search_datem_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1058 print '</div>';
1059 print '</td>';
1060}
1061
1062// Import Key
1063if (!empty($arrayfields['d.import_key']['checked'])) {
1064 print '<td class="liste_titre center">';
1065 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1066 print '</td>';
1067}
1068
1069// Status
1070if (!empty($arrayfields['d.statut']['checked'])) {
1071 print '<td class="liste_titre center parentonrightofpage">';
1072 $liststatus = array(
1073 Adherent::STATUS_DRAFT => $langs->trans("Draft"),
1074 Adherent::STATUS_VALIDATED => $langs->trans("Validated"),
1075 Adherent::STATUS_RESILIATED => $langs->trans("MemberStatusResiliatedShort"),
1076 Adherent::STATUS_EXCLUDED => $langs->trans("MemberStatusExcludedShort")
1077 );
1078 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1079 print $form->selectarray('search_status', $liststatus, $search_status, -3, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
1080 print '</td>';
1081}
1082
1083// Action column
1084if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1085 print '<td class="liste_titre center maxwidthsearch">';
1086 $searchpicto = $form->showFilterButtons();
1087 print $searchpicto;
1088 print '</td>';
1089}
1090print '</tr>'."\n";
1091
1092$totalarray = array();
1093$totalarray['nbfield'] = 0;
1094
1095// Fields title label
1096// --------------------------------------------------------------------
1097print '<tr class="liste_titre">';
1098// Action column
1099if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1100 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1101 $totalarray['nbfield']++;
1102}
1103if (!empty($arrayfields['d.rowid']['checked'])) {
1104 // @phan-suppress-next-line PhanTypeInvalidDimOffset
1105 print_liste_field_titre($arrayfields['d.rowid']['label'], $_SERVER["PHP_SELF"], 'd.rowid', '', $param, '', $sortfield, $sortorder, 'center ');
1106 $totalarray['nbfield']++;
1107}
1108if (!empty($arrayfields['d.ref']['checked'])) {
1109 print_liste_field_titre($arrayfields['d.ref']['label'], $_SERVER["PHP_SELF"], 'd.ref', '', $param, '', $sortfield, $sortorder);
1110 $totalarray['nbfield']++;
1111}
1112if (!empty($arrayfields['d.civility']['checked'])) {
1113 print_liste_field_titre($arrayfields['d.civility']['label'], $_SERVER["PHP_SELF"], 'd.civility', '', $param, '', $sortfield, $sortorder);
1114 $totalarray['nbfield']++;
1115}
1116if (!empty($arrayfields['d.firstname']['checked'])) {
1117 print_liste_field_titre($arrayfields['d.firstname']['label'], $_SERVER["PHP_SELF"], 'd.firstname', '', $param, '', $sortfield, $sortorder);
1118 $totalarray['nbfield']++;
1119}
1120if (!empty($arrayfields['d.lastname']['checked'])) {
1121 print_liste_field_titre($arrayfields['d.lastname']['label'], $_SERVER["PHP_SELF"], 'd.lastname', '', $param, '', $sortfield, $sortorder);
1122 $totalarray['nbfield']++;
1123}
1124if (!empty($arrayfields['d.gender']['checked'])) {
1125 print_liste_field_titre($arrayfields['d.gender']['label'], $_SERVER['PHP_SELF'], 'd.gender', $param, "", "", $sortfield, $sortorder);
1126 $totalarray['nbfield']++;
1127}
1128if (!empty($arrayfields['d.company']['checked'])) {
1129 print_liste_field_titre($arrayfields['d.company']['label'], $_SERVER["PHP_SELF"], 'companyname', '', $param, '', $sortfield, $sortorder);
1130 $totalarray['nbfield']++;
1131}
1132if (!empty($arrayfields['d.login']['checked'])) {
1133 print_liste_field_titre($arrayfields['d.login']['label'], $_SERVER["PHP_SELF"], 'd.login', '', $param, '', $sortfield, $sortorder);
1134 $totalarray['nbfield']++;
1135}
1136if (!empty($arrayfields['d.morphy']['checked'])) {
1137 print_liste_field_titre($arrayfields['d.morphy']['label'], $_SERVER["PHP_SELF"], 'd.morphy', '', $param, '', $sortfield, $sortorder);
1138 $totalarray['nbfield']++;
1139}
1140if (!empty($arrayfields['t.libelle']['checked'])) {
1141 print_liste_field_titre($arrayfields['t.libelle']['label'], $_SERVER["PHP_SELF"], 't.libelle', '', $param, '', $sortfield, $sortorder);
1142 $totalarray['nbfield']++;
1143}
1144if (!empty($arrayfields['d.address']['checked'])) {
1145 print_liste_field_titre($arrayfields['d.address']['label'], $_SERVER["PHP_SELF"], 'd.address', '', $param, '', $sortfield, $sortorder);
1146 $totalarray['nbfield']++;
1147}
1148if (!empty($arrayfields['d.zip']['checked'])) {
1149 print_liste_field_titre($arrayfields['d.zip']['label'], $_SERVER["PHP_SELF"], 'd.zip', '', $param, '', $sortfield, $sortorder);
1150 $totalarray['nbfield']++;
1151}
1152if (!empty($arrayfields['d.town']['checked'])) {
1153 print_liste_field_titre($arrayfields['d.town']['label'], $_SERVER["PHP_SELF"], 'd.town', '', $param, '', $sortfield, $sortorder);
1154 $totalarray['nbfield']++;
1155}
1156if (!empty($arrayfields['state.nom']['checked'])) {
1157 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1158 $totalarray['nbfield']++;
1159}
1160if (!empty($arrayfields['country.code_iso']['checked'])) {
1161 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1162 $totalarray['nbfield']++;
1163}
1164if (!empty($arrayfields['d.phone']['checked'])) {
1165 print_liste_field_titre($arrayfields['d.phone']['label'], $_SERVER["PHP_SELF"], 'd.phone', '', $param, '', $sortfield, $sortorder);
1166 $totalarray['nbfield']++;
1167}
1168if (!empty($arrayfields['d.phone_perso']['checked'])) {
1169 print_liste_field_titre($arrayfields['d.phone_perso']['label'], $_SERVER["PHP_SELF"], 'd.phone_perso', '', $param, '', $sortfield, $sortorder);
1170 $totalarray['nbfield']++;
1171}
1172if (!empty($arrayfields['d.phone_mobile']['checked'])) {
1173 print_liste_field_titre($arrayfields['d.phone_mobile']['label'], $_SERVER["PHP_SELF"], 'd.phone_mobile', '', $param, '', $sortfield, $sortorder);
1174 $totalarray['nbfield']++;
1175}
1176if (!empty($arrayfields['d.email']['checked'])) {
1177 print_liste_field_titre($arrayfields['d.email']['label'], $_SERVER["PHP_SELF"], 'd.email', '', $param, '', $sortfield, $sortorder);
1178 $totalarray['nbfield']++;
1179}
1180if (!empty($arrayfields['d.datefin']['checked'])) {
1181 print_liste_field_titre($arrayfields['d.datefin']['label'], $_SERVER["PHP_SELF"], 'd.datefin,t.subscription', '', $param, '', $sortfield, $sortorder, 'center ');
1182 $totalarray['nbfield']++;
1183}
1184// Extra fields
1185include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1186
1187// Hook fields
1188$parameters = array('arrayfields' => $arrayfields, 'totalarray' => &$totalarray, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1189$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1190print $hookmanager->resPrint;
1191
1192if (!empty($arrayfields['d.datec']['checked'])) {
1193 print_liste_field_titre($arrayfields['d.datec']['label'], $_SERVER["PHP_SELF"], "d.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1194 $totalarray['nbfield']++;
1195}
1196if (!empty($arrayfields['d.birth']['checked'])) {
1197 print_liste_field_titre($arrayfields['d.birth']['label'], $_SERVER["PHP_SELF"], "d.birth", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1198 $totalarray['nbfield']++;
1199}
1200if (!empty($arrayfields['d.tms']['checked'])) {
1201 print_liste_field_titre($arrayfields['d.tms']['label'], $_SERVER["PHP_SELF"], "d.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1202 $totalarray['nbfield']++;
1203}
1204if (!empty($arrayfields['d.import_key']['checked'])) {
1205 print_liste_field_titre($arrayfields['d.import_key']['label'], $_SERVER["PHP_SELF"], "d.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1206 $totalarray['nbfield']++;
1207}
1208if (!empty($arrayfields['d.statut']['checked'])) {
1209 print_liste_field_titre($arrayfields['d.statut']['label'], $_SERVER["PHP_SELF"], "d.statut,t.subscription,d.datefin", "", $param, '', $sortfield, $sortorder, 'center ');
1210 $totalarray['nbfield']++;
1211}
1212if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1213 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
1214 $totalarray['nbfield']++;
1215}
1216print "</tr>\n";
1217
1218// Loop on record
1219// --------------------------------------------------------------------
1220$i = 0;
1221$savnbfield = $totalarray['nbfield'];
1222$totalarray = array();
1223$totalarray['nbfield'] = 0;
1224$imaxinloop = ($limit ? min($num, $limit) : $num);
1225while ($i < $imaxinloop) {
1226 $obj = $db->fetch_object($resql);
1227 if (empty($obj)) {
1228 break; // Should not happen
1229 }
1230
1231 $datefin = $db->jdate($obj->datefin);
1232
1233 $memberstatic->id = $obj->rowid;
1234 $memberstatic->ref = $obj->ref;
1235 $memberstatic->civility_code = $obj->civility;
1236 $memberstatic->login = $obj->login;
1237 $memberstatic->lastname = $obj->lastname;
1238 $memberstatic->firstname = $obj->firstname;
1239 $memberstatic->gender = $obj->gender;
1240 $memberstatic->status = $obj->status;
1241 $memberstatic->datefin = $datefin;
1242 $memberstatic->socid = $obj->fk_soc;
1243 $memberstatic->photo = $obj->photo;
1244 $memberstatic->email = $obj->email;
1245 $memberstatic->morphy = $obj->morphy;
1246 $memberstatic->note_public = $obj->note_public;
1247 $memberstatic->note_private = $obj->note_private;
1248 $memberstatic->need_subscription = $obj->subscription;
1249
1250 if (!empty($obj->fk_soc)) {
1251 $memberstatic->fetch_thirdparty();
1252 if ($memberstatic->thirdparty->id > 0) {
1253 $companyname = $memberstatic->thirdparty->name;
1254 $companynametoshow = $memberstatic->thirdparty->getNomUrl(1);
1255 } else {
1256 $companyname = null;
1257 $companynametoshow = null;
1258 }
1259 } else {
1260 $companyname = $obj->company;
1261 $companynametoshow = $obj->company;
1262 }
1263 $memberstatic->company = (string) $companyname;
1264
1265 $object = $memberstatic;
1266
1267 if ($mode == 'kanban') {
1268 if ($i == 0) {
1269 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1270 print '<div class="box-flex-container kanban">';
1271 }
1272 $membertypestatic->id = $obj->type_id;
1273 $membertypestatic->label = $obj->type;
1274
1275 $memberstatic->type = $membertypestatic->label;
1276 $memberstatic->photo = $obj->photo;
1277
1278 // Output Kanban
1279 print $memberstatic->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
1280 if ($i == (min($num, $limit) - 1)) {
1281 print '</div>';
1282 print '</td></tr>';
1283 }
1284 } else {
1285 // Show line of result
1286 $j = 0;
1287 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
1288
1289 // Action column
1290 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1291 print '<td class="nowrap center">';
1292 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1293 $selected = 0;
1294 if (in_array($obj->rowid, $arrayofselected)) {
1295 $selected = 1;
1296 }
1297 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1298 }
1299 print '</td>';
1300 if (!$i) {
1301 $totalarray['nbfield']++;
1302 }
1303 }
1304 // Technical ID
1305 if (!empty($arrayfields['d.rowid']['checked'])) {
1306 print '<td class="center" data-key="id">'.$obj->rowid.'</td>';
1307 if (!$i) {
1308 $totalarray['nbfield']++;
1309 }
1310 }
1311 // Ref
1312 if (!empty($arrayfields['d.ref']['checked'])) {
1313 print "<td>";
1314 print $memberstatic->getNomUrl(-1, 0, 'card', 'ref', '', -1, 0, 1);
1315 print "</td>\n";
1316 if (!$i) {
1317 $totalarray['nbfield']++;
1318 }
1319 }
1320 // Title/Civility
1321 if (!empty($arrayfields['d.civility']['checked'])) {
1322 print "<td>";
1323 print dol_escape_htmltag($obj->civility);
1324 print "</td>\n";
1325 if (!$i) {
1326 $totalarray['nbfield']++;
1327 }
1328 }
1329 // Firstname
1330 if (!empty($arrayfields['d.firstname']['checked'])) {
1331 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->firstname).'">';
1332 print $memberstatic->getNomUrl(0, 0, 'card', 'firstname');
1333 //print $obj->firstname;
1334 print "</td>\n";
1335 if (!$i) {
1336 $totalarray['nbfield']++;
1337 }
1338 }
1339 // Lastname
1340 if (!empty($arrayfields['d.lastname']['checked'])) {
1341 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->lastname).'">';
1342 print $memberstatic->getNomUrl(0, 0, 'card', 'lastname');
1343 //print $obj->lastname;
1344 print "</td>\n";
1345 if (!$i) {
1346 $totalarray['nbfield']++;
1347 }
1348 }
1349 // Gender
1350 if (!empty($arrayfields['d.gender']['checked'])) {
1351 print '<td>';
1352 if ($obj->gender) {
1353 print $langs->trans("Gender".$obj->gender);
1354 }
1355 print '</td>';
1356 if (!$i) {
1357 $totalarray['nbfield']++;
1358 }
1359 }
1360 // Company
1361 if (!empty($arrayfields['d.company']['checked'])) {
1362 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($companyname).'">';
1363 print $companynametoshow;
1364 print "</td>\n";
1365 }
1366 // Login
1367 if (!empty($arrayfields['d.login']['checked'])) {
1368 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->login).'">'.$obj->login."</td>\n";
1369 if (!$i) {
1370 $totalarray['nbfield']++;
1371 }
1372 }
1373 // Nature (Moral/Physical)
1374 if (!empty($arrayfields['d.morphy']['checked'])) {
1375 print '<td class="center">';
1376 print $memberstatic->getmorphylib('', 2);
1377 print "</td>\n";
1378 if (!$i) {
1379 $totalarray['nbfield']++;
1380 }
1381 }
1382 // Type label
1383 if (!empty($arrayfields['t.libelle']['checked'])) {
1384 $membertypestatic->id = $obj->type_id;
1385 $membertypestatic->label = $obj->type;
1386 print '<td class="nowraponall">';
1387 print $membertypestatic->getNomUrl(1, 32);
1388 print '</td>';
1389 if (!$i) {
1390 $totalarray['nbfield']++;
1391 }
1392 }
1393 // Address
1394 if (!empty($arrayfields['d.address']['checked'])) {
1395 print '<td class="nocellnopadd tdoverflowmax200" title="'.dol_escape_htmltag($obj->address).'">';
1396 print dol_escape_htmltag($obj->address);
1397 print '</td>';
1398 if (!$i) {
1399 $totalarray['nbfield']++;
1400 }
1401 }
1402 // Zip
1403 if (!empty($arrayfields['d.zip']['checked'])) {
1404 print '<td class="nocellnopadd">';
1405 print dol_escape_htmltag($obj->zip);
1406 print '</td>';
1407 if (!$i) {
1408 $totalarray['nbfield']++;
1409 }
1410 }
1411 // Town
1412 if (!empty($arrayfields['d.town']['checked'])) {
1413 print '<td class="nocellnopadd">';
1414 print dol_escape_htmltag($obj->town);
1415 print '</td>';
1416 if (!$i) {
1417 $totalarray['nbfield']++;
1418 }
1419 }
1420 // State / County / Departement
1421 if (!empty($arrayfields['state.nom']['checked'])) {
1422 print "<td>";
1423 print dol_escape_htmltag($obj->state_name);
1424 print "</td>\n";
1425 if (!$i) {
1426 $totalarray['nbfield']++;
1427 }
1428 }
1429 // Country
1430 if (!empty($arrayfields['country.code_iso']['checked'])) {
1431 $tmparray = getCountry($obj->country, 'all');
1432 print '<td class="center tdoverflowmax100" title="'.dol_escape_htmltag($tmparray['label']).'">';
1433 print dol_escape_htmltag($tmparray['label']);
1434 print '</td>';
1435 if (!$i) {
1436 $totalarray['nbfield']++;
1437 }
1438 }
1439 // Phone pro
1440 if (!empty($arrayfields['d.phone']['checked'])) {
1441 print '<td class="nocellnopadd">';
1442 print dol_print_phone($obj->phone);
1443 print '</td>';
1444 if (!$i) {
1445 $totalarray['nbfield']++;
1446 }
1447 }
1448 // Phone perso
1449 if (!empty($arrayfields['d.phone_perso']['checked'])) {
1450 print '<td class="nocellnopadd">';
1451 print dol_print_phone($obj->phone_perso);
1452 print '</td>';
1453 if (!$i) {
1454 $totalarray['nbfield']++;
1455 }
1456 }
1457 // Phone mobile
1458 if (!empty($arrayfields['d.phone_mobile']['checked'])) {
1459 print '<td class="nocellnopadd">';
1460 print dol_print_phone($obj->phone_mobile);
1461 print '</td>';
1462 if (!$i) {
1463 $totalarray['nbfield']++;
1464 }
1465 }
1466 // EMail
1467 if (!empty($arrayfields['d.email']['checked'])) {
1468 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->email).'">';
1469 print dol_print_email($obj->email, 0, 0, 1, 64, 1, 1);
1470 print "</td>\n";
1471 if (!$i) {
1472 $totalarray['nbfield']++;
1473 }
1474 }
1475 // End of subscription date
1476 $datefin = $db->jdate($obj->datefin);
1477 if (!empty($arrayfields['d.datefin']['checked'])) {
1478 $s = '';
1479 if ($datefin) {
1480 $s .= dol_print_date($datefin, 'day');
1481 if ($memberstatic->hasDelay()) {
1482 $textlate = ' ('.$langs->trans("DateReference").' > '.$langs->trans("DateToday").' '.(ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24) >= 0 ? '+' : '').ceil($conf->adherent->subscription->warning_delay / 60 / 60 / 24).' '.$langs->trans("days").')';
1483 $s .= " ".img_warning($langs->trans("SubscriptionLate").$textlate);
1484 }
1485 } else {
1486 if (!empty($obj->subscription)) {
1487 $s .= '<span class="opacitymedium">'.$langs->trans("SubscriptionNotReceived").'</span>';
1488 if ($obj->status > 0) {
1489 $s .= " ".img_warning();
1490 }
1491 } else {
1492 $s .= '<span class="opacitymedium">'.$langs->trans("SubscriptionNotNeeded").'</span>';
1493 }
1494 }
1495 print '<td class="nowraponall center tdoverflowmax150" title="'.dolPrintHTMLForAttribute(dol_string_nohtmltag($s)).'">';
1496 print $s;
1497 print '</td>';
1498 if (!$i) {
1499 $totalarray['nbfield']++;
1500 }
1501 }
1502 // Extra fields
1503 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1504 // Fields from hook
1505 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1506 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1507 print $hookmanager->resPrint;
1508 // Date creation
1509 if (!empty($arrayfields['d.datec']['checked'])) {
1510 print '<td class="nowrap center">';
1511 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1512 print '</td>';
1513 if (!$i) {
1514 $totalarray['nbfield']++;
1515 }
1516 }
1517 // Birth
1518 if (!empty($arrayfields['d.birth']['checked'])) {
1519 print '<td class="nowrap center">';
1520 print dol_print_date($db->jdate($obj->birth), 'day', 'tzuser');
1521 print '</td>';
1522 if (!$i) {
1523 $totalarray['nbfield']++;
1524 }
1525 }
1526 // Date modification
1527 if (!empty($arrayfields['d.tms']['checked'])) {
1528 print '<td class="nowrap center">';
1529 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1530 print '</td>';
1531 if (!$i) {
1532 $totalarray['nbfield']++;
1533 }
1534 }
1535 // Import key
1536 if (!empty($arrayfields['d.import_key']['checked'])) {
1537 print '<td class="tdoverflowmax100 center" title="'.dol_escape_htmltag($obj->import_key).'">';
1538 print dol_escape_htmltag($obj->import_key);
1539 print "</td>\n";
1540 if (!$i) {
1541 $totalarray['nbfield']++;
1542 }
1543 }
1544 // Status
1545 if (!empty($arrayfields['d.statut']['checked'])) {
1546 print '<td class="nowrap center">';
1547 print $memberstatic->LibStatut($obj->status, $obj->subscription, $datefin, 5);
1548 print '</td>';
1549 if (!$i) {
1550 $totalarray['nbfield']++;
1551 }
1552 }
1553 // Action column
1554 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1555 print '<td class="center">';
1556 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1557 $selected = 0;
1558 if (in_array($obj->rowid, $arrayofselected)) {
1559 $selected = 1;
1560 }
1561 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1562 }
1563 print '</td>';
1564 if (!$i) {
1565 $totalarray['nbfield']++;
1566 }
1567 }
1568
1569 print '</tr>'."\n";
1570 }
1571 $i++;
1572}
1573
1574// Show total line
1575include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1576
1577
1578// If no record found
1579if ($num == 0) {
1580 $colspan = 1;
1581 foreach ($arrayfields as $key => $val) {
1582 if (!empty($val['checked'])) {
1583 $colspan++;
1584 }
1585 }
1586 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1587}
1588
1589$db->free($resql);
1590
1591$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1592$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1593print $hookmanager->resPrint;
1594
1595print '</table>'."\n";
1596print '</div>'."\n";
1597
1598print '</form>'."\n";
1599
1600if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
1601 $hidegeneratedfilelistifempty = 1;
1602 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1603 $hidegeneratedfilelistifempty = 0;
1604 }
1605
1606 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
1607 $formfile = new FormFile($db);
1608
1609 // Show list of available documents
1610 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1611 $urlsource .= str_replace('&amp;', '&', $param);
1612
1613 $filedir = $diroutputmassaction;
1614 $genallowed = $permissiontoread;
1615 $delallowed = $permissiontoadd;
1616
1617 print $formfile->showdocuments('massfilesarea_'.$object->module, '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1618}
1619
1620// End of page
1621llxFooter();
1622$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:87
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 members of a foundation.
const STATUS_EXCLUDED
Excluded.
const STATUS_DRAFT
Draft status.
const STATUS_RESILIATED
Resiliated (membership end and was not renew)
const STATUS_VALIDATED
Validated status.
Class to manage members type.
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
dol_get_last_day($year, $month=12, $gm=false)
Return GMT time for last day of a month or year.
Definition date.lib.php:619
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)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ="&nbsp;", $withpicto='', $titlealt='', $adddivfloat=0, $morecss='paddingright')
Format phone numbers according to country.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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...
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0, $morecss='paddingrightonly')
Show EMail link formatted for HTML output.
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_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.