Где ID?
Надоело мне писать в начале каждого метода контроллера, требующего для работы ID записи, проверку на наличие этого самого ID.
Ну вот например для вызовы методов /controller/view без ID записи смысла не имеют. Я в таких случаях делаю redirect на метод index. Примерно так:
function view() { if (!$this->Model->id) { $this->redirect(array('controller'=>'mycontroller', 'action'=>'index')); die(); } /* * Ну тут код дальше */ }
Один раз это написать можно, два раза – начинает раздражать. В итоге задумываешься об автоматизации этой проверки. Что я и сделал.
Маленький метод, который можно добавить в AppController. Работу с PHP4 не тестировал. И работу с контроллером, у которого несколько моделей тоже ;-)
protected function redirect_if_no_id($params = array()) { // Значения по умолчанию $defaults = array( 'flash' => null, 'id' => $this->{$this->modelNames[0]}->id, 'action' => 'index' ); extract(array_merge($defaults, $params)); // Если ID есть, то ничего не делаем if ($id) return; // Если передана переменная flash -- отдадим ее // SessionComponent'у // Здесь хорошо бы проверку, загружен-ли // SessionComponent вообще if ($flash) $this->Session->setFlash($flash); // Редиректим и умираем $this->redirect(array('controller'=>$this->params['controller'], 'action'=>$action)); die(); }
Как видно, можно передавать (но не обязательно), массив с параметрами:
- ключ id – значение, которое надо проверить. Если не указано, используем id от первой загруженной модели
- ключ flash – сообщение для пользователя. Если не указано, значит все делаем молча
- ключ action – действие, на которое надо редирект сделать. Если не указано, то index.
Все это будет работать в пределах одного контроллера, т.е. редирект будет на действие того-же контроллера. Желающие могут доработать напильником.
-
Герман
-
Сергей
-
Сергей
-
Сергей
-
kondrat



