Solstice::Controller::FormInput::DateTime - Allows the manipulation of a Solstice::DateTime model


Solstice documentation Contained in the Solstice distribution.

Index


Code Index:

NAME

Top

Solstice::Controller::FormInput::DateTime - Allows the manipulation of a Solstice::DateTime model

SYNOPSIS

Top

DESCRIPTION

Top

Superclass

Solstice::Controller::FormInput

Export

No symbols exported.

Methods

new($datetime)

Constructor.

getView()
update()
validate()

IDEA: add a way to set a callback function into this controller for validation. That would allow validation to be sensitive to the form context.

constrainValidDateTime()
constrainFutureDateTime()
constrainMinimumDateTime($minimum_date)
constrainMaximumDateTime($maximum_date)
commit()
revert()
hasDateChanged()

Returns TRUE if date persistence data differs from stored data.

setRequireFuture(bool)
getRequireFuture()
_getFullYear($str)

Convert a two-digit year string into a four-digit year string

Modules Used

Solstice::Controller.

AUTHOR

Top

Catalyst Group, <catalyst@u.washington.edu>

VERSION

Top

$Revision: 3155 $

COPYRIGHT

Top


Solstice documentation Contained in the Solstice distribution.
package Solstice::Controller::FormInput::DateTime;

# $Id: DateTime.pm 3155 2006-02-21 20:08:18Z mcrawfor $

use strict;
use warnings;
use 5.006_000;

use base qw(Solstice::Controller::FormInput);

use Solstice::View::FormInput::DateTime;

use Solstice::CGI;
use Solstice::DateTime;
use Solstice::StringLibrary qw(trimstr);

use constant TRUE  => 1;
use constant FALSE => 0;

use constant PARAM => 'datetime_editor';

our ($VERSION) = ('$Revision: 3155 $' =~ /^\$Revision:\s*([\d.]*)/);

sub new {
    my $class = shift;
    my $self = $class->SUPER::new(@_);
   
    unless (defined $self->getModel()) {
        # Create a datetime obj
        $self->setModel(Solstice::DateTime->new());
    }
    
    return $self;
}

sub getView {
    my $self = shift;

    my $view = Solstice::View::FormInput::DateTime->new($self->getModel());
    $view->setName($self->getName() || PARAM);
    #if nothing set, always show validation errors
    $view->setShowErrors(defined $self->getShowErrors() ? $self->getShowErrors() : TRUE);
    $view->setError($self->getError());
    
    return $view;
}

sub update {
    my $self = shift;

    my $datetime = $self->getModel();

    $datetime->clearPersistenceValues();   
    
    my $name = $self->getName() || PARAM;

    my $date_str = trimstr(param($name."_date")) || '';

    my ($mon, $day, $year);
    if ($date_str =~ /^(\d{1,2})\D(\d{1,2})\D(\d\d\d\d)$/) {
        ($mon, $day, $year) = ($1, $2, $3);
    } elsif ($date_str =~ /^(\d{1,2})\D(\d{1,2})\D(\d\d)$/) {
        ($mon, $day, $year) = ($1, $2, $self->_getFullYear($3));
    }
    
    my $hour = param($name.'_hour');
    my $min  = param($name.'_minute');
    my $sec  = 0;

    $datetime->setPersistenceMonth($mon);
    $datetime->setPersistenceDay($day);
    $datetime->setPersistenceYear($year);
    $datetime->setPersistenceHour($hour) if defined $hour;
    $datetime->setPersistenceMin($min) if defined $min;
    $datetime->setPersistenceSec($sec);
    
    # Set the literal input str into persistence
    $datetime->setPersistenceDateStr($date_str);
    $datetime->setPersistenceTimeStr(($datetime->getPersistenceHour() || '00').':'.($datetime->getPersistenceMin() || '00'));
    
    return TRUE;
}

