2014-10-23 6 views
1

Я использую CakePHP 2.3.8, и я пытаюсь выяснить, есть ли способ установить определенные правила валидации, необходимые на лету.Изменение валидации на лету в CakePHP

Например, моя модель пользователя имеет номер телефона, имя пользователя, адрес электронной почты и пароль. Если пользователь хочет изменить свое имя пользователя, их номер телефона не требуется. Это означает, что я не могу его установить, потому что тогда, когда вы меняете имя пользователя, ожидается, что в данных будет присутствовать номер телефона.

public $validate = array(

    'username' => array(
     'minLength' => array(
      'rule' => array('minLength', '3'), 
      'message' => 'A username with a minimum length of 3 characters is required' 
     ), 
      'unique' => array(
       'rule' => 'isUnique', 
       'message' => 'This username has already been taken.' 
      ) 
    ), 
    'email' => array(
     'email' => array(
      'rule' => array('email'), 
      'message' => 'Please enter a valid email address.', 
     ), 
     'unique' => array(
      'rule' => 'isUnique', 
      'message' => 'This email address is already in use' 
     ) 
    ), 
    'password' => array(
     'rule' => array('minLength', '8'), 
     'message' => 'A password with a minimum length of 8 characters is required' 
    ), 
    'phone_number' => array(
     'rule' => array('valid_phone'), 
     'message' => 'Invalid phone number', 
    ) 
); 

Чтобы обойти эту проблему, в моем контроллере для соответствующего действия, что я делал это проверка, чтобы убедиться, что ожидаемые затраты были размещены. Если нет, то установите этот показатель до нуля, так что это подтверждено ... такие как

public function change_username(){ 

    if(!isset($this->request->data['username'])){ 
     $this->request->data['username'] = null; 
    } 

    $this->ExampleModel->set($this->request->data); 

    //if it wasn't posted, the username index will be created but set to null. This is my workaround for setting something to "required" 
    if($this->ExampleModel->validates() == true){ 
     //do something 
    } 
    else{ 
     //do something 
    } 
} 

В то время как это работает, я чувствую, что он делает для многих дополнительного кодирования, особенно, если у меня есть форма, которая имеет много входов.

Я также пытался проверить только те входы, которые мне нужны, но если данные не были опубликованы, они игнорируют их. Например,

if($this->ExampleModel->validates(array('fieldList' => array('phone')) == true){ 
    ..... 
} 

Если «телефон» не был отправлен, он не проверяет его.

Есть ли способ установить требуемое для правильности ввода данных на «на лету»? Я нашел this article, используя множество наборов правил проверки, и, хотя он будет выполнять то, что я хочу, будет много повторного кодирования.

Перед проверкой, могу ли я установить требуемый ввод?

+0

Если показать только электронная почта поле на форме, то только электронная почта будет подтверждено .Вы не нужно беспокоиться о usename, PWD проверки –

ответ

1

Во-первых, в правилах валидации модели у вас есть PHONE_NUMBER, но все же пытается проверить телефон, нет правила проверки для телефона. Было бы идеально request-> данные [], чтобы соответствовать модели полей, вы можете восстановить массив и т.д.

От book.cakephp:

Это добавит одно правило к полю пароля в модели. Вы можете объединять несколько вызовов, чтобы добавить, чтобы создать как можно больше правил, как вам нравится:

$this->validator() 
    ->add('password', 'required', array(
     'rule' => 'notEmpty', 
     'required' => 'create' 
    )) 
    ->add('password', 'size', array(
     'rule' => array('between', 8, 20), 
     'message' => 'Password should be at least 8 chars long' 
    )); 
Смежные вопросы