On 29/05/07, Thorsten Domsch <[EMAIL PROTECTED]> wrote:
Hi there,

I've got a small Problem here. I created a custom date element,
consisting out of three select boxes. The whole thing extends the Select
object.
so my yaml file looks like this:

-type date
 name: custom
 start_year: 2000
 end_year: 2005

and produces something like this

<select name="custom_day">1 ... 31</select>
<select name="custom_month"> january ...december </select>
<select name="custom_year"> ...2000-2005 ... </select>

now i want to process the three request values... evaluate them, select
the selected and put them together.... to custom->value

but how (or where) the hell do i do this ?? there must be a method to
get acces to the request vars but i can't find out which one.

Hmm, I can't think of a way to do this that isn't rather 'hackish'.

You could try making your custom element a sub-class of 'multi' - and
override the constructor to automatically add the select elements.
This way, because the selects are real fields, their values will be
processed correctly and constraints etc. will be run on each
individual element.
You can then add any needed methods such as start_year and end_year to
your custom class to do what you need.

Elements can have a process() method which is called if submitted() is
true, but before the input values are processed at all. You can access
the input there, via $self->form->query(), but it's not going to be
much use, because $form->process() will only process values for real
fields, which your multi isn't - so you'd never be able to access
'custom's value via $form->params().

This is untested, but I think if you overrode is_field() in your
block, to make it true, and overrode get_fields() to return both
itself and it's children, then the input processing would work.

I would suggest adding the following Constraint...
   type: AllOrNone
   name: custom_day
   others: [custom_month, custom_year]

This would ensure that all 3 values are set.
Then create a custom Inflator which is a sub-class of the DateTime
inflator, and uses the 3 values to set 'custom's value...
   type: +CustomDateTime
   name: custom

package CustomDateTime;
use base 'HTML::FormFu::Inflator::DateTime';
sub new {
   my $self = shift->SUPER::new( @_ );

   $self->parser->strptime('%d-%m-%Y');

   return $self;
}
sub inflator {
   my ( $self, $value ) = @_;

   my $d = $self->form->input->{custom_day};
   my $m = $self->form->input->{custom_month};
   my $y = $self->form->input->{custom_year};

   return $self->SUPER::inflator( "$d-$m-$y" );
}
1;

Carl

_______________________________________________
HTML-FormFu mailing list
[email protected]
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu

Reply via email to