0

这是验证规则:

'name'=>array(
        'Please enter customer\'s name'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter customer\'s name'
        ),
        'Unique' => array(
            'rule' => array('nameIsUniqueForCompany'),
            'message' => 'Customer with these initials already exists'
        )
    ),  


public function initialsAreUniqueForCompany($data){

    $company_id = $this->data['Customer']['company_id'];
    $initials = $this->data['Customer']['initials'];

    if($this->find('first', array('conditions'=>array('initials'=>$initials, 'company_id'=>$company_id))))
    {
        return false;

    }
    return true;        
}

问题是该规则应用于当前对象。假设我想更新一个名为“ABC”的客户,但我只是更改了他的电话号码。然后应用程序将查看名称 ABC 是否已经存在,它当然会找到它并且不会更新。

有任何想法吗?

4

4 回答 4

2

您的实施存在缺陷:根据设计,您的验证规则将始终仅适用于添加,不适用于编辑。在编辑时,您还需要考虑当前 ID。

查看我的http://www.dereuromark.de/2011/10/07/maximum-power-for-your-validation-rules/帖子。关于唯一性的部分包含一个工作方法。对你来说,这意味着,使用我增强的独特验证方法:

'name' => array(
    'validate' => array(
        'rule' => array('validateUnique', array('company_id')),
        'message' => 'Customer with these initials already exists',
    ),
),

基本上,您总是在编辑时提交 id(通过隐藏的表单字段 - 无论如何由烘焙表单自动完成),并通过在您的条件中使用“id!= current”将其从查找结果中删除:

$this->alias . '.id !=' => $id

推理:当前编辑的记录不应该触发验证规则错误,当然:)

于 2013-09-20T15:59:12.423 回答
2

你可以传递这样的东西:

'email' => array(
        'unique' => array(
            'rule' => 'isUnique',
            'message'=>'This e-mail has been used already',
            'on'=>'create'
        )
)

数组中有一个节点'on'=>'create',它仅在创建记录时应用规则。当然还有'on'=>'update',这将在记录更新时适用。

对于更新验证,您应该考虑检查行 ID 不同的自定义规则。

于 2013-09-20T21:03:17.167 回答
0

在您的控制器中

public function edit($id = null) {
    if ($this->request->isPut() || $this->request->isPost()) {
        if ($this->YourModel->save()){
            // do what ever you want
        }
    } else {
        $this->request->data = $this->YourModel->read(null, $id)    
    }
}

并在您的edit.ctp文件中

echo $this->Form->create('YourModel');
echo $this->Form->hidden('id');

如果您发现任何问题,请告诉我,很高兴为您提供帮助。

于 2013-09-20T12:02:59.543 回答
0

你可以试试

'subscription_name' => array
                                (
                                        'required'=>true,
                                        'rule'    => 'notEmpty',
                                        'message' => 'Please enter Package name.',
                                        'Unique'=>array(
                                        'rule'   => 'isUnique',
                                        'message'=>'package name is already exit..'
                                        )
                                ),
于 2013-09-21T10:30:14.817 回答