On Sat, Mar 26, 2011 at 7:40 PM, euromark <dereurom...@googlemail.com> wrote:
> I encountered this problem several times with some batch imports or
> multiple form boxes saved together.
>
> You have a validation rule "isUnique" for the title.
> If you validate all your - lets say 15 - records, they are OK, even if
> two of them have the same name.
> Thats because the validation can only compare the 15 records to the
> current db content, not to each other.
>
> In some cases you could probably just compare the new values and find
> out if there are more than 2 of the same title.
> But with some beforeValidation or beforeSave or even behaviors this is
> not as easy anymore.
>
> Did anyone find a solution to this problem?
> I was thinking:
> Creating "virtual records" in a special "isUnique" validation rule and
> not only checking on "isUnique" in the DB but also comparing the value
> to all the previously checked ones.
>
> If you don't do it this way, some of your records will just be omitted
> because the validation fails for them, although saveAll() with
> validate=>first returned true in the first place...

Yes, beforeSave() wouldn't help because it's called for each individual record.

How about something like this in AppModel?

function saveAll($data = null, $options = array())
{
        if (isset($options) && is_array($options) &&
isset($options['validate']) && $options['validate'] !== false)
        {
                foreach($this->validate as $key => $rule_set)
                {
                        if (isset($rule_set['rule']) && 'isUnique' == 
$rule_set['rule'])
                        {
                                $records = Set::extract(
                                        $this->alias.'/'.$key,
                                        $data
                                );
                                
                                if (sizeof($records) > array_unique($records))
                                {
                                        $this->validationErrors[$key] = 
'non-unique values';
                                }
                        }
                }
                
                if (sizeof($this->validationErrors))
                {
                        return false;
                }
        }
        return parent::saveAll($data, $options);
}

Completely untested. And I'm sure it could use some tightening up.

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
cake-php+unsubscr...@googlegroups.com For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to