dolibarr 21.0.3
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 $db->begin();
367 foreach ($toselect as $id) {
368 $res = $tmpmember->fetch($id);
369 if ($res > 0) {
370 $result = $tmpmember->subscription($now, $amount);
371 if ($result < 0) {
372 $error++;
373 } else {
374 $nbcreated++;
375 }
376 } else {
377 $error++;
378 }
379 }
380
381 if (!$error) {
382 setEventMessages($langs->trans("XSubsriptionCreated", $nbcreated), null, 'mesgs');
383 $db->commit();
384 } else {
385 setEventMessages($langs->trans("XSubsriptionError", $error), null, 'mesgs');
386 $db->rollback();
387 }
388 }
389
390 // Mass actions
391 $objectclass = 'Adherent';
392 $objectlabel = 'Members';
393 include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php';
394}
395
396
397/*
398 * View
399 */
400
401$form = new Form($db);
402$formother = new FormOther($db);
403$membertypestatic = new AdherentType($db);
404$memberstatic = new Adherent($db);
405
406$now = dol_now();
407
408// Page Header
409$title = $langs->trans("Members")." - ".$langs->trans("List");
410$help_url = 'EN:Module_Foundations|FR:Module_Adh&eacute;rents|ES:M&oacute;dulo_Miembros|DE:Modul_Mitglieder';
411$morejs = array();
412$morecss = array();
413
414
415// Build and execute select
416// --------------------------------------------------------------------
417$sql = "SELECT";
418$sql .= " d.rowid, d.ref, d.login, d.lastname, d.firstname, d.gender, d.societe as company, d.fk_soc,";
419$sql .= " d.civility, d.datefin, d.address, d.zip, d.town, d.state_id, d.country,";
420$sql .= " d.email, d.phone, d.phone_perso, d.phone_mobile, d.birth, d.public, d.photo,";
421$sql .= " d.fk_adherent_type as type_id, d.morphy, d.statut as status, d.datec as date_creation, d.tms as date_modification,";
422$sql .= " d.note_private, d.note_public, d.import_key,";
423$sql .= " s.nom,";
424$sql .= " ".$db->ifsql("d.societe IS NULL", "s.nom", "d.societe")." as companyname,";
425$sql .= " t.libelle as type, t.subscription,";
426$sql .= " state.code_departement as state_code, state.nom as state_name";
427
428// Add fields from extrafields
429if (!empty($extrafields->attributes[$object->table_element]['label'])) {
430 foreach ($extrafields->attributes[$object->table_element]['label'] as $key => $val) {
431 $sql .= ($extrafields->attributes[$object->table_element]['type'][$key] != 'separate' ? ", ef.".$key." as options_".$key : "");
432 }
433}
434
435// Add fields from hooks
436$parameters = array();
437$reshook = $hookmanager->executeHooks('printFieldListSelect', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
438$sql .= $hookmanager->resPrint;
439$sql = preg_replace('/,\s*$/', '', $sql);
440
441$sqlfields = $sql; // $sql fields to remove for count total
442
443// SQL Alias adherent
444$sql .= " FROM ".MAIN_DB_PREFIX."adherent as d";
445if (!empty($extrafields->attributes[$object->table_element]['label']) && count($extrafields->attributes[$object->table_element]['label'])) {
446 $sql .= " LEFT JOIN ".MAIN_DB_PREFIX.$object->table_element."_extrafields as ef on (d.rowid = ef.fk_object)";
447}
448$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = d.country)";
449$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = d.state_id)";
450$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on (s.rowid = d.fk_soc)";
451
452// SQL Alias adherent_type
453$sql .= ", ".MAIN_DB_PREFIX."adherent_type as t";
454$sql .= " WHERE d.fk_adherent_type = t.rowid";
455
456$searchCategoryContactList = $search_categ ? array($search_categ) : array();
457$searchCategoryContactOperator = 0;
458// Search for tag/category ($searchCategoryContactList is an array of ID)
459if (!empty($searchCategoryContactList)) {
460 $searchCategoryContactSqlList = array();
461 $listofcategoryid = '';
462 foreach ($searchCategoryContactList as $searchCategoryContact) {
463 if (intval($searchCategoryContact) == -2) {
464 $searchCategoryContactSqlList[] = "NOT EXISTS (SELECT ck.fk_categorie FROM ".MAIN_DB_PREFIX."categorie_member as ck WHERE d.rowid = ck.fk_member)";
465 } elseif (intval($searchCategoryContact) > 0) {
466 if ($searchCategoryContactOperator == 0) {
467 $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).")";
468 } else {
469 $listofcategoryid .= ($listofcategoryid ? ', ' : '') .((int) $searchCategoryContact);
470 }
471 }
472 }
473 if ($listofcategoryid) {
474 $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)."))";
475 }
476 if ($searchCategoryContactOperator == 1) {
477 if (!empty($searchCategoryContactSqlList)) {
478 $sql .= " AND (".implode(' OR ', $searchCategoryContactSqlList).")";
479 }
480 } else {
481 if (!empty($searchCategoryContactSqlList)) {
482 $sql .= " AND (".implode(' AND ', $searchCategoryContactSqlList).")";
483 }
484 }
485}
486
487$sql .= " AND d.entity IN (".getEntity('adherent').")";
488if ($search_all) {
489 $sql .= natural_search(array_keys($fieldstosearchall), $search_all);
490}
491if ($search_type > 0) {
492 $sql .= " AND t.rowid=".((int) $search_type);
493}
494if ($search_filter == 'withoutsubscription') {
495 $sql .= " AND (datefin IS NULL)";
496}
497if ($search_filter == 'waitingsubscription') {
498 $sql .= " AND (datefin IS NULL AND t.subscription = '1')";
499}
500if ($search_filter == 'uptodate') {
501 //$sql .= " AND (datefin >= '".$db->idate($now)."')";
502 // Up to date subscription OR no subscription required
503 $sql .= " AND (datefin >= '".$db->idate($now)."' OR (datefin IS NULL AND t.subscription = '0'))";
504}
505if ($search_filter == 'outofdate') {
506 $sql .= " AND (datefin < '".$db->idate($now)."')";
507}
508if ($search_status != '') {
509 // Peut valoir un nombre ou liste de nombre separates par virgules
510 $sql .= " AND d.statut in (".$db->sanitize($db->escape($search_status)).")";
511}
512if ($search_morphy != '' && $search_morphy != '-1') {
513 $sql .= natural_search("d.morphy", $search_morphy);
514}
515if ($search_id) {
516 $sql .= natural_search("d.rowid", $search_id);
517}
518if ($search_ref) {
519 $sql .= natural_search("d.ref", $search_ref);
520}
521if ($search_civility) {
522 $sql .= natural_search("d.civility", $search_civility);
523}
524if ($search_firstname) {
525 $sql .= natural_search("d.firstname", $search_firstname);
526}
527if ($search_lastname) {
528 $sql .= natural_search("d.lastname", $search_lastname);
529}
530if ($search_gender != '' && $search_gender != '-1') {
531 $sql .= natural_search("d.gender", $search_gender);
532}
533if ($search_login) {
534 $sql .= natural_search("d.login", $search_login);
535}
536if ($search_company) {
537 $sql .= natural_search(array("s.nom", "d.societe"), $search_company);
538}
539if ($search_email) {
540 $sql .= natural_search("d.email", $search_email);
541}
542if ($search_address) {
543 $sql .= natural_search("d.address", $search_address);
544}
545if ($search_town) {
546 $sql .= natural_search("d.town", $search_town);
547}
548if ($search_zip) {
549 $sql .= natural_search("d.zip", $search_zip);
550}
551if ($search_state) {
552 $sql .= natural_search("state.nom", $search_state);
553}
554if ($search_phone) {
555 $sql .= natural_search("d.phone", $search_phone);
556}
557if ($search_phone_perso) {
558 $sql .= natural_search("d.phone_perso", $search_phone_perso);
559}
560if ($search_phone_mobile) {
561 $sql .= natural_search("d.phone_mobile", $search_phone_mobile);
562}
563if ($search_country) {
564 $sql .= " AND d.country IN (".$db->sanitize($search_country).')';
565}
566if ($search_import_key) {
567 $sql .= natural_search("d.import_key", $search_import_key);
568}
569if ($search_datec_start) {
570 $sql .= " AND d.datec >= '".$db->idate($search_datec_start)."'";
571}
572if ($search_datec_end) {
573 $sql .= " AND d.datec <= '".$db->idate($search_datec_end)."'";
574}
575if ($search_datem_start) {
576 $sql .= " AND d.tms >= '".$db->idate($search_datem_start)."'";
577}
578if ($search_datem_end) {
579 $sql .= " AND d.tms <= '".$db->idate($search_datem_end)."'";
580}
581// Add where from extra fields
582include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php';
583// Add where from hooks
584$parameters = array();
585$reshook = $hookmanager->executeHooks('printFieldListWhere', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
586$sql .= $hookmanager->resPrint;
587
588// Count total nb of records
589$nbtotalofrecords = '';
590if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) {
591 /* The fast and low memory method to get and count full list converts the sql into a sql count */
592 $sqlforcount = preg_replace('/^'.preg_quote($sqlfields, '/').'/', 'SELECT COUNT(*) as nbtotalofrecords', $sql);
593 $sqlforcount = preg_replace('/GROUP BY .*$/', '', $sqlforcount);
594 $resql = $db->query($sqlforcount);
595 if ($resql) {
596 $objforcount = $db->fetch_object($resql);
597 $nbtotalofrecords = $objforcount->nbtotalofrecords;
598 } else {
599 dol_print_error($db);
600 }
601
602 if (($page * $limit) > $nbtotalofrecords) { // if total resultset is smaller than the paging size (filtering), goto and load page 0
603 $page = 0;
604 $offset = 0;
605 }
606 $db->free($resql);
607}
608//print $sql;
609
610// Complete request and execute it with limit
611$sql .= $db->order($sortfield, $sortorder);
612if ($limit) {
613 $sql .= $db->plimit($limit + 1, $offset);
614}
615
616$resql = $db->query($sql);
617if (!$resql) {
618 dol_print_error($db);
619 exit;
620}
621
622$num = $db->num_rows($resql);
623
624
625// Direct jump if only one record found
626if ($num == 1 && getDolGlobalInt('MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE') && $search_all && !$page) {
627 $obj = $db->fetch_object($resql);
628 $id = $obj->rowid;
629 header("Location: ".DOL_URL_ROOT.'/adherents/card.php?id='.$id);
630 exit;
631}
632
633// Output page
634// --------------------------------------------------------------------
635
636llxHeader('', $title, $help_url, '', 0, 0, $morejs, $morecss, '', 'mod-member page-list bodyforlist'); // Can use also classforhorizontalscrolloftabs instead of bodyforlist for no horizontal scroll
637
638$arrayofselected = is_array($toselect) ? $toselect : array();
639
640
641if ($search_type > 0) {
642 $membertype = new AdherentType($db);
643 $result = $membertype->fetch($search_type);
644 $title .= " (".$membertype->label.")";
645}
646
647// $parameters
648$param = '';
649if (!empty($mode)) {
650 $param .= '&mode='.urlencode($mode);
651}
652if (!empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) {
653 $param .= '&contextpage='.urlencode($contextpage);
654}
655if ($limit > 0 && $limit != $conf->liste_limit) {
656 $param .= '&limit='.((int) $limit);
657}
658if ($optioncss != '') {
659 $param .= '&optioncss='.urlencode($optioncss);
660}
661if ($groupby != '') {
662 $param .= '&groupby='.urlencode($groupby);
663}
664if ($search_all != "") {
665 $param .= "&search_all=".urlencode($search_all);
666}
667if ($search_ref) {
668 $param .= "&search_ref=".urlencode($search_ref);
669}
670if ($search_civility) {
671 $param .= "&search_civility=".urlencode($search_civility);
672}
673if ($search_firstname) {
674 $param .= "&search_firstname=".urlencode($search_firstname);
675}
676if ($search_lastname) {
677 $param .= "&search_lastname=".urlencode($search_lastname);
678}
679if ($search_gender) {
680 $param .= "&search_gender=".urlencode($search_gender);
681}
682if ($search_login) {
683 $param .= "&search_login=".urlencode($search_login);
684}
685if ($search_email) {
686 $param .= "&search_email=".urlencode($search_email);
687}
688if ($search_categ > 0 || $search_categ == -2) {
689 $param .= "&search_categ=".urlencode((string) ($search_categ));
690}
691if ($search_company) {
692 $param .= "&search_company=".urlencode($search_company);
693}
694if ($search_address != '') {
695 $param .= "&search_address=".urlencode($search_address);
696}
697if ($search_town != '') {
698 $param .= "&search_town=".urlencode($search_town);
699}
700if ($search_zip != '') {
701 $param .= "&search_zip=".urlencode($search_zip);
702}
703if ($search_state != '') {
704 $param .= "&search_state=".urlencode($search_state);
705}
706if ($search_country != '') {
707 $param .= "&search_country=".urlencode($search_country);
708}
709if ($search_phone != '') {
710 $param .= "&search_phone=".urlencode($search_phone);
711}
712if ($search_phone_perso != '') {
713 $param .= "&search_phone_perso=".urlencode($search_phone_perso);
714}
715if ($search_phone_mobile != '') {
716 $param .= "&search_phone_mobile=".urlencode($search_phone_mobile);
717}
718if ($search_filter && $search_filter != '-1') {
719 $param .= "&search_filter=".urlencode($search_filter);
720}
721if ($search_status != "" && $search_status != -3) {
722 $param .= "&search_status=".urlencode($search_status);
723}
724if ($search_import_key != '') {
725 $param .= '&search_import_key='.urlencode($search_import_key);
726}
727if ($search_type > 0) {
728 $param .= "&search_type=".urlencode($search_type);
729}
730if ($search_datec_start) {
731 $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');
732}
733if ($search_datem_end) {
734 $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');
735}
736
737// Add $param from extra fields
738include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
739
740// List of mass actions available
741$arrayofmassactions = array(
742 //'presend'=>img_picto('', 'email', 'class="pictofixedwidth"').$langs->trans("SendByMail"),
743 //'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
744);
745if ($user->hasRight('adherent', 'creer')) {
746 $arrayofmassactions['close'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Resiliate");
747}
748if ($user->hasRight('adherent', 'supprimer')) {
749 $arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
750}
751if (isModEnabled('category') && $user->hasRight('adherent', 'creer')) {
752 $arrayofmassactions['preaffecttag'] = img_picto('', 'category', 'class="pictofixedwidth"').$langs->trans("AffectTag");
753}
754if ($user->hasRight('adherent', 'creer') && $user->hasRight('user', 'user', 'creer')) {
755 $arrayofmassactions['createexternaluser'] = img_picto('', 'user', 'class="pictofixedwidth"').$langs->trans("CreateExternalUser");
756}
757if ($user->hasRight('adherent', 'creer')) {
758 $arrayofmassactions['createsubscription'] = img_picto('', 'payment', 'class="pictofixedwidth"').$langs->trans("CreateSubscription");
759}
760if (GETPOSTINT('nomassaction') || in_array($massaction, array('presend', 'predelete', 'preaffecttag'))) {
761 $arrayofmassactions = array();
762}
763$massactionbutton = $form->selectMassAction('', $arrayofmassactions);
764
765print '<form method="POST" id="searchFormList" action="'.$_SERVER["PHP_SELF"].'">'."\n";
766if ($optioncss != '') {
767 print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
768}
769print '<input type="hidden" name="token" value="'.newToken().'">';
770print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
771print '<input type="hidden" name="action" value="list">';
772print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
773print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
774print '<input type="hidden" name="page" value="'.$page.'">';
775print '<input type="hidden" name="contextpage" value="'.$contextpage.'">';
776print '<input type="hidden" name="page_y" value="">';
777print '<input type="hidden" name="mode" value="'.$mode.'">';
778
779
780$newcardbutton = '';
781$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'));
782$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'));
783$newcardbutton .= dolGetButtonTitleSeparator();
784$newcardbutton .= dolGetButtonTitle($langs->trans('NewMember'), '', 'fa fa-plus-circle', DOL_URL_ROOT.'/adherents/card.php?action=create', '', $user->hasRight('adherent', 'creer'));
785
786print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $object->picto, 0, $newcardbutton, '', $limit, 0, 0, 1);
787
788// Add code for pre mass action (confirmation or email presend form)
789$topicmail = "Information";
790$modelmail = "member";
791$objecttmp = new Adherent($db);
792$trackid = 'mem'.$object->id;
793if ($massaction == 'createsubscription') {
794 $tmpmember = new Adherent($db);
795 $adht = new AdherentType($db);
796 $amount = 0;
797 foreach ($toselect as $id) {
798 $now = dol_now();
799 $tmpmember->fetch($id);
800 $res = $adht->fetch($tmpmember->typeid);
801 if ($res > 0) {
802 $amounttmp = $adht->amount;
803 if (!empty($tmpmember->last_subscription_amount) && !GETPOSTISSET('newamount') && is_numeric($amounttmp)) {
804 $amounttmp = max($tmpmember->last_subscription_amount, $amount);
805 }
806 $amount = max(0, $amounttmp, $amount);
807 } else {
808 $error++;
809 }
810 }
811
812 $date = dol_print_date(dol_now(), "%d/%m/%Y");
813 $formquestion = array(
814 array('label' => $langs->trans("DateSubscription"), 'type' => 'other', 'value' => $date),
815 array('label' => $langs->trans("Amount"), 'type' => 'text', 'value' => price($amount, 0, '', 0), 'name' => 'amount'),
816 array('type' => 'separator'),
817 array('label' => $langs->trans("MoreActions"), 'type' => 'other', 'value' => $langs->trans("None").' '.img_warning($langs->trans("WarningNoComplementaryActionDone"))),
818 );
819 print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassSubsriptionCreation"), $langs->trans("ConfirmMassSubsriptionCreationQuestion", count($toselect)), "createsubscription_confirm", $formquestion, '', 0, 200, 500, 1);
820}
821include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
822
823if ($search_all) {
824 $setupstring = '';
825 foreach ($fieldstosearchall as $key => $val) {
826 $fieldstosearchall[$key] = $langs->trans($val);
827 $setupstring .= $key."=".$val.";";
828 }
829 print '<!-- Search done like if MYOBJECT_QUICKSEARCH_ON_FIELDS = '.$setupstring.' -->'."\n";
830 print '<div class="divsearchfieldfilter">'.$langs->trans("FilterOnInto", $search_all).implode(', ', $fieldstosearchall).'</div>'."\n";
831}
832
833$varpage = empty($contextpage) ? $_SERVER["PHP_SELF"] : $contextpage;
834$htmlofselectarray = $form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage, getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')); // This also change content of $arrayfields with user setup
835$selectedfields = ($mode != 'kanban' ? $htmlofselectarray : '');
836$selectedfields .= (count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : '');
837
838$moreforfilter = '';
839// Filter on categories
840if (isModEnabled('category') && $user->hasRight('categorie', 'lire')) {
841 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
842 $moreforfilter .= '<div class="divsearchfield">';
843 $moreforfilter .= img_picto($langs->trans('Categories'), 'category', 'class="pictofixedwidth"').$formother->select_categories(Categorie::TYPE_MEMBER, $search_categ, 'search_categ', 1, $langs->trans("MembersCategoriesShort"));
844 $moreforfilter .= '</div>';
845}
846$parameters = array(
847 'arrayfields' => &$arrayfields,
848);
849$reshook = $hookmanager->executeHooks('printFieldPreListTitle', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
850if (empty($reshook)) {
851 $moreforfilter .= $hookmanager->resPrint;
852} else {
853 $moreforfilter = $hookmanager->resPrint;
854}
855if (!empty($moreforfilter)) {
856 print '<div class="liste_titre liste_titre_bydiv centpercent">';
857 print $moreforfilter;
858 print '</div>';
859}
860
861print '<div class="div-table-responsive">';
862print '<table class="tagtable nobottomiftotal liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
863
864// Fields title search
865// --------------------------------------------------------------------
866print '<tr class="liste_titre_filter">';
867
868// Action column
869if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
870 print '<td class="liste_titre center maxwidthsearch">';
871 $searchpicto = $form->showFilterButtons('left');
872 print $searchpicto;
873 print '</td>';
874}
875
876// Line numbering
877if (!empty($arrayfields['d.rowid']['checked'])) {
878 print '<td class="liste_titre">';
879 print '<input class="flat" size="6" type="text" name="search_id" value="'.dol_escape_htmltag($search_id).'">';
880 print '</td>';
881}
882
883// Ref
884if (!empty($arrayfields['d.ref']['checked'])) {
885 print '<td class="liste_titre">';
886 print '<input type="text" class="flat maxwidth75imp" name="search_ref" value="'.dol_escape_htmltag($search_ref).'">';
887 print '</td>';
888}
889
890// Civility
891if (!empty($arrayfields['d.civility']['checked'])) {
892 print '<td class="liste_titre left">';
893 print '<input class="flat maxwidth50imp" type="text" name="search_civility" value="'.dol_escape_htmltag($search_civility).'"></td>';
894}
895
896// First Name
897if (!empty($arrayfields['d.firstname']['checked'])) {
898 print '<td class="liste_titre left">';
899 print '<input class="flat maxwidth75imp" type="text" name="search_firstname" value="'.dol_escape_htmltag($search_firstname).'"></td>';
900}
901
902// Last Name
903if (!empty($arrayfields['d.lastname']['checked'])) {
904 print '<td class="liste_titre left">';
905 print '<input class="flat maxwidth75imp" type="text" name="search_lastname" value="'.dol_escape_htmltag($search_lastname).'"></td>';
906}
907
908// Gender
909if (!empty($arrayfields['d.gender']['checked'])) {
910 print '<td class="liste_titre">';
911 $arraygender = array('man' => $langs->trans("Genderman"), 'woman' => $langs->trans("Genderwoman"), 'other' => $langs->trans("Genderother"));
912 print $form->selectarray('search_gender', $arraygender, $search_gender, 1);
913 print '</td>';
914}
915
916// Company
917if (!empty($arrayfields['d.company']['checked'])) {
918 print '<td class="liste_titre left">';
919 print '<input class="flat maxwidth75imp" type="text" name="search_company" value="'.dol_escape_htmltag($search_company).'"></td>';
920}
921
922// Login
923if (!empty($arrayfields['d.login']['checked'])) {
924 print '<td class="liste_titre left">';
925 print '<input class="flat maxwidth75imp" type="text" name="search_login" value="'.dol_escape_htmltag($search_login).'"></td>';
926}
927
928// Nature
929if (!empty($arrayfields['d.morphy']['checked'])) {
930 print '<td class="liste_titre center">';
931 $arraymorphy = array('mor' => $langs->trans("Moral"), 'phy' => $langs->trans("Physical"));
932 print $form->selectarray('search_morphy', $arraymorphy, $search_morphy, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100');
933 print '</td>';
934}
935
936// Member Type
937if (!empty($arrayfields['t.libelle']['checked'])) {
938 print '</td>';
939}
940if (!empty($arrayfields['t.libelle']['checked'])) {
941 print '<td class="liste_titre">';
942 $listetype = $membertypestatic->liste_array();
943 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
944 print $form->selectarray("search_type", $listetype, $search_type, 1, 0, 0, '', 0, 32);
945 print '</td>';
946}
947
948// Address - Street
949if (!empty($arrayfields['d.address']['checked'])) {
950 print '<td class="liste_titre left">';
951 print '<input class="flat maxwidth75imp" type="text" name="search_address" value="'.dol_escape_htmltag($search_address).'"></td>';
952}
953
954// ZIP
955if (!empty($arrayfields['d.zip']['checked'])) {
956 print '<td class="liste_titre left">';
957 print '<input class="flat maxwidth50imp" type="text" name="search_zip" value="'.dol_escape_htmltag($search_zip).'"></td>';
958}
959
960// Town/City
961if (!empty($arrayfields['d.town']['checked'])) {
962 print '<td class="liste_titre left">';
963 print '<input class="flat maxwidth75imp" type="text" name="search_town" value="'.dol_escape_htmltag($search_town).'"></td>';
964}
965
966// State / County / Departement
967if (!empty($arrayfields['state.nom']['checked'])) {
968 print '<td class="liste_titre">';
969 print '<input class="flat searchstring maxwidth75imp" type="text" name="search_state" value="'.dol_escape_htmltag($search_state).'">';
970 print '</td>';
971}
972
973// Country
974if (!empty($arrayfields['country.code_iso']['checked'])) {
975 print '<td class="liste_titre center">';
976 print $form->select_country($search_country, 'search_country', '', 0, 'minwidth100imp maxwidth100');
977 print '</td>';
978}
979
980// Phone pro
981if (!empty($arrayfields['d.phone']['checked'])) {
982 print '<td class="liste_titre left">';
983 print '<input class="flat maxwidth75imp" type="text" name="search_phone" value="'.dol_escape_htmltag($search_phone).'"></td>';
984}
985
986// Phone perso
987if (!empty($arrayfields['d.phone_perso']['checked'])) {
988 print '<td class="liste_titre left">';
989 print '<input class="flat maxwidth75imp" type="text" name="search_phone_perso" value="'.dol_escape_htmltag($search_phone_perso).'"></td>';
990}
991
992// Phone mobile
993if (!empty($arrayfields['d.phone_mobile']['checked'])) {
994 print '<td class="liste_titre left">';
995 print '<input class="flat maxwidth75imp" type="text" name="search_phone_mobile" value="'.dol_escape_htmltag($search_phone_mobile).'"></td>';
996}
997
998// Email
999if (!empty($arrayfields['d.email']['checked'])) {
1000 print '<td class="liste_titre left">';
1001 print '<input class="flat maxwidth75imp" type="text" name="search_email" value="'.dol_escape_htmltag($search_email).'"></td>';
1002}
1003
1004// End of subscription date
1005if (!empty($arrayfields['d.datefin']['checked'])) {
1006 print '<td class="liste_titre center">';
1007 //$selectarray = array('-1'=>'', 'withoutsubscription'=>$langs->trans("WithoutSubscription"), 'uptodate'=>$langs->trans("UpToDate"), 'outofdate'=>$langs->trans("OutOfDate"));
1008 $selectarray = array('-1' => '', 'waitingsubscription' => $langs->trans("WaitingSubscription"), 'uptodate' => $langs->trans("UpToDate"), 'outofdate' => $langs->trans("OutOfDate"));
1009 print $form->selectarray('search_filter', $selectarray, $search_filter);
1010 print '</td>';
1011}
1012
1013// Extra fields
1014include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php';
1015
1016// Fields from hook
1017$parameters = array('arrayfields' => $arrayfields);
1018$reshook = $hookmanager->executeHooks('printFieldListOption', $parameters); // Note that $action and $object may have been modified by hook
1019print $hookmanager->resPrint;
1020
1021// Date creation
1022if (!empty($arrayfields['d.datec']['checked'])) {
1023 print '<td class="liste_titre">';
1024 print '<div class="nowrapfordate">';
1025 print $form->selectDate($search_datec_start ? $search_datec_start : -1, 'search_datec_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1026 print '</div>';
1027 print '<div class="nowrapfordate">';
1028 print $form->selectDate($search_datec_end ? $search_datec_end : -1, 'search_datec_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1029 print '</div>';
1030 print '</td>';
1031}
1032
1033// Birthday
1034if (!empty($arrayfields['d.birth']['checked'])) {
1035 print '<td class="liste_titre">';
1036 print '</td>';
1037}
1038
1039// Date modification
1040if (!empty($arrayfields['d.tms']['checked'])) {
1041 print '<td class="liste_titre">';
1042 print '<div class="nowrapfordate">';
1043 print $form->selectDate($search_datem_start ? $search_datem_start : -1, 'search_datem_start_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('From'));
1044 print '</div>';
1045 print '<div class="nowrapfordate">';
1046 print $form->selectDate($search_datem_end ? $search_datem_end : -1, 'search_datem_end_', 0, 0, 1, '', 1, 0, 0, '', '', '', '', 1, '', $langs->trans('to'));
1047 print '</div>';
1048 print '</td>';
1049}
1050
1051// Import Key
1052if (!empty($arrayfields['d.import_key']['checked'])) {
1053 print '<td class="liste_titre center">';
1054 print '<input class="flat searchstring maxwidth50" type="text" name="search_import_key" value="'.dol_escape_htmltag($search_import_key).'">';
1055 print '</td>';
1056}
1057
1058// Status
1059if (!empty($arrayfields['d.statut']['checked'])) {
1060 print '<td class="liste_titre center parentonrightofpage">';
1061 $liststatus = array(
1062 Adherent::STATUS_DRAFT => $langs->trans("Draft"),
1063 Adherent::STATUS_VALIDATED => $langs->trans("Validated"),
1064 Adherent::STATUS_RESILIATED => $langs->trans("MemberStatusResiliatedShort"),
1065 Adherent::STATUS_EXCLUDED => $langs->trans("MemberStatusExcludedShort")
1066 );
1067 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
1068 print $form->selectarray('search_status', $liststatus, $search_status, -3, 0, 0, '', 0, 0, 0, '', 'search_status width100 onrightofpage');
1069 print '</td>';
1070}
1071
1072// Action column
1073if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1074 print '<td class="liste_titre center maxwidthsearch">';
1075 $searchpicto = $form->showFilterButtons();
1076 print $searchpicto;
1077 print '</td>';
1078}
1079print '</tr>'."\n";
1080
1081$totalarray = array();
1082$totalarray['nbfield'] = 0;
1083
1084// Fields title label
1085// --------------------------------------------------------------------
1086print '<tr class="liste_titre">';
1087// Action column
1088if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1089 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'center maxwidthsearch actioncolumn ');
1090 $totalarray['nbfield']++;
1091}
1092if (!empty($arrayfields['d.rowid']['checked'])) {
1093 // @phan-suppress-next-line PhanTypeInvalidDimOffset
1094 print_liste_field_titre($arrayfields['d.rowid']['label'], $_SERVER["PHP_SELF"], 'd.rowid', '', $param, '', $sortfield, $sortorder, 'center ');
1095 $totalarray['nbfield']++;
1096}
1097if (!empty($arrayfields['d.ref']['checked'])) {
1098 print_liste_field_titre($arrayfields['d.ref']['label'], $_SERVER["PHP_SELF"], 'd.ref', '', $param, '', $sortfield, $sortorder);
1099 $totalarray['nbfield']++;
1100}
1101if (!empty($arrayfields['d.civility']['checked'])) {
1102 print_liste_field_titre($arrayfields['d.civility']['label'], $_SERVER["PHP_SELF"], 'd.civility', '', $param, '', $sortfield, $sortorder);
1103 $totalarray['nbfield']++;
1104}
1105if (!empty($arrayfields['d.firstname']['checked'])) {
1106 print_liste_field_titre($arrayfields['d.firstname']['label'], $_SERVER["PHP_SELF"], 'd.firstname', '', $param, '', $sortfield, $sortorder);
1107 $totalarray['nbfield']++;
1108}
1109if (!empty($arrayfields['d.lastname']['checked'])) {
1110 print_liste_field_titre($arrayfields['d.lastname']['label'], $_SERVER["PHP_SELF"], 'd.lastname', '', $param, '', $sortfield, $sortorder);
1111 $totalarray['nbfield']++;
1112}
1113if (!empty($arrayfields['d.gender']['checked'])) {
1114 print_liste_field_titre($arrayfields['d.gender']['label'], $_SERVER['PHP_SELF'], 'd.gender', $param, "", "", $sortfield, $sortorder);
1115 $totalarray['nbfield']++;
1116}
1117if (!empty($arrayfields['d.company']['checked'])) {
1118 print_liste_field_titre($arrayfields['d.company']['label'], $_SERVER["PHP_SELF"], 'companyname', '', $param, '', $sortfield, $sortorder);
1119 $totalarray['nbfield']++;
1120}
1121if (!empty($arrayfields['d.login']['checked'])) {
1122 print_liste_field_titre($arrayfields['d.login']['label'], $_SERVER["PHP_SELF"], 'd.login', '', $param, '', $sortfield, $sortorder);
1123 $totalarray['nbfield']++;
1124}
1125if (!empty($arrayfields['d.morphy']['checked'])) {
1126 print_liste_field_titre($arrayfields['d.morphy']['label'], $_SERVER["PHP_SELF"], 'd.morphy', '', $param, '', $sortfield, $sortorder);
1127 $totalarray['nbfield']++;
1128}
1129if (!empty($arrayfields['t.libelle']['checked'])) {
1130 print_liste_field_titre($arrayfields['t.libelle']['label'], $_SERVER["PHP_SELF"], 't.libelle', '', $param, '', $sortfield, $sortorder);
1131 $totalarray['nbfield']++;
1132}
1133if (!empty($arrayfields['d.address']['checked'])) {
1134 print_liste_field_titre($arrayfields['d.address']['label'], $_SERVER["PHP_SELF"], 'd.address', '', $param, '', $sortfield, $sortorder);
1135 $totalarray['nbfield']++;
1136}
1137if (!empty($arrayfields['d.zip']['checked'])) {
1138 print_liste_field_titre($arrayfields['d.zip']['label'], $_SERVER["PHP_SELF"], 'd.zip', '', $param, '', $sortfield, $sortorder);
1139 $totalarray['nbfield']++;
1140}
1141if (!empty($arrayfields['d.town']['checked'])) {
1142 print_liste_field_titre($arrayfields['d.town']['label'], $_SERVER["PHP_SELF"], 'd.town', '', $param, '', $sortfield, $sortorder);
1143 $totalarray['nbfield']++;
1144}
1145if (!empty($arrayfields['state.nom']['checked'])) {
1146 print_liste_field_titre($arrayfields['state.nom']['label'], $_SERVER["PHP_SELF"], "state.nom", "", $param, '', $sortfield, $sortorder);
1147 $totalarray['nbfield']++;
1148}
1149if (!empty($arrayfields['country.code_iso']['checked'])) {
1150 print_liste_field_titre($arrayfields['country.code_iso']['label'], $_SERVER["PHP_SELF"], "country.code_iso", "", $param, '', $sortfield, $sortorder, 'center ');
1151 $totalarray['nbfield']++;
1152}
1153if (!empty($arrayfields['d.phone']['checked'])) {
1154 print_liste_field_titre($arrayfields['d.phone']['label'], $_SERVER["PHP_SELF"], 'd.phone', '', $param, '', $sortfield, $sortorder);
1155 $totalarray['nbfield']++;
1156}
1157if (!empty($arrayfields['d.phone_perso']['checked'])) {
1158 print_liste_field_titre($arrayfields['d.phone_perso']['label'], $_SERVER["PHP_SELF"], 'd.phone_perso', '', $param, '', $sortfield, $sortorder);
1159 $totalarray['nbfield']++;
1160}
1161if (!empty($arrayfields['d.phone_mobile']['checked'])) {
1162 print_liste_field_titre($arrayfields['d.phone_mobile']['label'], $_SERVER["PHP_SELF"], 'd.phone_mobile', '', $param, '', $sortfield, $sortorder);
1163 $totalarray['nbfield']++;
1164}
1165if (!empty($arrayfields['d.email']['checked'])) {
1166 print_liste_field_titre($arrayfields['d.email']['label'], $_SERVER["PHP_SELF"], 'd.email', '', $param, '', $sortfield, $sortorder);
1167 $totalarray['nbfield']++;
1168}
1169if (!empty($arrayfields['d.datefin']['checked'])) {
1170 print_liste_field_titre($arrayfields['d.datefin']['label'], $_SERVER["PHP_SELF"], 'd.datefin,t.subscription', '', $param, '', $sortfield, $sortorder, 'center ');
1171 $totalarray['nbfield']++;
1172}
1173// Extra fields
1174include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php';
1175
1176// Hook fields
1177$parameters = array('arrayfields' => $arrayfields, 'totalarray' => &$totalarray, 'param' => $param, 'sortfield' => $sortfield, 'sortorder' => $sortorder);
1178$reshook = $hookmanager->executeHooks('printFieldListTitle', $parameters); // Note that $action and $object may have been modified by hook
1179print $hookmanager->resPrint;
1180
1181if (!empty($arrayfields['d.datec']['checked'])) {
1182 print_liste_field_titre($arrayfields['d.datec']['label'], $_SERVER["PHP_SELF"], "d.datec", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1183 $totalarray['nbfield']++;
1184}
1185if (!empty($arrayfields['d.birth']['checked'])) {
1186 print_liste_field_titre($arrayfields['d.birth']['label'], $_SERVER["PHP_SELF"], "d.birth", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1187 $totalarray['nbfield']++;
1188}
1189if (!empty($arrayfields['d.tms']['checked'])) {
1190 print_liste_field_titre($arrayfields['d.tms']['label'], $_SERVER["PHP_SELF"], "d.tms", "", $param, '', $sortfield, $sortorder, 'center nowrap ');
1191 $totalarray['nbfield']++;
1192}
1193if (!empty($arrayfields['d.import_key']['checked'])) {
1194 print_liste_field_titre($arrayfields['d.import_key']['label'], $_SERVER["PHP_SELF"], "d.import_key", "", $param, '', $sortfield, $sortorder, 'center ');
1195 $totalarray['nbfield']++;
1196}
1197if (!empty($arrayfields['d.statut']['checked'])) {
1198 print_liste_field_titre($arrayfields['d.statut']['label'], $_SERVER["PHP_SELF"], "d.statut,t.subscription,d.datefin", "", $param, '', $sortfield, $sortorder, 'center ');
1199 $totalarray['nbfield']++;
1200}
1201if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1202 print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"], "", '', '', '', $sortfield, $sortorder, 'maxwidthsearch center ');
1203 $totalarray['nbfield']++;
1204}
1205print "</tr>\n";
1206
1207// Loop on record
1208// --------------------------------------------------------------------
1209$i = 0;
1210$savnbfield = $totalarray['nbfield'];
1211$totalarray = array();
1212$totalarray['nbfield'] = 0;
1213$imaxinloop = ($limit ? min($num, $limit) : $num);
1214while ($i < $imaxinloop) {
1215 $obj = $db->fetch_object($resql);
1216 if (empty($obj)) {
1217 break; // Should not happen
1218 }
1219
1220 $datefin = $db->jdate($obj->datefin);
1221
1222 $memberstatic->id = $obj->rowid;
1223 $memberstatic->ref = $obj->ref;
1224 $memberstatic->civility_code = $obj->civility;
1225 $memberstatic->login = $obj->login;
1226 $memberstatic->lastname = $obj->lastname;
1227 $memberstatic->firstname = $obj->firstname;
1228 $memberstatic->gender = $obj->gender;
1229 $memberstatic->status = $obj->status;
1230 $memberstatic->datefin = $datefin;
1231 $memberstatic->socid = $obj->fk_soc;
1232 $memberstatic->photo = $obj->photo;
1233 $memberstatic->email = $obj->email;
1234 $memberstatic->morphy = $obj->morphy;
1235 $memberstatic->note_public = $obj->note_public;
1236 $memberstatic->note_private = $obj->note_private;
1237 $memberstatic->need_subscription = $obj->subscription;
1238
1239 if (!empty($obj->fk_soc)) {
1240 $memberstatic->fetch_thirdparty();
1241 if ($memberstatic->thirdparty->id > 0) {
1242 $companyname = $memberstatic->thirdparty->name;
1243 $companynametoshow = $memberstatic->thirdparty->getNomUrl(1);
1244 } else {
1245 $companyname = null;
1246 $companynametoshow = null;
1247 }
1248 } else {
1249 $companyname = $obj->company;
1250 $companynametoshow = $obj->company;
1251 }
1252 $memberstatic->company = (string) $companyname;
1253
1254 $object = $memberstatic;
1255
1256 if ($mode == 'kanban') {
1257 if ($i == 0) {
1258 print '<tr class="trkanban"><td colspan="'.$savnbfield.'">';
1259 print '<div class="box-flex-container kanban">';
1260 }
1261 $membertypestatic->id = $obj->type_id;
1262 $membertypestatic->label = $obj->type;
1263
1264 $memberstatic->type = $membertypestatic->label;
1265 $memberstatic->photo = $obj->photo;
1266
1267 // Output Kanban
1268 print $memberstatic->getKanbanView('', array('selected' => in_array($object->id, $arrayofselected)));
1269 if ($i == (min($num, $limit) - 1)) {
1270 print '</div>';
1271 print '</td></tr>';
1272 }
1273 } else {
1274 // Show line of result
1275 $j = 0;
1276 print '<tr data-rowid="'.$object->id.'" class="oddeven">';
1277
1278 // Action column
1279 if (getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1280 print '<td class="nowrap center">';
1281 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1282 $selected = 0;
1283 if (in_array($obj->rowid, $arrayofselected)) {
1284 $selected = 1;
1285 }
1286 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1287 }
1288 print '</td>';
1289 if (!$i) {
1290 $totalarray['nbfield']++;
1291 }
1292 }
1293 // Technical ID
1294 if (!empty($arrayfields['d.rowid']['checked'])) {
1295 print '<td class="center" data-key="id">'.$obj->rowid.'</td>';
1296 if (!$i) {
1297 $totalarray['nbfield']++;
1298 }
1299 }
1300 // Ref
1301 if (!empty($arrayfields['d.ref']['checked'])) {
1302 print "<td>";
1303 print $memberstatic->getNomUrl(-1, 0, 'card', 'ref', '', -1, 0, 1);
1304 print "</td>\n";
1305 if (!$i) {
1306 $totalarray['nbfield']++;
1307 }
1308 }
1309 // Title/Civility
1310 if (!empty($arrayfields['d.civility']['checked'])) {
1311 print "<td>";
1312 print dol_escape_htmltag($obj->civility);
1313 print "</td>\n";
1314 if (!$i) {
1315 $totalarray['nbfield']++;
1316 }
1317 }
1318 // Firstname
1319 if (!empty($arrayfields['d.firstname']['checked'])) {
1320 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->firstname).'">';
1321 print $memberstatic->getNomUrl(0, 0, 'card', 'firstname');
1322 //print $obj->firstname;
1323 print "</td>\n";
1324 if (!$i) {
1325 $totalarray['nbfield']++;
1326 }
1327 }
1328 // Lastname
1329 if (!empty($arrayfields['d.lastname']['checked'])) {
1330 print '<td class="tdoverflowmax125" title="'.dol_escape_htmltag($obj->lastname).'">';
1331 print $memberstatic->getNomUrl(0, 0, 'card', 'lastname');
1332 //print $obj->lastname;
1333 print "</td>\n";
1334 if (!$i) {
1335 $totalarray['nbfield']++;
1336 }
1337 }
1338 // Gender
1339 if (!empty($arrayfields['d.gender']['checked'])) {
1340 print '<td>';
1341 if ($obj->gender) {
1342 print $langs->trans("Gender".$obj->gender);
1343 }
1344 print '</td>';
1345 if (!$i) {
1346 $totalarray['nbfield']++;
1347 }
1348 }
1349 // Company
1350 if (!empty($arrayfields['d.company']['checked'])) {
1351 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($companyname).'">';
1352 print $companynametoshow;
1353 print "</td>\n";
1354 }
1355 // Login
1356 if (!empty($arrayfields['d.login']['checked'])) {
1357 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->login).'">'.$obj->login."</td>\n";
1358 if (!$i) {
1359 $totalarray['nbfield']++;
1360 }
1361 }
1362 // Nature (Moral/Physical)
1363 if (!empty($arrayfields['d.morphy']['checked'])) {
1364 print '<td class="center">';
1365 print $memberstatic->getmorphylib('', 2);
1366 print "</td>\n";
1367 if (!$i) {
1368 $totalarray['nbfield']++;
1369 }
1370 }
1371 // Type label
1372 if (!empty($arrayfields['t.libelle']['checked'])) {
1373 $membertypestatic->id = $obj->type_id;
1374 $membertypestatic->label = $obj->type;
1375 print '<td class="nowraponall">';
1376 print $membertypestatic->getNomUrl(1, 32);
1377 print '</td>';
1378 if (!$i) {
1379 $totalarray['nbfield']++;
1380 }
1381 }
1382 // Address
1383 if (!empty($arrayfields['d.address']['checked'])) {
1384 print '<td class="nocellnopadd tdoverflowmax200" title="'.dol_escape_htmltag($obj->address).'">';
1385 print dol_escape_htmltag($obj->address);
1386 print '</td>';
1387 if (!$i) {
1388 $totalarray['nbfield']++;
1389 }
1390 }
1391 // Zip
1392 if (!empty($arrayfields['d.zip']['checked'])) {
1393 print '<td class="nocellnopadd">';
1394 print dol_escape_htmltag($obj->zip);
1395 print '</td>';
1396 if (!$i) {
1397 $totalarray['nbfield']++;
1398 }
1399 }
1400 // Town
1401 if (!empty($arrayfields['d.town']['checked'])) {
1402 print '<td class="nocellnopadd">';
1403 print dol_escape_htmltag($obj->town);
1404 print '</td>';
1405 if (!$i) {
1406 $totalarray['nbfield']++;
1407 }
1408 }
1409 // State / County / Departement
1410 if (!empty($arrayfields['state.nom']['checked'])) {
1411 print "<td>";
1412 print dol_escape_htmltag($obj->state_name);
1413 print "</td>\n";
1414 if (!$i) {
1415 $totalarray['nbfield']++;
1416 }
1417 }
1418 // Country
1419 if (!empty($arrayfields['country.code_iso']['checked'])) {
1420 $tmparray = getCountry($obj->country, 'all');
1421 print '<td class="center tdoverflowmax100" title="'.dol_escape_htmltag($tmparray['label']).'">';
1422 print dol_escape_htmltag($tmparray['label']);
1423 print '</td>';
1424 if (!$i) {
1425 $totalarray['nbfield']++;
1426 }
1427 }
1428 // Phone pro
1429 if (!empty($arrayfields['d.phone']['checked'])) {
1430 print '<td class="nocellnopadd">';
1431 print dol_print_phone($obj->phone);
1432 print '</td>';
1433 if (!$i) {
1434 $totalarray['nbfield']++;
1435 }
1436 }
1437 // Phone perso
1438 if (!empty($arrayfields['d.phone_perso']['checked'])) {
1439 print '<td class="nocellnopadd">';
1440 print dol_print_phone($obj->phone_perso);
1441 print '</td>';
1442 if (!$i) {
1443 $totalarray['nbfield']++;
1444 }
1445 }
1446 // Phone mobile
1447 if (!empty($arrayfields['d.phone_mobile']['checked'])) {
1448 print '<td class="nocellnopadd">';
1449 print dol_print_phone($obj->phone_mobile);
1450 print '</td>';
1451 if (!$i) {
1452 $totalarray['nbfield']++;
1453 }
1454 }
1455 // EMail
1456 if (!empty($arrayfields['d.email']['checked'])) {
1457 print '<td class="tdoverflowmax150" title="'.dol_escape_htmltag($obj->email).'">';
1458 print dol_print_email($obj->email, 0, 0, 1, 64, 1, 1);
1459 print "</td>\n";
1460 if (!$i) {
1461 $totalarray['nbfield']++;
1462 }
1463 }
1464 // End of subscription date
1465 $datefin = $db->jdate($obj->datefin);
1466 if (!empty($arrayfields['d.datefin']['checked'])) {
1467 $s = '';
1468 if ($datefin) {
1469 $s .= dol_print_date($datefin, 'day');
1470 if ($memberstatic->hasDelay()) {
1471 $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").')';
1472 $s .= " ".img_warning($langs->trans("SubscriptionLate").$textlate);
1473 }
1474 } else {
1475 if (!empty($obj->subscription)) {
1476 $s .= '<span class="opacitymedium">'.$langs->trans("SubscriptionNotReceived").'</span>';
1477 if ($obj->status > 0) {
1478 $s .= " ".img_warning();
1479 }
1480 } else {
1481 $s .= '<span class="opacitymedium">'.$langs->trans("SubscriptionNotNeeded").'</span>';
1482 }
1483 }
1484 print '<td class="nowraponall center tdoverflowmax150" title="'.dolPrintHTMLForAttribute(dol_string_nohtmltag($s)).'">';
1485 print $s;
1486 print '</td>';
1487 if (!$i) {
1488 $totalarray['nbfield']++;
1489 }
1490 }
1491 // Extra fields
1492 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php';
1493 // Fields from hook
1494 $parameters = array('arrayfields' => $arrayfields, 'obj' => $obj, 'i' => $i, 'totalarray' => &$totalarray);
1495 $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
1496 print $hookmanager->resPrint;
1497 // Date creation
1498 if (!empty($arrayfields['d.datec']['checked'])) {
1499 print '<td class="nowrap center">';
1500 print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser');
1501 print '</td>';
1502 if (!$i) {
1503 $totalarray['nbfield']++;
1504 }
1505 }
1506 // Birth
1507 if (!empty($arrayfields['d.birth']['checked'])) {
1508 print '<td class="nowrap center">';
1509 print dol_print_date($db->jdate($obj->birth), 'day', 'tzuser');
1510 print '</td>';
1511 if (!$i) {
1512 $totalarray['nbfield']++;
1513 }
1514 }
1515 // Date modification
1516 if (!empty($arrayfields['d.tms']['checked'])) {
1517 print '<td class="nowrap center">';
1518 print dol_print_date($db->jdate($obj->date_modification), 'dayhour', 'tzuser');
1519 print '</td>';
1520 if (!$i) {
1521 $totalarray['nbfield']++;
1522 }
1523 }
1524 // Import key
1525 if (!empty($arrayfields['d.import_key']['checked'])) {
1526 print '<td class="tdoverflowmax100 center" title="'.dol_escape_htmltag($obj->import_key).'">';
1527 print dol_escape_htmltag($obj->import_key);
1528 print "</td>\n";
1529 if (!$i) {
1530 $totalarray['nbfield']++;
1531 }
1532 }
1533 // Status
1534 if (!empty($arrayfields['d.statut']['checked'])) {
1535 print '<td class="nowrap center">';
1536 print $memberstatic->LibStatut($obj->status, $obj->subscription, $datefin, 5);
1537 print '</td>';
1538 if (!$i) {
1539 $totalarray['nbfield']++;
1540 }
1541 }
1542 // Action column
1543 if (!getDolGlobalString('MAIN_CHECKBOX_LEFT_COLUMN')) {
1544 print '<td class="center">';
1545 if ($massactionbutton || $massaction) { // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined
1546 $selected = 0;
1547 if (in_array($obj->rowid, $arrayofselected)) {
1548 $selected = 1;
1549 }
1550 print '<input id="cb'.$obj->rowid.'" class="flat checkforselect" type="checkbox" name="toselect[]" value="'.$obj->rowid.'"'.($selected ? ' checked="checked"' : '').'>';
1551 }
1552 print '</td>';
1553 if (!$i) {
1554 $totalarray['nbfield']++;
1555 }
1556 }
1557
1558 print '</tr>'."\n";
1559 }
1560 $i++;
1561}
1562
1563// Show total line
1564include DOL_DOCUMENT_ROOT.'/core/tpl/list_print_total.tpl.php';
1565
1566
1567// If no record found
1568if ($num == 0) {
1569 $colspan = 1;
1570 foreach ($arrayfields as $key => $val) {
1571 if (!empty($val['checked'])) {
1572 $colspan++;
1573 }
1574 }
1575 print '<tr><td colspan="'.$colspan.'"><span class="opacitymedium">'.$langs->trans("NoRecordFound").'</span></td></tr>';
1576}
1577
1578$db->free($resql);
1579
1580$parameters = array('arrayfields' => $arrayfields, 'sql' => $sql);
1581$reshook = $hookmanager->executeHooks('printFieldListFooter', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1582print $hookmanager->resPrint;
1583
1584print '</table>'."\n";
1585print '</div>'."\n";
1586
1587print '</form>'."\n";
1588
1589if (in_array('builddoc', array_keys($arrayofmassactions)) && ($nbtotalofrecords === '' || $nbtotalofrecords)) {
1590 $hidegeneratedfilelistifempty = 1;
1591 if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) {
1592 $hidegeneratedfilelistifempty = 0;
1593 }
1594
1595 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
1596 $formfile = new FormFile($db);
1597
1598 // Show list of available documents
1599 $urlsource = $_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder;
1600 $urlsource .= str_replace('&amp;', '&', $param);
1601
1602 $filedir = $diroutputmassaction;
1603 $genallowed = $permissiontoread;
1604 $delallowed = $permissiontoadd;
1605
1606 print $formfile->showdocuments('massfilesarea_'.$object->module, '', $filedir, $urlsource, 0, $delallowed, '', 1, 1, 0, 48, 1, $param, $title, '', '', '', null, $hidegeneratedfilelistifempty);
1607}
1608
1609// End of page
1610llxFooter();
1611$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_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.