SergeyРешение на основе $this->request->is_initial() понравилось, я как-то не учел этот момент -сделаю также
А сами контроллеры не очень: много действий производится вручную и не логично. Можно все оптимизировать и код контроллеров станет вдвое меньше.
Доберусь до дома, покажу свой вариант. Я как раз об этом собирался писать в следующем уроке по созданию cms
Код:
$output = $this->response->body();
$this->response->body($output);
для чего?
Код:
$id = (int) $this->request->param('id', 0);
проще фильтр в орм настроить, чем приводить типы каждый раз
Код:
$comment->values($_POST)->save();
$_POST ? а почему не $this->request->post()? там вроде переменные уже подготовлены
Вместо:
Код:
$this->_route = Route::get('comment')->uri(array('action' => 'list'));
можно же было сделать универсальный вариант:
Код:
$this->_route = $this->request->route()->uri();
или
Код:
$class = strtolower(substr(get_class(), 11)); // Controller_Comment => comment
$this->_route = Route::get($class)->uri();
а array('action' => 'list') в default прописать
Код:
$view = View::factory('comment/form')
->bind('errors', $this->_errors);
..
$this->response->body($view);
тоже можно было сделать универсальным: задание $view перенести в before, задание ответа в after, место 'comment/form'
Код:
$class = strtolower(substr(get_class(), 11));
$class = str_replace('_', DS, $class) . DS . $this->request->action();
Код:
$redirect = empty($this->redirect) ? $this->_route : $this->redirect;
в before забиндить
Код:
$this->valid_post('comment')
это должно быть в модели
код сохранения в метод модели инкапсулировать, например:
Код:
if ( ! $this->_errors = $comment->save($this->request->post()))
{
Kohana::$log->add(LOG::INFO, 'Comment: :title updated.', array(':title' => $comment->title));
if (!$this->_internal)
{
$this->request->redirect($redirect, 200);
}
}