2011-07-16 43 views
9

我想要一個複選框「Agree TOS」。CakePHP「Agree 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' 
       )); 
+3

您的規則這個數組應該是'$ validate',而不是'$ check',我相信。 – lxa

+0

也許矯枉過正,但你也可以利用[Confirmable Behavior](確認行爲)(http://www.dereuromark.de/tag/confirmable/)。 – mark

回答

0

我相信你需要嘗試將其保存到你的模型,以趕上你的TOS規則。我應該這樣做=

if(!$mymodel->save()){ 
// catch error tos. 
} 
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'); 
} 
0

你甚至不必有對TOS驗證規則,只是檢查在

if($this->data['Model']['tos']==1){ 
    // save data 
    }else{ 
    //set flash 
    } 
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/

+0

github鏈接已死亡 – Ruben

+0

thx。分支修改鏈接。我糾正了它。 – mark

16

這似乎爲我工作。希望它會有所幫助。

在模型:

  '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

型號

'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')); ?>