dolibarr 20.0.0
html.formresource.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) - 2013-2015 Jean-François FERRY <jfefe@aternatik.fr>
3 * Copyright (C) 2019-2024 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2022 Ferran Marcet <fmarcet@2byte.es>
5 * Copyright (C) 2023 William Mead <william.mead@manchenumerique.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 * or see https://www.gnu.org/
20 */
21
27require_once DOL_DOCUMENT_ROOT."/core/class/html.form.class.php";
28require_once DOL_DOCUMENT_ROOT."/resource/class/dolresource.class.php";
29
30
38{
42 public $db;
43
44 public $substit = array();
45
46 public $param = array();
47
51 public $error = '';
52
53
59 public function __construct($db)
60 {
61 $this->db = $db;
62 }
63
64
65 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
83 public function select_resource_list($selected = 0, $htmlname = 'fk_resource', array $filter = [], $showempty = 0, $showtype = 0, $forcecombo = 0, $event = [], $filterkey = [], $outputmode = 0, $limit = 20, $morecss = 'minwidth100', $multiple = false)
84 {
85 // phpcs:enable
86 global $conf, $langs;
87
88 $out = '';
89 $outarray = array();
90
91 $resourcestat = new Dolresource($this->db);
92
93 $resources_used = $resourcestat->fetchAll('ASC', 't.rowid', $limit, 0, $filter);
94
95 if (!empty($selected) && !is_array($selected)) {
96 $selected = array($selected);
97 }
98
99 if ($outputmode != 2) {
100 $out = '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
101 $out .= '<input type="hidden" name="token" value="'.newToken().'">';
102 }
103
104 if ($resourcestat) {
105 // Construct $out and $outarray
106 $out .= '<select id="'.$htmlname.'" class="flat'.($morecss ? ' '.$morecss : '').'" name="'.$htmlname.($multiple ? '[]' : '').'" '.($multiple ? 'multiple' : '').'>'."\n";
107 if ($showempty) {
108 $out .= '<option value="-1">&nbsp;</option>'."\n";
109 }
110
111 $num = 0;
112 if (is_array($resourcestat->lines)) {
113 $num = count($resourcestat->lines);
114 }
115
116 //var_dump($resourcestat->lines);
117 $i = 0;
118 if ($num) {
119 while ($i < $num) {
120 $resourceclass = ucfirst($resourcestat->lines[$i]->element);
121
122 $label = $resourcestat->lines[$i]->ref ? $resourcestat->lines[$i]->ref : ''.$resourcestat->lines[$i]->label;
123 if ($resourceclass != 'Dolresource') {
124 $label .= ' ('.$langs->trans($resourceclass).')';
125 }
126
127 // Test if entry is the first element of $selected.
128 if ((isset($selected[0]) && is_object($selected[0]) && $selected[0]->id == $resourcestat->lines[$i]->id) || ((!isset($selected[0]) || !is_object($selected[0])) && !empty($selected) && in_array($resourcestat->lines[$i]->id, $selected))) {
129 $out .= '<option value="'.$resourcestat->lines[$i]->id.'" selected>'.$label.'</option>';
130 } else {
131 $out .= '<option value="'.$resourcestat->lines[$i]->id.'">'.$label.'</option>';
132 }
133
134 array_push($outarray, array('key'=>$resourcestat->lines[$i]->id, 'value'=>$resourcestat->lines[$i]->id, 'label'=>$label));
135
136 $i++;
137 if (($i % 10) == 0) {
138 $out .= "\n";
139 }
140 }
141 }
142 $out .= '</select>'."\n";
143
144 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('RESOURCE_USE_SEARCH_TO_SELECT') && !$forcecombo) {
145 //$minLength = (is_numeric($conf->global->RESOURCE_USE_SEARCH_TO_SELECT)?$conf->global->RESOURCE_USE_SEARCH_TO_SELECT:2);
146 $out .= ajax_combobox($htmlname, $event, $conf->global->RESOURCE_USE_SEARCH_TO_SELECT);
147 } else {
148 $out .= ajax_combobox($htmlname);
149 }
150
151 if ($outputmode != 2) {
152 $out .= '<input type="submit" class="button" value="'.$langs->trans("Search").'"> &nbsp; &nbsp; ';
153
154 $out .= '</form>';
155 }
156 } else {
157 dol_print_error($this->db);
158 }
159
160 if ($outputmode && $outputmode != 2) {
161 return $outarray;
162 }
163 return $out;
164 }
165
166 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
179 public function select_types_resource($selected = '', $htmlname = 'type_resource', $filtertype = '', $format = 0, $empty = 0, $noadmininfo = 0, $maxlength = 0)
180 {
181 // phpcs:enable
182 global $langs, $user;
183
184 $resourcestat = new Dolresource($this->db);
185
186 dol_syslog(get_class($this)."::select_types_resource ".$selected.", ".$htmlname.", ".$filtertype.", ".$format, LOG_DEBUG);
187
188 $filterarray = array();
189
190 if ($filtertype != '' && $filtertype != '-1') {
191 $filterarray = explode(',', $filtertype);
192 }
193
194 $resourcestat->loadCacheCodeTypeResource();
195 print '<select id="select'.$htmlname.'" class="flat maxwidthonsmartphone select_'.$htmlname.'" name="'.$htmlname.'">';
196 if ($empty) {
197 print '<option value="">&nbsp;</option>';
198 }
199 if (is_array($resourcestat->cache_code_type_resource) && count($resourcestat->cache_code_type_resource)) {
200 foreach ($resourcestat->cache_code_type_resource as $id => $arraytypes) {
201 // We discard empty line if showempty is on because an empty line has already been output.
202 if ($empty && empty($arraytypes['code'])) {
203 continue;
204 }
205
206 if ($format == 0) {
207 print '<option value="'.$id.'"';
208 } elseif ($format == 1) {
209 print '<option value="'.$arraytypes['code'].'"';
210 } elseif ($format == 2) {
211 print '<option value="'.$arraytypes['code'].'"';
212 } elseif ($format == 3) {
213 print '<option value="'.$id.'"';
214 }
215 // Si selected est text, on compare avec code, sinon avec id
216 if (!empty($selected) && preg_match('/[a-z]/i', $selected) && $selected == $arraytypes['code']) {
217 print ' selected';
218 } elseif ($selected == $id) {
219 print ' selected';
220 }
221 print '>';
222 if ($format == 0) {
223 $value = ($maxlength ? dol_trunc($arraytypes['label'], $maxlength) : $arraytypes['label']);
224 } elseif ($format == 1) {
225 $value = $arraytypes['code'];
226 } elseif ($format == 2) {
227 $value = ($maxlength ? dol_trunc($arraytypes['label'], $maxlength) : $arraytypes['label']);
228 } elseif ($format == 3) {
229 $value = $arraytypes['code'];
230 }
231 if (empty($value)) {
232 $value = '&nbsp;';
233 }
234 print $value;
235 print '</option>';
236 }
237 }
238 print '</select>';
239 if ($user->admin && !$noadmininfo) {
240 print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
241 }
242 }
243
244 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
257 public function select_ziptown($selected = '', $htmlname = 'zipcode', $fields = array(), $fieldsize = 0, $disableautocomplete = 0, $moreattrib = '', $morecss = '')
258 {
259 // phpcs:enable
260 global $conf;
261
262 $out = '';
263
264 $size = '';
265 if (!empty($fieldsize)) {
266 $size = 'size="' . $fieldsize . '"';
267 }
268
269 if ($conf->use_javascript_ajax && empty($disableautocomplete)) {
270 $out .= ajax_multiautocompleter($htmlname, $fields, DOL_URL_ROOT . '/core/ajax/ziptown.php') . "\n";
271 $moreattrib .= ' autocomplete="off"';
272 }
273 $out .= '<input id="' . $htmlname . '" class="maxwidthonsmartphone' . ($morecss ? ' ' . $morecss : '') . '" type="text"' . ($moreattrib ? ' ' . $moreattrib : '') . ' name="' . $htmlname . '" ' . $size . ' value="' . $selected . '">' . "\n";
274
275 return $out;
276 }
277
278 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
292 public function select_state($selected = 0, $country_codeid = 0, $htmlname = 'state_id', $morecss = 'maxwidth200onsmartphone minwidth300')
293 {
294 // phpcs:enable
295 global $conf, $langs, $user;
296
297 dol_syslog(get_class($this) . "::select_departement selected=" . $selected . ", country_codeid=" . $country_codeid, LOG_DEBUG);
298
299 $langs->load("dict");
300
301 $out = '';
302
303 // Search active departements/cantons/province of a region and actif country
304 $sql = "SELECT d.rowid, d.code_departement as code, d.nom as name, d.active, c.label as country, c.code as country_code, r.nom as region_name FROM";
305 $sql .= " " . $this->db->prefix() . "c_departements as d, " . $this->db->prefix() . "c_regions as r," . $this->db->prefix() . "c_country as c";
306 $sql .= " WHERE d.fk_region=r.code_region and r.fk_pays=c.rowid";
307 $sql .= " AND d.active = 1 AND r.active = 1 AND c.active = 1";
308 if ($country_codeid && is_numeric($country_codeid)) {
309 $sql .= " AND c.rowid = '" . $this->db->escape($country_codeid) . "'";
310 }
311 if ($country_codeid && !is_numeric($country_codeid)) {
312 $sql .= " AND c.code = '" . $this->db->escape($country_codeid) . "'";
313 }
314 $sql .= " ORDER BY c.code, d.code_departement";
315
316 $result = $this->db->query($sql);
317 if ($result) {
318 if (!empty($htmlname)) {
319 $out .= '<select id="' . $htmlname . '" class="flat' . ($morecss ? ' ' . $morecss : '') . '" name="' . $htmlname . '">';
320 }
321 if ($country_codeid) {
322 $out .= '<option value="0">&nbsp;</option>';
323 }
324 $num = $this->db->num_rows($result);
325 $i = 0;
326 dol_syslog(get_class($this) . "::select_departement num=" . $num, LOG_DEBUG);
327 if ($num) {
328 $country = '';
329 while ($i < $num) {
330 $obj = $this->db->fetch_object($result);
331 if ($obj->code == '0') { // Le code peut etre une chaine
332 $out .= '<option value="0">&nbsp;</option>';
333 } else {
334 if (!$country || $country != $obj->country) {
335 // Show break if we are in list with multiple countries
336 if (!$country_codeid && $obj->country_code) {
337 $out .= '<option value="-1" disabled data-html="----- ' . $obj->country . ' -----">----- ' . $obj->country . " -----</option>\n";
338 $country = $obj->country;
339 }
340 }
341
342 if (!empty($selected) && $selected == $obj->rowid) {
343 $out .= '<option value="' . $obj->rowid . '" selected>';
344 } else {
345 $out .= '<option value="' . $obj->rowid . '">';
346 }
347
348 // If translation exists use it, otherwise use default name
349 if (
350 getDolGlobalString('MAIN_SHOW_STATE_CODE') &&
351 (getDolGlobalInt('MAIN_SHOW_STATE_CODE') == 1 || getDolGlobalInt('MAIN_SHOW_STATE_CODE') == 2 || $conf->global->MAIN_SHOW_STATE_CODE === 'all')
352 ) {
353 if (getDolGlobalInt('MAIN_SHOW_REGION_IN_STATE_SELECT') == 1) {
354 $out .= $obj->region_name . ' - ' . $obj->code . ' - ' . ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
355 } else {
356 $out .= $obj->code . ' - ' . ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
357 }
358 } else {
359 if (getDolGlobalInt('MAIN_SHOW_REGION_IN_STATE_SELECT') == 1) {
360 $out .= $obj->region_name . ' - ' . ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
361 } else {
362 $out .= ($langs->trans($obj->code) != $obj->code ? $langs->trans($obj->code) : ($obj->name != '-' ? $obj->name : ''));
363 }
364 }
365
366 $out .= '</option>';
367 }
368 $i++;
369 }
370 }
371 if (!empty($htmlname)) {
372 $out .= '</select>';
373 }
374 if (!empty($htmlname) && $user->admin) {
375 $out .= ' ' . info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"), 1);
376 }
377 } else {
378 dol_print_error($this->db);
379 }
380
381 // Make select dynamic
382 if (!empty($htmlname)) {
383 include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
384 $out .= ajax_combobox($htmlname);
385 }
386
387 return $out;
388 }
389}
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:456
ajax_multiautocompleter($htmlname, $fields, $url, $option='', $minLength=2, $autoselect=0)
Generic function that return javascript to add to a page to transform a common input text field into ...
Definition ajax.lib.php:305
DAO Resource object.
Class to manage forms for the module resource.
select_types_resource($selected='', $htmlname='type_resource', $filtertype='', $format=0, $empty=0, $noadmininfo=0, $maxlength=0)
Return html list of tickets type.
__construct($db)
Constructor.
select_state($selected=0, $country_codeid=0, $htmlname='state_id', $morecss='maxwidth200onsmartphone minwidth300')
Returns the drop-down list of departments/provinces/cantons for all countries or for a given country.
select_resource_list($selected=0, $htmlname='fk_resource', array $filter=[], $showempty=0, $showtype=0, $forcecombo=0, $event=[], $filterkey=[], $outputmode=0, $limit=20, $morecss='minwidth100', $multiple=false)
Output html form to select a resource.
select_ziptown($selected='', $htmlname='zipcode', $fields=array(), $fieldsize=0, $disableautocomplete=0, $moreattrib='', $morecss='')
Return a select list with zip codes and their town.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.