2
###################################################################################
4
# Embperl - Copyright (c) 1997-2008 Gerald Richter / ecos gmbh www.ecos.de
5
# Embperl - Copyright (c) 2008-2012 Gerald Richter
7
# You may distribute under the terms of either the GNU General Public
8
# License or the Artistic License, as specified in the Perl README file.
10
# THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
11
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
12
# WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16
###################################################################################
18
package Embperl::Form::Control::datetime ;
21
use base 'Embperl::Form::Control::number' ;
24
use POSIX qw(strftime);
25
use Time::Local qw(timelocal_nocheck timegm_nocheck);
26
use Date::Calc qw{Delta_DHMS Add_Delta_Days} ;
30
our $tz_local = (timegm_nocheck(localtime())-time())/60;
33
# ---------------------------------------------------------------------------
35
# init - init the new control
43
$self->{unit} ||= '' ;
49
# ------------------------------------------------------------------------------------------
51
# init_data - daten aufteilen
56
my ($self, $req, $parentctrl) = @_ ;
58
my $fdat = $req -> {docdata} || \%fdat ;
59
my $name = $self->{name} ;
60
my $time = $fdat->{$name} ;
61
return if ($time eq '' || $req -> {"ef_datetime_init_done_$name"}) ;
63
if ($self -> {dynamic} && ($time =~ /^\s*((?:d|m|y)(?:\+|-)?(?:\d+)?)\s*$/))
67
$req -> {"ef_datetime_init_done_$name"} = 1 ;
72
my ($y, $m, $d, $h, $min, $s, $z) = ($time =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(.)/) ;
74
# Getting the local timezone
78
my @time = gmtime(timegm_nocheck($s,$min,$h,$d,$m-1,$y-1900)+($tz_local*60));
80
my $format = $self -> {notime} || ($s == 0 && $h == 0 && $min == 0)?'%d.%m.%Y':'%d.%m.%Y, %H:%M' ;
81
strftime ($format, @time[0..5]) ;
84
if ($time && !$date && ($time =~ /\d+\.\d+\.\d+/))
89
$fdat->{$name} = $date ;
90
$req -> {"ef_datetime_init_done_$name"} = 1 ;
93
# ------------------------------------------------------------------------------------------
95
# prepare_fdat - daten zusammenfuehren
100
my ($self, $req) = @_ ;
102
return if ($self -> is_readonly ($req)) ;
104
my $fdat = $req -> {form} || \%fdat ;
105
my $name = $self->{name} ;
106
my $date = $fdat -> {$name} ;
107
return if ($date eq '') ;
109
if ($self -> {dynamic} && ($date =~ /^\s*((?:d|m|y)\s*(?:\+|-)?\s*(?:\d+)?)\s*$/))
111
$fdat->{$name} = $1 ;
112
$fdat->{$name} =~ s/\s//g ;
117
my ($year, $mon, $day, $hour, $min, $sec) ;
118
if ($date eq '*' || $date eq '.')
121
($sec, $min, $hour, $day, $mon, $year) = gmtime (time + $offset) ;
128
my ($d, $t) = split (/\s+/, $date) ;
134
($day, $mon, $year) = map { $_ + 0 } split (/\./, $d) ;
135
($hour, $min, $sec) = map { $_ + 0 } split (/\:/, $t) ;
137
if ($year == 0 || $mon == 0 || $day == 0)
139
my ($s, $min, $h, $md, $m, $y) = localtime ;
143
$year ||= $y + 1900 ;
150
elsif ($year >= 70 && $year < 100)
156
$year = $year % 100 + 2000 ;
159
($year,$mon,$day, $hour,$min,$sec) =
160
Date::Calc::Add_Delta_DHMS($year,$mon,$day, $hour,$min,$sec,
161
0, 0, -$tz_local, 0) if ($hour || $min || $sec) ;
164
$fdat -> {$name} = $year?sprintf ('%04d%02d%02d%02d%02d%02dZ', $year, $mon, $day, $hour, $min, $sec):'' ;
167
# ---------------------------------------------------------------------------
169
# get_validate_auto_rules - get rules for validation, in case user did
173
sub get_validate_auto_rules
175
my ($self, $req) = @_ ;
177
return [ $self -> {required}?(required => 1):(emptyok => 1), -type => 'DateTime' ] ;
185
[# ---------------------------------------------------------------------------
187
# show_control - output the control
190
[$ sub show_control ($self)
192
$self -> {size} ||= 80 / ($self -> {width} || 2) ;
193
my $class = $self -> {class} ||= '' ;
194
my $fullid = $req -> {uuid} . '_' . $self ->{id} ;
197
<input type="text" name="[+ $self -> {force_name} || $self -> {name} +]" [+ do { local $escmode = 0 ; $self -> get_std_control_attr($req, $fullid) } +]
198
[$if $self -> {size} $]size="[+ $self->{size} +]"[$endif$]
199
[$if $self -> {maxlength} $]maxlength="[+ $self->{maxlength} +]"[$endif$]
201
<script type="text/javascript">
202
$('#[+ $fullid +]').datepicker ({ showWeek: true,
203
[$if $self -> {dynamic} $]constrainInput: false, [$endif$]
204
showButtonPanel: true
218
Embperl::Form::Control::price - A price input control with optional unit inside an Embperl Form
232
Used to create a datetime input control inside an Embperl Form.
233
Will format number as a date/time.
234
See Embperl::Form on how to specify parameters.
236
Datetime format in %fdat is excpected as YYYYMMTTHHMMSSZ
242
Needs to be 'datetime'
246
Specifies the name of the control
250
Will be used as label for the numeric input control
254
Gives the size in characters. (Default: 10)
258
does not display time
262
allows the following values to be entered:
264
d, m, y, d-N, d+N, m-N, m+N, y-N, y+N
266
N is any number. This values are simply passed through and need
267
to be process somewhere else.
271
G. Richter (richter at embperl dot org)
275
perl(1), Embperl, Embperl::Form