Class::DBI::FormBuilder::Plugin::Time::Piece - Output Dates/Times Properly


Class-DBI-FormBuilder-Plugin-Time-Piece documentation Contained in the Class-DBI-FormBuilder-Plugin-Time-Piece distribution.

Index


Code Index:

NAME

Top

Class::DBI::FormBuilder::Plugin::Time::Piece - Output Dates/Times Properly

SYNOPSIS

Top

  Class::DBI::FormBuilder::Plugin::Time::Piece-E<gt>require;
  my $ok = Class::DBI::FormBuilder::Plugin::Time::Piece-E<gt>field($obj,$form,$column);

DESCRIPTION

Top

This module is loaded implicitly by CDBI::FormBuilder <= 0.32, when it encounters a Time::Piece object as a has_a field within a Class::DBI object/class. When that happens, Class::DBI::FormBuilder::Plugin::Time::Piece->field($obj,$form,$column) is called.

my $ok = $class->field($obj,$form,$column)

This routine will accept the object for which a form is being created, the CGI::FormBuilder object we're working with, and the field in question. field() is then expected to call (and return the return value of) $form->field(%args). As a result, a text field will be created within the form.

At this point, CDBI::FB::Plugin::Time::Piece serializes itself based upon MySQL types. Patches are most welcome!

WARNING

Top

We call column_type() on $obj, so it must be a Class::DBI::mysql object, or it needs to have used Class::DBI::Plugin::Type.

SEE ALSO

Top

Class::DBI, CGI::FormBuilder, Class::DBI::FormBuilder

AUTHOR

Top

James Tolley, <james@bitperfect.com>

COPYRIGHT AND LICENSE

Top


Class-DBI-FormBuilder-Plugin-Time-Piece documentation Contained in the Class-DBI-FormBuilder-Plugin-Time-Piece distribution.

package Class::DBI::FormBuilder::Plugin::Time::Piece;
use strict;
use warnings;

our $VERSION = '0.1';

my %rx = (
	date		=>	'/^(?:|\d{4}-\d\d-\d\d)$/',
	time		=>	'/^(?:|\d\d:\d\d:\d\d)$/',
	datetime	=>	'/^(?:|\d{4}-\d\d-\d\d \d\d:\d\d:\d\d)$/',
	timestamp	=>	'//', #'/^(?:|\d{14})$/',
);

sub field {
	my($class,$cdbifb,$them,$form,$field) = @_;
	
	# for certain CDBI::FB versions
	$field = $field->name if UNIVERSAL::isa($field,'Class::DBI::Column');

	my $type = $cdbifb->table_meta($them)->column($field)->type;

	my %args = (
		name		=> $field,
		value		=> '',
		required	=>	0,
		validate	=>	'//',
	);

	# called as a class method
	# no data; create empty field
	unless(ref $them) {
		$args{validate} = $rx{$type};
		return $form->field(%args);
	}

	my $value = do {
		no warnings 'uninitialized';
		$them->$field.''; # lousy default
	};
	my $validate = undef;
	if($type =~ /\btime\b/) {
		$args{value} =	UNIVERSAL::can($them->$field,'hms') ? $them->$field->hms : '';
	} elsif($type =~ /date\b/) {
		$args{value} =	UNIVERSAL::can($them->$field,'ymd') ? $them->$field->ymd : '';
	} elsif($type =~ /timestamp\b/) {
		$args{value} =	UNIVERSAL::can($them->$field,'strftime')
						? $them->$field->strftime('%Y%m%d%H%M%S')
						: '';
		$args{readonly} = 1; # no update of timestamps
	} elsif($type =~ /datetime\b/) {
		$args{value} =	UNIVERSAL::can($them->$field,'strftime')
						? $them->$field->strftime('%Y-%m-%d %H:%M:%S')
						: '';
	} else {
		die "don't understand column type '$type'";
	}

	$form->field(%args);
}


1;

__END__
# Below is stub documentation for your module. You'd better edit it!