2012-06-26 2 views
0

Я хочу, чтобы форма, которую я создал в CakePHP2, отображалась пустой, если данные не были отправлены, а заполнены данными из модели, если существует ключ сеанса Person.id. Вот мой код:Использование идентификатора в сеансе для заполнения полей формы в CakePHP

function about() { 
    // Make session key for debug purposes 
    $this->Session->write("Person.id",1); 
    if($this->request->is('post')) { 
     debug("post"); 
    } else { 
     debug("not post"); 
     // Use the value in the session Person.id to find the 
     // record in the Person model 
     $this->params->data = $this->Person->findById($this->Session->read("Person.id")); 
    } 
} 

Большинство из приведенных выше работ. Если я получаю доступ к представлению без публикации каких-либо данных, тогда форма заполняется данными из модели Person, как и ожидалось.

Однако, если я отправлю форму, я до сих пор получаю отладочное сообщение not post, когда ожидал post.

Если я прокомментирую строку, присваивающую данные $this->params->data, то отправка формы дает мне правильное отладочное сообщение post, но я не понимаю, почему это происходит.

Если заполнение $this->params->data означает то же самое, что и Cake в качестве сообщения формы, то как я могу проверить подлинное, подлинное сообщение?

UPDATE: Если изменить if($this->request->is('post')) в if($this->request->data) то работает точно, как я хочу, чтобы это .... но я до сих пор не понимаю, почему.

ответ

1

В CakePHP2, когда вы создаете форму в представлении с FormHelper, он automatically generates это поле

<input type="hidden" name="_method" value="PUT"/> 

при редактировании записи (то есть его первичный ключ установлен).

Когда вы отправляете форму, это скрытое поле переопределяет метод HTTP, и ваш запрос не рассматривается как POST, а как PUT. Вы можете обновить свой тест, как это:

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

или отражать код, который вы получаете, когда вы используете bake

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

Если вы хотите увидеть это сами, просто отладить запрос:

debug($this->request); 

Затем немного не по теме, но если ключ «Person.id» в вашем сеансе является зарегистрированным пользователем, вы, вероятно, используете специальный механизм для входа/выхода пользователей, и это, вероятно, будет стоить глядя на AuthComponent.

+0

большое объяснение, спасибо! 'Person.id' на самом деле является результатом запроса, который ищет модель' Person' для 'id' записи на основе отправленного адреса электронной почты. Я использую вышеуказанный код как часть многоступенчатой ​​формы подачи. Данные попадают в базу данных по мере ввода каждого шага, но мне нужен способ вытащить данные обратно в форму, если пользователь решил вернуться к одному из предыдущих этапов. – Joseph

Смежные вопросы