dolibarr 21.0.0-alpha
datepicker.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) phpBSM
3 * Copyright (C) 2005-2010 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2007 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2014 Juanjo Menent <jmenent@2byte.es>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
8 *
9 * This file is a modified version of datepicker.php from phpBSM to fix some
10 * bugs, to add new features and to dramatically increase speed.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
31if (!defined('NOREQUIREUSER')) {
32 define('NOREQUIREUSER', '1'); // disabled
33}
34//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language
35if (!defined('NOREQUIRESOC')) {
36 define('NOREQUIRESOC', '1');
37}
38//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); // Not disabled cause need to do translations
39if (!defined('NOCSRFCHECK')) {
40 define('NOCSRFCHECK', 1);
41}
42if (!defined('NOTOKENRENEWAL')) {
43 define('NOTOKENRENEWAL', 1);
44}
45if (!defined('NOLOGIN')) {
46 define('NOLOGIN', 1); // disabled
47}
48if (!defined('NOREQUIREMENU')) {
49 define('NOREQUIREMENU', 1);
50}
51if (!defined('NOREQUIREHTML')) {
52 define('NOREQUIREHTML', 1);
53}
54
55require_once '../main.inc.php';
56require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
57
58if (GETPOST('lang', 'aZ09')) {
59 $langs->setDefaultLang(GETPOST('lang', 'aZ09')); // If language was forced on URL by the main.inc.php
60}
61
62// Load translation files required by the page
63$langs->loadLangs(array("main", "agenda"));
64
65$right = ($langs->trans("DIRECTION") == 'rtl' ? 'left' : 'right');
66$left = ($langs->trans("DIRECTION") == 'rtl' ? 'right' : 'left');
67
68//var_dump($langs->defaultlang);
69//var_dump($conf->format_date_short_java);
70//var_dump($langs->trans("FormatDateShortJava"));
71
72
73// URL http://mydolibarr/core/datepicker.php?mode=test&m=10&y=2038 can be used for tests
74print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'."\n";
75print '<html>'."\n";
76print '<head>'."\n";
77if (GETPOST('mode') && GETPOST('mode') == 'test') {
78 print '<script nonce="'.getNonce().'" type="text/javascript" src="'.DOL_URL_ROOT.'/core/js/lib_head.js.php"></script>'."\n";
79} else {
80 print '<title>'.$langs->trans("Calendar").'</title>';
81}
82
83// Define tradMonths javascript array (we define this in datapicker AND in parent page to avoid errors with IE8)
84$tradTemp = array(
85 $langs->trans("January"),
86 $langs->trans("February"),
87 $langs->trans("March"),
88 $langs->trans("April"),
89 $langs->trans("May"),
90 $langs->trans("June"),
91 $langs->trans("July"),
92 $langs->trans("August"),
93 $langs->trans("September"),
94 $langs->trans("October"),
95 $langs->trans("November"),
96 $langs->trans("December")
97);
98print '<script nonce="'.getNonce().'" type="text/javascript">';
99print 'var tradMonths = [';
100foreach ($tradTemp as $val) {
101 print '"'.addslashes($val).'",';
102}
103print '""];';
104print '</script>'."\n";
105print '</head>'."\n";
106
107print '<body>'."\n";
108
109
110$qualified = true;
111
112// TODO Replace with GETPOST
113if (!isset($_GET["sd"])) {
114 $_GET["sd"] = "00000000";
115}
116if (!isset($_GET["m"]) || !isset($_GET["y"])) {
117 $qualified = false;
118}
119if (isset($_GET["m"]) && isset($_GET["y"])) {
120 if ($_GET["m"] < 1 || $_GET["m"] > 12) {
121 $qualified = false;
122 }
123 if ($_GET["y"] < 0 || $_GET["y"] > 9999) {
124 $qualified = false;
125 }
126}
127
128// If parameters provided, we show calendar
129if ($qualified) {
130 displayBox(GETPOST("sd", 'alpha'), GETPOSTINT("m"), GETPOSTINT("y"));
131} else {
132 dol_print_error(null, 'ErrorBadParameters');
133}
134
135
136print '</body></html>'."\n";
137
144function xyzToUnixTimestamp($mysqldate)
145{
146 $year = (int) substr($mysqldate, 0, 4);
147 $month = (int) substr($mysqldate, 4, 2);
148 $day = (int) substr($mysqldate, 6, 2);
149 $unixtimestamp = dol_mktime(12, 0, 0, $month, $day, $year);
150
151 return $unixtimestamp;
152}
153
162function displayBox($selectedDate, $month, $year)
163{
164 global $langs, $conf;
165
166 //print "$selectedDate,$month,$year";
167 $thedate = dol_mktime(12, 0, 0, $month, 1, $year);
168 //print "thedate=$thedate";
169 $today = dol_now();
170 $todayArray = dol_getdate($today);
171 if ($selectedDate != "00000000") {
172 $selDate = xyzToUnixTimestamp($selectedDate);
173 $xyz = dol_print_date($selDate, "%Y%m%d");
174 } else {
175 $selDate = 0;
176 $xyz = 0;
177 } ?>
178<table class="dp">
179 <tr>
180 <td colspan="6" class="dpHead"><?php
181 $selectMonth = dol_print_date($thedate, '%m');
182 $selectYear = dol_print_date($thedate, '%Y');
183 echo $langs->trans("Month".$selectMonth).", ".$selectYear; ?></td>
184 <td class="dpHead">
185 <button type="button" class="dpInvisibleButtons" id="DPCancel"
186 onClick="closeDPBox();">X</button>
187 </td>
188 </tr>
189 <tr>
190 <td class="dpButtons"
191 onClick="loadMonth('<?php echo DOL_URL_ROOT.'/core/' ?>','<?php echo $month?>','<?php echo $year - 1?>','<?php echo $xyz ?>','<?php echo $langs->defaultlang ?>')">&lt;&lt;</td>
192 <td class="dpButtons"
193 onClick="loadMonth('<?php echo DOL_URL_ROOT.'/core/' ?>','<?php if ($month == 1) {
194 echo "12";
195 } else {
196 echo $month - 1;
197 } ?>','<?php if ($month == 1) {
198 echo $year - 1;
199 } else {
200 echo $year;
201 } ?>','<?php echo $xyz ?>','<?php echo $langs->defaultlang ?>')">&lt;</td>
202 <td colspan="3" class="dpButtons"
203 onClick="loadMonth('<?php echo DOL_URL_ROOT.'/core/' ?>','<?php echo (int) dol_print_date($today, '%m')?>','<?php echo $todayArray["year"]?>','<?php echo $xyz ?>','<?php echo $langs->defaultlang ?>')"><?php echo '-' ?></td>
204 <td class="dpButtons"
205 onClick="loadMonth('<?php echo DOL_URL_ROOT.'/core/' ?>','<?php if ($month == 12) {
206 echo "1";
207 } else {
208 echo $month + 1;
209 } ?>','<?php if ($month == 12) {
210 echo $year + 1;
211 } else {
212 echo $year;
213 } ?>','<?php echo $xyz ?>','<?php echo $langs->defaultlang ?>')">&gt;</td>
214 <td class="dpButtons"
215 onClick="loadMonth('<?php echo DOL_URL_ROOT.'/core/' ?>','<?php echo $month?>','<?php echo $year + 1?>','<?php echo $xyz ?>','<?php echo $langs->defaultlang ?>')">&gt;&gt;</td>
216 </tr>
217 <tr class="dpDayNames">
218 <?php
219 $startday = isset($conf->global->MAIN_START_WEEK) ? $conf->global->MAIN_START_WEEK : 1;
220 $day_names = array('ShortSunday', 'ShortMonday', 'ShortTuesday', 'ShortWednesday', 'ShortThursday', 'ShortFriday', 'ShortSaturday');
221 for ($i = 0; $i < 7; $i++) {
222 echo '<td width="', (int) (($i + 1) * 100 / 7) - (int) ($i * 100 / 7), '%">', $langs->trans($day_names[($i + $startday) % 7]), '</td>', "\n";
223 }
224 print '</tr>';
225 //print "x ".$thedate." y"; // $thedate = first day of month
226 $firstdate = dol_getdate($thedate);
227 //var_dump($firstdateofweek);
228 $mydate = dol_get_first_day_week(1, $month, $year, true); // mydate = cursor date
229
230 // Loop on each day of month
231 $stoploop = 0;
232 $day = 1;
233 $cols = 0;
234 while (!$stoploop) {
235 //print_r($mydate);
236 if ($mydate < $firstdate) { // At first run
237 echo "<tr class=\"dpWeek\">";
238 //echo $conf->global->MAIN_START_WEEK.' '.$firstdate["wday"].' '.$startday;
239 $cols = 0;
240 for ($i = 0; $i < 7; $i++) {
241 $w = ($i + $startday) % 7;
242 if ($w == $firstdate["wday"]) {
243 $mydate = $firstdate;
244 break;
245 }
246 echo "<td>&nbsp;</td>";
247 $cols++;
248 }
249 } else {
250 if ($mydate["wday"] == $startday) {
251 echo "<tr class=\"dpWeek\">";
252 $cols = 0;
253 }
254 }
255
256 $dayclass = "dpReg";
257 if ($thedate == $selDate) {
258 $dayclass = "dpSelected";
259 } elseif ($thedate == $today) {
260 $dayclass = "dpToday";
261 }
262
263 if ($langs->trans("FormatDateShortJavaInput") == "FormatDateShortJavaInput") {
264 print "ERROR FormatDateShortJavaInput not defined for language ".$langs->defaultlang;
265 exit;
266 }
267
268 // Sur click dans calendrier, appelle fonction dpClickDay
269 echo "<td class=\"".$dayclass."\"";
270 echo " onMouseOver=\"dpHighlightDay(".$mydate["year"].",parseInt('".dol_print_date($thedate, "%m")."',10),".$mydate["mday"].",tradMonths)\"";
271 echo " onClick=\"dpClickDay(".$mydate["year"].",parseInt('".dol_print_date($thedate, "%m")."',10),".$mydate["mday"].",'".$langs->trans("FormatDateShortJavaInput")."')\"";
272 echo ">".sprintf("%02d", $mydate["mday"])."</td>";
273 $cols++;
274
275 if (($mydate["wday"] + 1) % 7 == $startday) {
276 echo "</TR>\n";
277 }
278
279 //$thedate=strtotime("tomorrow",$thedate);
280 $day++;
281 $thedate = dol_mktime(12, 0, 0, $month, $day, $year);
282 if ($thedate == '') {
283 $stoploop = 1;
284 } else {
285 $mydate = dol_getdate($thedate);
286 if ($firstdate["month"] != $mydate["month"]) {
287 $stoploop = 1;
288 }
289 }
290 }
291
292 if ($cols < 7) {
293 for ($i = 6; $i >= $cols; $i--) {
294 echo "<td>&nbsp;</td>";
295 }
296 echo "</tr>\n";
297 } ?>
298 <tr>
299 <td id="dpExp" class="dpExplanation" colspan="7"><?php
300 if ($selDate) {
301 $tempDate = dol_getdate($selDate);
302 print $langs->trans("Month".$selectMonth)." ";
303 print sprintf("%02d", $tempDate["mday"]);
304 print ", ".$selectYear;
305 } else {
306 print "Click a Date";
307 } ?></td>
308 </tr>
309</table>
310 <?php
311}//end function
dol_get_first_day_week($day, $month, $year, $gm=false)
Return first day of week for a date.
Definition date.lib.php:670
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...
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_now($mode='auto')
Return date for now.
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).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
treeview li table
No Email.
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:137