2009年7月17日星期五

Re: [fw-mvc] breakChainOnFailure

I have implemented this feature by adding a custom validator to the
zip code element. This validator checks for a valid zip code format,
then checks the country element, by using $context passed to the
isValid($value,$context=null) which has all values, and compares the
zip to the country, then I check the state element and compare the zip
to the state. I set the message to "this zip code does not match the
country you selected" or "this zip code does not match the state you
submitted".

If you keep sending the form back with only one validation check, you
will get multiple requests for one step. In my experience, I have yet
to meet a site user who enjoys fixing one error at a time. It also
fills up you server with these requests.

I hope this helps and makes sense.

Shawn

On Jul 17, 2009, at 12:19 PM, Seth Atkins wrote:

> Then how does one validate dependent input? If certain fields need
> certain validation criteria depending on a previous field containing
> valid data, you can't properly validate the other fields. For example
> suppose you wanted to check for valid zip codes based on the entered
> state (so someone couldn't enter a NY zip code with state AZ. If
> someone
> entered an invalid state and that failed its check, the remaining
> check
> on the zip code would give a bogus "invalid" message. I'd rather it
> simply suspend the rest of the form validation since the rest cannot
> be
> validated properly.
>
> This may fall into the needed feature bucket for future releases,
> unless
> there is an easy workaround. I managed to find a clunky way of doing
> this by sort of "pre-validating" the input of the field that the
> others
> depend on so I can put in a conditional to addValidator for the
> affected
> elements. That way if the pre-validation fails, no validators are
> added
> at all. If the pre-validation passes, then the others are validated.
>
> The way I implemented pre-validation was to pass the field input to
> the
> form constructor. The form constructor has to gather some data from
> the
> database anyway, so I simply compare that field input to this data to
> ensure it is a valid selection. Hence it is pre-validated.
>
> I looked through the code for isValid methods and it seems that this
> would be a fairly easy feature to implement if there was a mechanism
> in
> Zend_Form::isValid similar to breakChainOnFailure to tell it to stop
> looping through the element validators once one comes back false. I
> could even do that myself, but I'm reluctant to start tinkering around
> changing the code base of ZF.
>
>
>
> --Seth
>
> -----Original Message-----
> From: Matthew Weier O'Phinney [mailto:matthew@zend.com]
> Sent: Thursday, July 16, 2009 4:56 PM
> To: fw-mvc@lists.zend.com
> Subject: Re: [fw-mvc] breakChainOnFailure
>
> -- Seth Atkins <satkins@nortel.com> wrote (on Thursday, 16 July 2009,
> 02:47 PM -0500):
>> I believe this feature works only within the scope of a single
>> element
>
>> validation. I may be misunderstanding how it works, but I believe it
>> means that if the first validation fails, it stops validating and
>> outputs only the first validation error message.
>
> It means that if the given validator fails, it will not process any
> validators occurring after it in the chain.
>
>> What I am looking for is a way to break out of all form validation if
>> an element fails. If several fields have validators set, and the
>> first
>
>> field fails its check, then I'd like the $form->isValid($data) to
>> exit
>
>> the validation loop that takes it through the remaining elements. I
>> don't see a way to do this within the functions provided in ZF unless
>> I am missing something. Am I missing something?
>
> Zend_Form does not allow for this; it attempts to validate all
> elements,
> so that you can return all possible validation errors for all elements
> back to the user.
>
> You could likely write a validator that you insert at the top of each
> element that checks the parent form for any failed element validations
> and skips validation -- but it would mark that element as failed in
> validation as well.
>
> --
> Matthew Weier O'Phinney
> Project Lead | matthew@zend.com
> Zend Framework | http://framework.zend.com/
>

没有评论: