Как объединить действия add и edit вместе
Контроллер
Обычно, когда вы создаете приложение, то вам нужны и страница для добавления записей и для их редактирования. Контроллеры и отображения, которые создаются с помощью консоли, считают эти действия отдельными сущностями, что приводит к дублированию кода.
Вот действия add и edit, созданные через консоль:
function add() {
if (!empty($this->data)) {
$this->Post->create();
if ($this->Post->save($this->data)) {
$this->flash(__(‘User saved.’, true),
array(‘action’=>‘index’));
} else {
}
}
}
function edit($id = null) {
if (!$id && empty($this->data)) {
$this->flash(__(‘Invalid Post’, true), array(‘action’=>‘index’));
}
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->flash(__(‘The Post has been saved.’, true),
array(‘action’=>‘index’));
} else {
}
}
if (empty($this->data)) {
$this->data = $this->Post->read(null, $id);
}
}
Как вы видите, весь метод add продублирован в методе edit. Мы можем избавиться от метода add и заставить метод edit обрабатывать создание новых записей. Есть несколько способов сделать это.
Можно удалить метод add() полностью, добавив маршрут, который перенаправляет /add на метод edit
Router::connect(‘/:controller/add’, array(‘action’ => ‘edit’));
Или же можно все ссылки, указывающие на /add, заменить на /edit
Также потребуются некоторые изменения в методе edit. Удалите первый блок if:
if (!$id && empty($this->data)) {
$this->flash(__(‘Invalid Post’, true), array(‘action’=>‘index’));
}
Измените последний блок if c:
if (empty($this->data)) {
на:
if ($id && empty($this->data)) {
Метод edit теперь должен выглядеть так:
function edit($id = null) {
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->flash(__(‘The Post has been saved.’, true),
array(‘action’=>‘index’));
} else {
}
}
if ($id && empty($this->data)) {
$this->data = $this->Post->read(null, $id);
}
}
Отображение
Можно удалить файл add.ctp, потому что он больше никем не вызывается. Add.ctp и edit.ctp по умолчанию очень похожи, так что таким образом удастся избежать избыточности кода. Отображение edit будет работать для создания новых записей без каких-либо изменений. Если есть необходимость, то можно изменять подписи в зависимости от текущего действия.
echo sprintf(__(‘%s %s’, true),
__(ucwords($this->action), true),
__(‘Post’, true));
Выведет «Добавить запись» или «Изменить запись» в зависимости от ситуации (и при наличии локализации, конечно же).
Это — перевод отрывка из книги Super Awesome Advanced CakePHP Tips