date_tag
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 22 Oct 2010 12:25:05 +0000 (14:25 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 22 Oct 2010 12:25:05 +0000 (14:25 +0200)
Beispiel ist hier nicht mit enthalten, weil der date_tag gleichzeitig einen
graphischen datepicker rendert, deshalb hier im Commit:

[% USE L %]
[% L.date_tag('orddate', orddate, cal_align => 'BL') %]

Das erste ist der name in html, das zweite der Wert zum befüllen, das dritte
die Orientierung des Popups.

SL/Form.pm
SL/Template/Plugin/L.pm
image/calendar.png [new file with mode: 0644]

index 56e46f7..77581a0 100644 (file)
@@ -56,7 +56,7 @@ use SL::User;
 use Template;
 use URI;
 use List::Util qw(first max min sum);
-use List::MoreUtils qw(any);
+use List::MoreUtils qw(any apply);
 
 use strict;
 
@@ -828,13 +828,13 @@ sub _prepare_html_template {
   }
 
   if (%main::myconfig) {
-    map({ $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys(%main::myconfig));
-    my $jsc_dateformat = $main::myconfig{"dateformat"};
-    $jsc_dateformat =~ s/d+/\%d/gi;
-    $jsc_dateformat =~ s/m+/\%m/gi;
-    $jsc_dateformat =~ s/y+/\%Y/gi;
-    $additional_params->{"myconfig_jsc_dateformat"} = $jsc_dateformat;
+    $::myconfig{jsc_dateformat} = apply {
+      s/d+/\%d/gi;
+      s/m+/\%m/gi;
+      s/y+/\%Y/gi;
+    } $::myconfig{"dateformat"};
     $additional_params->{"myconfig"} ||= \%::myconfig;
+    map { $additional_params->{"myconfig_${_}"} = $main::myconfig{$_}; } keys %::myconfig;
   }
 
   $additional_params->{"conf_dbcharset"}              = $main::dbcharset;
index 692c396..d1ecdbd 100644 (file)
@@ -5,6 +5,15 @@ use Template::Plugin;
 
 use strict;
 
+{ # This will give you an id for identifying html tags and such.
+  # It's guaranteed to be unique unless you exceed 10 mio calls per request.
+  # Do not use these id's to store information across requests.
+my $_id_sequence = int rand 1e7;
+sub _tag_id {
+  return $_id_sequence = ($_id_sequence + 1) % 1e7;
+}
+}
+
 sub _H {
   my $string = shift;
   return $::locale->quote_special_chars('HTML', $string);
@@ -132,6 +141,36 @@ sub options_for_select {
   return $code;
 }
 
+sub javascript {
+  my ($self, $data) = @_;
+  return $self->html_tag('script', $data, type => 'text/javascript');
+}
+
+sub date_tag {
+  my ($self, $name, $value, @slurp) = @_;
+  my %params   = _hashify(@slurp);
+  my $name_e   = _H($name);
+  my $seq      = _tag_id();
+
+  $params{cal_align} ||= 'BR';
+
+  $self->input_tag($name, $value,
+    size   => 11,
+    title  => _H($::myconfig{dateformat}),
+    onBlur => 'check_right_date_format(this)',
+    %params,
+  ) . ((!$params{no_cal}) ?
+  $self->html_tag('img', undef,
+    src    => 'image/calendar.png',
+    id     => "trigger$seq",
+    title  => _H($::myconfig{dateformat}),
+    %params,
+  ) .
+  $self->javascript(
+    "Calendar.setup({ inputField: '$name_e', ifFormat: '$::myconfig{jsc_dateformat}', align: '$params{cal_align}', button: 'trigger$seq'  });"
+  ) : '');
+}
+
 1;
 
 __END__
@@ -213,6 +252,16 @@ If C<%attributes> contains a key C<label> then a HTML 'label' tag is
 created with said C<label>. No attribute named C<label> is created in
 that case.
 
+=item C<date_tag $name, $value, %attributes>
+
+=item C<date_tag $name, $value, cal_align =E<gt> $align_code, %attributes>
+
+Creates a date input field, with an attached javascript that will open a
+calendar on click. The javascript ist by default anchoered at the bottom right
+sight. This can be overridden with C<cal_align>, see Calendar documentation for
+the details, usually you'll want a two letter abbreviation of the alignment.
+Right + Bottom becomes C<BL>.
+
 =back
 
 =head2 CONVERSION FUNCTIONS
diff --git a/image/calendar.png b/image/calendar.png
new file mode 100644 (file)
index 0000000..106a592
Binary files /dev/null and b/image/calendar.png differ