[html-formfu] Patch to allow to provide a callback to "when"
inside a Constraint
Andreas Marienborg
omega at palle.net
Tue May 27 10:12:20 BST 2008
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 mb at italpro.net
>
> --- 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 at lists.scsys.co.uk
> http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
More information about the HTML-FormFu
mailing list