2011-07-16 16 views
9

Próbuję mieć pole wyboru "Zgadzam się z TOS".CakePHP "Zgadzam się TOS" Sprawdzanie pola Checkbox

Jeśli pole wyboru to niezaznaczone, chcę wysłać wiadomość Flash.

Jak to zrobić?

moim zdaniem:

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

Moja Model:

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

Reguła Jeśli chodzi o tablicę s, powinno to być '$ validate', a nie' $ check'. – lxa

+0

Może przesadzić, ale możesz również wykorzystać [Confirmable Behavior] (http://www.dereuromark.de/tag/confirmable/). – mark

Odpowiedz

0

wierzę trzeba spróbować zapisać go do modelu złapać reguły TOS. zrobić coś podobnego =

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

$this->ModelName->invalidFields() zwraca tablicę pól, które nie powiodła się.

Możesz spróbować wyszukać to pole tos i wypisać komunikat, jeśli klucz istnieje.

~ niesprawdzone (nie jestem pewien z góry na głowie dokładną strukturę tablicy invalidFields powrotnej.

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

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

nawet nie mieć regułę walidacji dla tos, wystarczy sprawdzić, że w sterowniku przed zapisaniem danych.

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

Zasadniczo, można dodać regułę „notEmpty” na tym polu do tablicy modelu public $validate. w ten sposób zostanie wygenerowany błąd na Model->validates(), jeśli pole wyboru nie zostało zaznaczone.

Może trochę narzut w twoim przypadku, ale jeśli zdarzy ci się użyć go częściej spróbuj podejścia DRY (nie powtarzaj się). można również użyć zachowanie tego użyć to czyste i bez odpuszczania zbytnio z modelu/kontrolera:

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

i działania regulatora

// 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

dla 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

szczegóły: http://www.dereuromark.de/2011/07/05/introducing-two-cakephp-behaviors/

+0

Link do github jest martwy – Ruben

+0

thx. rozgałęzienia zmodyfikowały łącza. Poprawiłem to. – mark

16

Wydaje pracuje dla mnie. Mam nadzieję, że to pomoże.

W modelu

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

Biorąc:

<?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

modelu

'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 
     ), 
    ), 

Zobacz

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