Сеть и протокол HTTP не сохраняют состояния. Это означает, что в веб-программировании по умолчанию данные не сохраняются между запросами. На самом деле в CakePHP по умолчанию включены сеансы, которые могут помочь обойти эту проблему во многих случаях, но здесь нам, вероятно, нужно что-то другое.
$this->data
заполняется только из полей формы, которые есть на странице. Это означает, что в вашем контроллере вы имеете дело с несколькими случаями:
Запрос GET: давайте загрузим данные из базы данных.
Запрос POST: давайте сохраним данные,
a) Успешно: либо перенаправить на другую страницу, либо загрузить все данные заново.
b) Неудачно: давайте загрузим все данные из базы данных и объединим их с нашими отправленными (недействительными) данными для повторного отображения формы. Если мы не выполняем функцию слияния, пользователь должен перепечатать все изменения, что редко желательно.
Попробуйте что-то вроде этого:
function manage_photos($id) {
$this->set('title', 'Edit your photos');
$this->Unit->id = $id;
if (empty($this->data)) {
// 1. GET request
$this->data = $this->Unit->read();
} else {
if ($this->Unit->saveAll($this->data)) {
// 2a POST successful
$this->Session->setFlash('Your photos have been updated.', 'success');
$this->data = $this->Unit->read();
} else {
// 2b POST unsuccessful
Set::merge($this->Unit->findById($id), $this->data);
}
}
}
Set::merge()
, часть библиотеки CakePHP, выполнит работу по объединению отправленных и полных данных.