sub validate {
    my $self = shift;

    my $name = $self->getName() || PARAM;
    
    my $param = $self->getIsRequired() 
        ? $self->createRequiredParam($name. "_date")
        : $self->createOptionalParam($name. "_date");
    
    $param->addConstraint('invalid_date', $self->constrainValidDateTime());

    if ($self->getRequireFuture()) {
        $param->addConstraint('passed_date', $self->constrainFutureDateTime());
    }
    return $self->processConstraints();
}

sub constrainValidDateTime {
    my $self = shift;

    my $datetime = $self->getModel();

    my $test = Solstice::DateTime->new($datetime->getPersistenceDateStr().' '.$datetime->getPersistenceTimeStr());

    return sub {
        return $test->isValid();
    };
}

sub constrainFutureDateTime {
    my $self = shift;

    my $datetime = $self->getModel();
    
    my $test = Solstice::DateTime->new($datetime->getPersistenceDateStr().' '.$datetime->getPersistenceTimeStr());
    
    return sub {
        return !$test->isBeforeNow();
    };
}

sub constrainMinimumDateTime {
    my $self = shift;
    my $minimum_date = shift;

    my $limit;
    if (defined $minimum_date) {
        if (defined $minimum_date->getPersistenceDateStr() && $minimum_date->getPersistenceTimeStr()) {
            # The mimimum date is also in persistence
            $limit = Solstice::DateTime->new($minimum_date->getPersistenceDateStr().' '.$minimum_date->getPersistenceTimeStr());
        } else {
            # It's just a datetime obj to test against
            $limit = $minimum_date;
        }
    } else {
        # Not defined - this becomes just a 'future' test
        $limit = Solstice::DateTime->new(time);
    }
    $limit->setSec(10);

    my $datetime = $self->getModel();

    my $test = Solstice::DateTime->new($datetime->getPersistenceDateStr().' '.$datetime->getPersistenceTimeStr());

    return sub {
        return $limit->isBefore($test);
    };
}

sub constrainMaximumDateTime {
    my $self = shift;
    my $maximum_date = shift;

    my $limit;
    if (defined $maximum_date) {
        if (defined $maximum_date->getPersistenceDateStr() && $maximum_date->getPersistenceTimeStr()) {
            # The maximum date is also in persistence
            $limit = Solstice::DateTime->new($maximum_date->getPersistenceDateStr().' '.$maximum_date->getPersistenceTimeStr());
        } else {
            # It's just a datetime obj to test against
            $limit = $maximum_date;
        }
    } else {
        # Not defined - this becomes just a 'future' test
        $limit = Solstice::DateTime->new(time);
    }

    my $datetime = $self->getModel();

    my $test = Solstice::DateTime->new($datetime->getPersistenceDateStr().' '.$datetime->getPersistenceTimeStr());

    return sub {
        return !$limit->isBefore($test);
    };
}

sub commit {
    my $self = shift;

    my $datetime = $self->getModel();

    return $datetime->processPersistenceValues();
}

sub revert {
    my $self = shift;

    my $datetime = $self->getModel();

    return $datetime->clearPersistenceValues();
}

sub hasDateChanged {
    my $self = shift;
    
    my $datetime = $self->getModel();
    my $test = Solstice::DateTime->new($datetime->getPersistenceDateStr().' '.$datetime->getPersistenceTimeStr());

    return $test->isEqualTo($datetime) ? FALSE : TRUE;
}

sub setRequireFuture {
    my $self = shift;
    $self->{'_require_future'} = shift;
}

sub getRequireFuture {
    my $self = shift;
    return $self->{'_require_future'};
}

sub getShowErrors {
    my $self = shift;
    return $self->{'_show_calendar_errors'};
}

sub setShowErrors {
    my $self = shift;
    $self->{'_show_calendar_errors'} = shift;
}

sub _getFullYear {
    my $self = shift;
    my $str  = shift;

    return ((localtime)[5] + 1900) unless defined $str;
        
    my $year = substr((localtime)[5] + 1900, 0, 2);
    $year -= 1 if $str > 50;
    return ($year . $str);
}

1;
__END__