[html-formfu] Validate DBIx::Class unique constraints

Carl Franks fireartist at gmail.com
Mon Dec 6 11:15:21 GMT 2010


On 6 December 2010 11:09, Tim Rayner <tfrayner at gmail.com> wrote:
> On 6 December 2010 10:58, Carl Franks <fireartist at gmail.com> wrote:
>> On 6 December 2010 10:47, Erez Schatz <moonbuzz at gmail.com> wrote:
>>> On 12/03/2010 01:35 PM, Carl Franks wrote:
>>>
>>>> There's also a HTML::FormFu::Constraint::DBIC::Unique
>>>
>>> Thanks, its a good solution, however...
>>>
>>>> I'm not sure what you mean by "this doesn't work if the user enters
>>>> his own information", can you give an example?
>>>
>>> When a user profile page loads, it is populated with current
>>> information. If a user clicks on "submit" it then submit all information
>>> that is in the form. Any "Unique" test will fail, seeing as the
>>> information is already in the DB - under the user's name!
>>>
>>> Is there a way to tell HTML::FF "validate only values that have been
>>> changed"?
>>
>> Ah, I getcha.
>> I think the solution here would be to use different forms for the "add
>> profile" and the "edit profile" functions.
>> The first has the Unique constraint, the second doesn't.
>>
>> An easy way to reuse the same basic form, if the only difference is
>> the constraint, would be something like this:
>>
>> edit.yml
>> ===
>> elements:
>>    - name: username
>>
>>
>> add.yml
>> ===
>> load_config_file: 'edit.yml'
>> constraints:
>>    - type: 'DBIC::Unique'
>>      name: username
>>
>> Will this work for you?
>> Carl
>
> Hi,
>
> I've been using just a single form for both add and edit, using the
> self_stash_key option from H::F::C::DBIC::Unique. The idea is that you
> put the DBIC row object being edited onto the Catalyst stash and then
> name that stash key in the form config. The uniqueness constraint will
> ignore this one object if it's on the stash. A simplified (but
> working) example from our project:
>
>  - type: Text
>    name: date
>    label: Visit Date
>    constraints:
>      - Required
>      - type:    DBIC::Unique
>        resultset:   Visit
>        self_stash_key:  object
>        message: This visit already exists
>        others:  patient_id
>
> In this case the 'visit' object being edited is put on the stash under
> the 'object' key (this example also illustrates including 'patient_id'
> as a unique constraint, alongside 'date'; i.e. only one visit per
> patient per date). There are formatting constraints I've omitted here
> for the sake of clarity.

Thanks Tim!
I'd only just found this in the source, when your email came in :)

btw, it looks like the object needs to be on the form's stash, not the
Catalyst stash.

Cheers,
Carl



More information about the HTML-FormFu mailing list