Проблемы с проверкой формы в cakephp

У меня странная проблема с проверкой формы. У меня есть 4 входа в моей форме, и все они проверяются.

Все работает нормально, пока не проверит мое последнее поле ввода, которое является полем ввода электронной почты. У меня есть два правила, установленных в поле ввода электронной почты: 'rule' => 'notEmpty' , 'rule' => 'email'. Форма проверяется и публикуется просто отлично, когда ей нужно только проверить правило notEmpty, но если найден недействительный адрес электронной почты, он проверяет его, но не публикует даже после ввода действительного адреса электронной почты.

Вот несколько сценариев:
Первый: Пользователь вводит правильные записи для всех входных данных
Все работает нормально, форма отправляется и данные добавляются в базу данных.

Второе: пользователь вводит действительные записи для всех полей, кроме адреса электронной почты, но затем вводит действительные адреса электронной почты для всех входных данных
Предположим, что пользователь нажимает кнопку "Отправить" после ввода только первых трех полей< /em>
Все работает нормально после того, как они вводят действующий адрес электронной почты с первого раза, сообщения формы и данные добавляются в базу данных.

Три: пользователь вводит действительные записи для всех, кроме адреса электронной почты (предоставляет неверный адрес электронной почты)
Отображает сообщение об ошибке, но даже после предоставления действительного адреса электронной почты ничего не происходит. Я заметил, что страница продолжает перезагружаться с одними и теми же данными, если вы продолжаете нажимать кнопку отправки.
Кроме того, сообщение об ошибке исчезает, если кнопка отправки снова нажимается после первого нажатия

Вот моя модель:

class Member extends AppModel
{
    public $validate = array(
        'id' => array(
            'rule' => 'notEmpty'
            ),
        'Student_First_Name' => array(
            'rule' => 'notEmpty'
            ),
        'Student_Last_Name' => array(
            'rule' => 'notEmpty'
            ),
        'Student_Email' => array(
            'emailRule-1' => array(
                'rule' => 'notEmpty',
                'last' => false
                ),
            'emailRule-2' => array(
                'rule' => 'email',
                'message' => 'Please enter a valid email address.'
            ))
        );

}

Вот Контроллер:

class MembersController extends AppController
{
    ...
    public function add()
    {
        if($this->request->is('post'))
        {
            $this->Member->create();

            if($this->Member->save($this->request->data))
            {
                $this->Session->setFlash('Member has been added!');
                $this->redirect( array( 'action' => 'members'));
            }
            else
            {
                $this->Session->setFlash('Unable to add member.');
            }
        }
    }
    }

Я прошу прощения за такой длинный пост из-за такой простой/раздражающей проблемы, но я ненавижу подобные вещи в своих приложениях/веб-сайтах.

Спасибо.


person Archon    schedule 09.04.2013    source источник
comment
Почему вы используете 'last' => false? для меня не имеет смысла ... если вы не ввели адрес электронной почты, нет необходимости также проверять действительную форму электронной почты ...   -  person mark    schedule 09.04.2013
comment
Да, в этом нет необходимости, я просто просматривал документацию и пробовал разные вещи.   -  person Archon    schedule 09.04.2013


Ответы (1)


Ваша форма, скорее всего, будет другой формой сообщения: put.

Краткое объяснение:

POST is simulated by FormHelper for 'create' form, or any post form that isn't modifying an existing record.

PUT is for updating existing records.

См. http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#FormHelper::create

Ваше действие добавления считается "создать".

Кстати: код торта показывает, что на самом деле он ДОЛЖЕН быть POST (см. комментарии ниже). Итак, где-то в вашем коде вы заставляете помощника изменить его с POST на PUT. Возможно, вы делаете какие-то нестандартные вещи.

Совет: если вы хотите быть в безопасности, проверьте оба:

if ($this->request->is('post') || $this->request->is('put')) {}

чтобы убедиться, что оба типа сообщений действительны.

Также старайтесь придерживаться соглашений и используйте имена полей в нижнем регистре с подчеркиванием. И последнее, но не менее важное: отмените проверку «id». Бессмысленно проверять первичные ключи.

person mark    schedule 09.04.2013
comment
Потрясающий! это помогло.... Я чувствую себя довольно глупо, лол. Потратил на это часы. Новичок в фреймворке и веб-разработке в целом, я был знаком с запросами POST и GET. В любом случае, очень ценю помощь! - person Archon; 09.04.2013
comment
Неправильно. Создание новой записи — это POST, редактирование записи — это PUT. Это указано в руководстве. и видно по выпечке шаблон кода. - person ADmad; 09.04.2013
comment
@Archon Почему у вас есть проверка notEmpty для вашего поля идентификатора? При создании новой записи он будет пуст. - person ADmad; 09.04.2013
comment
По какой-то причине это все еще должно было быть (PUT) для его действия по созданию/добавлению. Итак, где-то по пути Cake делает запрос PUT... - person mark; 09.04.2013
comment
@Admad, мое поле идентификатора не увеличивается автоматически. Это будет 9-значный номер студента, который будет использоваться для уникальной идентификации кортежа как студента. У меня будет больше проверок в поле id, например, регулярное выражение, чтобы убедиться, что идентификатор учащегося соответствует соглашениям школы (не изучал, есть ли в cakePHP встроенное правило регулярных выражений, скорее всего, так и есть). Итак, пожалуйста, дайте мне знать, если я на правильном пути здесь. - person Archon; 09.04.2013
comment
@mark, есть идеи, как узнать, где я мог заставить его сделать PUT? Я следовал примеру блога, чтобы делать все до сих пор, поэтому не знал, где я мог сделать некоторые нетрадиционные вызовы фреймворка. Я предполагаю, что одна вещь, которую я делаю по-другому, - это поле id, которое не увеличивается автоматически. - person Archon; 09.04.2013
comment
@Archon CakePHP официально поддерживает только целые числа с автоматическим приращением и uuid в качестве первичного ключа. Если вы используете что-то другое, вероятно, у вас возникнут проблемы с некоторыми функциями модели. Я предлагаю вам сделать автоматическое увеличение поля идентификатора и использовать отдельное поле для хранения идентификатора студента в соответствии с вашими потребностями. - person ADmad; 10.04.2013