Проверка данных в CakePHP не работает

Я не знаю, почему это не работает (я использую CakePHP 2.1, а также пробовал 2.0):

Вот модель

class User extends AppModel
    {
        public $validate = array('username' => array('rule' => 'email'));
    }

Вот контроллер

class UsersController extends AppController
    {
        function index()
        {
            $this->set('users', $this->User->find('all') );
        }

        function add()
        {
             if (!empty($this->request->data)) 
             {            
                if ($this->User->save($this->request->data)) 
                {                
                    $this->Session->setFlash('User has been registered.');
                    $this->redirect(array('action' => 'index'));            
                }        
             }
        }
    }

Вот добавить вид

<h1>Add Post</h1>
<?php
    echo $this->Form->create('User');
    echo $this->Form->input('username');
    echo $this->Form->input('password');
    echo $this->Form->end('Register');
?>

И он проверяет все, что я пишу... И он должен проверять, является ли имя пользователя электронной почтой...

Это невозможно! Это должно работать! - но это не...

Я также проверил это с помощью cake php 2.0, и он все еще не работает - пожалуйста, помогите, это так просто, что мне нужно работать...

Может быть, что-то с моей таблицей БД не так???

CREATE TABLE `users` (
   `id` int(10) unsigned not null auto_increment,
   `username` varchar(50),
   `password` varchar(50),
   `created` datetime,
   `modified` datetime,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9;

Это очень странно - в папку с моим приложением я добавляю только "UserModel.php", "UserController.php" и "add.ctp" и конфиг db - все, что я написал выше - и валидация не работает!!!


person user606521    schedule 21.04.2012    source источник


Ответы (4)


Я думаю, что массив $validate объявлен неправильно.

Попробуй это:

$validate = array('username' => array(
                        'email' => array(
                            'rule' => array('email')
                        )));

или это:

$validate = array('username' => 'email');

См. http://book.cakephp.org/2.0/en/models/data-validation.html

person nIcO    schedule 22.04.2012
comment
Я уже пробовал, и все так же - и я прочитал эту главу, и я делаю все именно так, как это должно быть сделано, и все равно не работает - я не знаю, что делать! Может быть, если это сработает для вас, вы могли бы отправить мне сценарий модели/представления/контроллера + базы данных на [email protected]? - person user606521; 22.04.2012
comment
Ты прав извини. Ваш синтаксис также кажется правильным. Я всегда использую свой первый пример, потому что это то, что генерирует cake bake. Тогда я не знаю. Вероятно, вам следует отладить invalidFields() в Model.php из ядра. Например, для начала вы можете убедиться, что массив $validate — это то, что вам нужно, если вы поместите debug($this->validate) в эту функцию. - person nIcO; 22.04.2012

Хорошо, я знаю, что не так:

  1. мое имя файла модели называлось «UserModel.php», и оно должно быть «User.php»
  2. В начале файла «User.php» мне пришлось поставить «App::uses('AppModel', 'Model');'
person user606521    schedule 22.04.2012

Вы должны написать в своем контроллере ( UserController )

($this-User->set($this->request->data)

до того, как функция подтвердит правильность Как вы видите;

 function add()
    {
         if (!empty($this->request->data)) 
         {     $this->User->set($this->request->data);
            if ($this->User->validates()) 
            {   $this->User->save($this->request->data)
                $this->Session->setFlash('User has been registered.');
                $this->redirect(array('action' => 'index'));            
            }        
         }
    }
person user3038299    schedule 26.11.2013

Хорошо... это то, что я делаю (также меняю имя пользователя на адрес электронной почты)

$components = array('Auth' => array('authenticate' => array('Form' => array('fields' => array('username' => 'email', 'password' => 'password')))), 'Email');

Это работает. В CakePHP 1.3 вам нужно было указать и имя пользователя (электронную почту), и пароль. Поэтому, когда я перешел на CakePHP 2.1, я продолжал делать то же самое, и у меня не было проблем с проверкой.

все, что вам нужно, вы можете увидеть здесь: поваренная книга

person YonoRan    schedule 22.04.2012
comment
Но я еще не использую компонент аутентификации, поэтому он должен работать нормально и проверять, является ли поле «имя пользователя» действительным адресом электронной почты... - person user606521; 22.04.2012
comment
Извините... Я не заметил, что вы не используете компонент Auth... Плохо. Теперь, когда я присмотрюсь поближе... Почему бы вам не изменить таблицу, чтобы у вас было поле электронной почты вместо поля имени пользователя? зачем иметь имя пользователя и обращаться с ним как с электронной почтой, а не просто с электронной почтой? - person YonoRan; 22.04.2012
comment
А также мне сейчас все равно, когда пользователь входит в систему, но регистрирует их, поэтому это должно быть базовое сохранение UserModel... - person user606521; 22.04.2012