Проблеми с валидирането на формуляр в 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 на PUT там. Може би правите някои нетрадиционни неща.

Съвет: Ако искате да сте на сигурно място, проверете и двете:

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

за да се уверите, че и двата типа публикации са валидни.

Също така се опитайте да се придържате към конвенциите и да използвате малки_case_подчертани имена на полета. И накрая, но не на последно място, премахнете валидирането на "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 за вашето поле за id? Ще бъде празен при създаване на нов запис. - person ADmad; 09.04.2013
comment
По някаква причина все още трябваше да бъде is(PUT) за неговото действие за създаване/добавяне. Така че някъде по линията Cake прави PUT заявка... - person mark; 09.04.2013
comment
@Admad, моето id поле не се увеличава автоматично. Това ще бъде 9-цифрен номер на ученик и така ще се използва за уникално идентифициране на кортежа като студент. Ще имам повече проверки на полето за id, като регулярен израз, за ​​да се уверя, че идентификационният номер на ученик съответства на конвенциите на училището (не съм разгледал дали cakePHP има вградено правило за регулярни изрази, най-вероятно има.) Така че, моля, уведомете ме дали съм на прав път тук. - person Archon; 09.04.2013
comment
@mark, някаква идея как да разбера къде може да съм го принудил да направи PUT? Следвах примера на блога, за да направя всичко досега, така че не знам къде може да съм направил някои нетрадиционни извиквания към рамката. Предполагам, че едно нещо, което правя различно, е полето за идентификатор, което не се увеличава автоматично. - person Archon; 09.04.2013
comment
@Archon CakePHP официално поддържа само цели числа с автоматично нарастване и uuid като първичен ключ. Ако използвате нещо друго, вероятно ще имате проблеми с някои от функциите на модела. Предлагам ви да направите автоматично нарастване на полето за идентификатор и да използвате отделно поле за съхраняване на идентификатора на ученика според вашите нужди. - person ADmad; 10.04.2013