条件验证

时间:2011-02-09 15:17:25

标签: validation cakephp

我的酒店地址型号:

<?php

class HotelAddress extends AppModel {
    var $name = 'HotelAddress';
    var $belongsTo = array(
        'Hotel' => array(
            'className' => 'Hotel'
        )
    );

    var $validate = array(
        'address' => array(
            'rule' => 'notEmpty',
        )
    );

我的酒店模特

<?php

class Hotel extends AppModel {
    var $name = 'Hotel';
    var $hasAndBelongsToMany = array(
        'HotelCategory' => array(
            'className' => 'HotelCategory'
        )
    );
    var $belongsTo = array(
        'Page' => array(
            'className' => 'Page'
        )
    );
    var $hasMany = array(
        'HotelAddress' => array(
            'className' => 'HotelAddress',
            'dependent' => TRUE
        ),
        'HotelPhone' => array(
            'className' => 'HotelPhone',
            'dependent' => TRUE
        )
    );

我的观点:

<div id="main">
        <h2>Add Hotel</h2>
        <?php echo $this->Session->flash();?>
        <div>
        <?php
        echo $this->Form->create('Hotel');
        echo $this->Form->input('Hotel.name');
        echo $this->Form->input('HotelCategory', array('options' => $hotel_categories, 'multiple' => 'checkbox'));
        echo $this->Form->input('HotelAddress.0.address');
        echo $this->Form->input('HotelAddress.1.address');
        echo $this->Form->input('HotelAddress.2.address');
        echo $this->Form->input('HotelPhone.0.phone');
        echo $this->Form->input('Page.meta_keywords');
        echo $this->Form->input('Page.meta_description');

        echo $this->Form->end('Save Hotel');
        ?>
        </div>
<!-- main ends -->
</div>

我的问题是我不需要验证其他HotelAddress es。如果用户填写至少一个地址,则应进行验证。但是,如果他没有填写任何内容,则应显示错误。

我相信我应该在beforeSave方法上添加代码,但我不知道应该做什么。

更新

我现在在HotelAddress Model中有这个,它通过不验证其他地址是否存在来工作。但是,它仍然可以保存。

var $existing_address = FALSE;
var $validate = array(
    'address' => array(
        'rule' => 'checkOnce',
    )
);

function checkOnce($check) {
    if (isset($this->data['HotelAddress']['address'])) {
        if (! empty($this->data['HotelAddress']['address'])) {
            return $this->existing_address = TRUE;
        } else {
            unset($this->data['HotelAddress']['address']);
            return $this->existing_address;
        }
    }
    return $this->existing_address;
}

3 个答案:

答案 0 :(得分:1)

为什么不从模型中控制验证,并自己编写代码?您可以在beforeSave方法或调用save方法之前调用的方法中进行验证,即:

if($this->validateForm($this->data))
{
    $this->Hotel->saveAll($this->data);
}

答案 1 :(得分:1)

我不会在beforeSave中进行检查,因为你会失去很多Cake的内置验证魔法表格等等。

您可以在模型中创建一个custom validation方法,该方法将返回boolean以表示检查成功。在那里,您可以通过$this->data访问模型的数据,并且可以检查是否存在至少一个地址。

答案 2 :(得分:1)

在调用save之前,我只需在控制器中使用它:

if (empty($this->data['HotelAddress'][1]['address'])) {
    unset($this->data['HotelAddress'][1]['address']);
}
if (empty($this->data['HotelAddress'][2]['address'])) {
    unset($this->data['HotelAddress'][2]['address']);
}