CakePHP“同意TOS”复选框验证

时间:2011-07-16 14:16:27

标签: validation cakephp

我正在尝试使用Checkbox“同意TOS”。

如果复选框未选中,我想发布一条Flash消息。

我该怎么做?

我的观点:

<?php   
        echo $form->create('Item', array('url' => array_merge(array('action' => 'find'), $this->params['pass'])));
        echo $form->input('Search', array('div' => false));
        echo $form->submit(__('Search', true), array('div' => false));
        echo $form->checkbox('tos', array('label' => false, 'value'=>1)).' Agree TOS'; 
        echo $form->error('tos');
        echo $form->end();
?>

我的模特:

var $check = array(
            'tos' => array(
               'rule' => array('comparison', 'equal to', 1),
               'required' => true,
               'allowEmpty' => false,
               'on' => 'index',
               'message' => 'You have to agree TOS'
               ));

6 个答案:

答案 0 :(得分:17)

这似乎对我有用。希望它会有所帮助。

模特:

            'tos' => array(
                'notEmpty' => array(
                    'rule'     => array('comparison', '!=', 0),
                    'required' => true,
                    'message'  => 'Please check this box if you want to proceed.'
                )

在视图中:

    <?php echo $this->Form->input('tos', array('type'=>'checkbox', 'label'=>__('I confirm I have read the <a href="/privacy-statement">privacy statement</a>.', true), 'hiddenField' => false, 'value' => '0')); ?>

答案 1 :(得分:1)

基本上,您将此字段的规则“notEmpty”添加到模型的public $validate数组中。 这样,如果未选中复选框,则会在Model->validates()上触发错误。

在您的情况下可能会有一些开销,但如果您碰巧经常使用它,请尝试干燥(不要重复自己)方法。您还可以使用此行为来使用此清洁,而不使用模型/控制器进行过多调整:

// view form
echo $this->Form->input('confirmation', array('type'=>'checkbox', 'label'=>__('Yes, I actually read it', true)));

并在控制器操作中

// if posted
$this->Model->Behaviors->attach(array('Tools.Confirmable'=>array('field'=>'confirmation', 'message'=>'My custom message')));
$this->Model->set($this->data);
if ($this->Model->validates()) {
    // OK
} else {
    // Error flash message here
}

1.x中: https://github.com/dereuromark/tools/blob/1.3/models/behaviors/confirmable.php

表示2.x: https://github.com/dereuromark/cakephp-tools/blob/2.x/Model/Behavior/ConfirmableBehavior.php

3.x:https://github.com/dereuromark/cakephp-tools/blob/master/src/Model/Behavior/ConfirmableBehavior.php

细节: http://www.dereuromark.de/2011/07/05/introducing-two-cakephp-behaviors/

答案 2 :(得分:1)

模型

'agreed' => array(
       'notempty' => array(
            'rule' => array('comparison', '!=', 0),//'checkAgree',
            'message' => ''You have to agree TOS'',
            'allowEmpty' => false,
            'required' => true,
            'last' => true, // Stop validation after this rule
            'on' => 'signup', // Limit validation to 'create' or 'update' operations
        ),
    ),

查看

<?php echo $this->Form->input('agreed',array('value'=>'0'),array('type'=>'checkbox', 'label'=>'Agree to TOS')); ?>

答案 3 :(得分:0)

我相信你需要尝试将它保存到你的模型中以捕捉你的tos规则。我应该做类似=

的事情
if(!$mymodel->save()){
 // catch error tos.
}

答案 4 :(得分:0)

$this->ModelName->invalidFields()返回验证失败的字段数组。

您可以尝试在tos字段中搜索此字段,并在密钥存在时输出消息。

〜未经测试(我不确定invalidFields返回数组的确切结构。

$failed_fields = $this->ModelName->invalidFields();

if(array_key_exists('tos', $failed_fields)) {
    $this->Session->setFlash('Please accept the terms and conditions');
}

答案 5 :(得分:0)

你甚至不必拥有tos的验证规则,只需在保存数据之前在控制器上检查一下。

if($this->data['Model']['tos']==1){
     // save data
  }else{
     //set flash
  }