Could you make it so a callback also could be specified via the config-
files? Since now it seems to expect a coderef, but perhaps a string
pointing at a sub could also be allowed, or a class-name which should
implement some method?
- andreas
On May 27, 2008, at 12:50 AM, Michele Beltrame wrote:
Hi all!
Attached is a small patch for HTML/FormFu/Constraint.pm which allows
to
use a callback for "when" checks inside a constraint. This should
allow
more complex control (i.e. based on multiple fields, external data,
etc...)
on when the constraint is applied:
my $is_blast = sub {
my $params = shift;
return 0 if $params->{isblastocyst} == 1 && $params->{old} == 1;
# Closure-style
return 0 if $c->model('Dbs::Atoms')->find($params->{old});
return 1;
}
[...]
{
name => 'embryos_day5',
type => 'Text',
constraints => [{
type => 'Number',
when => {
callback => $is_blast,
},
}],
},
I'll provide tests if patch is considered a good idea to merge. ;-)
Thanks,
Michele.
--
Michele Beltrame
http://www.cattlegrid.info/
ICQ 76660101 - MSN [EMAIL PROTECTED]
--- home/mb/devel/formfu/trunk/HTML-FormFu/lib/HTML/FormFu/
Constraint.pm
+++ u/www/cheiron/cryo/Cryo/lib/HTML/FormFu/Constraint.pm
@@ -107,29 +107,38 @@
# check type of 'when'
croak "Parameter 'when' is not a hash ref" if ref $when ne 'HASH';
- # field must be defined
+ # field or callback must be defined
my $when_field = $when->{field};
- croak "Parameter 'field' is not defined" if !defined $when_field;
-
- # nothing to constrain if field doesn't exist
- my $when_field_value = $params->{$when_field};
- return 0 if !defined $when_field_value;
-
- # a compare value must be defined
- my @values;
- my $compare_value = $when->{value};
- push @values, $compare_value if defined $compare_value;
- my $compare_values = $when->{values};
- push @values, @$compare_values if ref $compare_values eq 'ARRAY';
- croak "Parameter 'value' or 'values' are not defined" unless
@values;
-
- # determine if condition is fullfilled
- my $fullfilled = grep { $when_field_value eq $_ } @values;
-
- # invert when condition if asked for
- $fullfilled = $when->{not} ? !$fullfilled : $fullfilled;
-
- return $fullfilled;
+ my $when_callback = $when->{callback};
+ croak "Parameter 'field' or 'callback' is not defined"
+ if !defined $when_field && !defined $when_callback;
+
+ # Callback will be the preferred thing
+ if ( $when_callback ) {
+ return $when_callback->($params);
+ }
+
+ else {
+ # nothing to constrain if field doesn't exist
+ my $when_field_value = $params->{$when_field};
+ return 0 if !defined $when_field_value;
+
+ # a compare value must be defined
+ my @values;
+ my $compare_value = $when->{value};
+ push @values, $compare_value if defined $compare_value;
+ my $compare_values = $when->{values};
+ push @values, @$compare_values if ref $compare_values eq
'ARRAY';
+ croak "Parameter 'value' or 'values' are not defined"
unless @values;
+
+ # determine if condition is fullfilled
+ my $fullfilled = grep { $when_field_value eq $_ } @values;
+
+ # invert when condition if asked for
+ $fullfilled = $when->{not} ? !$fullfilled : $fullfilled;
+
+ return $fullfilled;
+ }
}
1;
@@ -259,6 +268,10 @@
value: expected value in the form field 'field'
values: Array of multiple values, one must match to fullfill the
condition
not: inverse the when condition - value(s) must not match
+ callback: a callback can be supplied to perform complex checks.
An hashref
+ of all parameters is passed. In this case all other keys are
ignored,
+ including not. Return a true value for the constraint to be
valid or
+ a false value to not apply it.
=head1 CORE CONSTRAINTS
_______________________________________________
HTML-FormFu mailing list
HTML-FormFu@lists.scsys.co.uk
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
_______________________________________________
HTML-FormFu mailing list
HTML-FormFu@lists.scsys.co.uk
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu