как раз на днях с этим заморачивался на kohana 3. хотелось сделать чтоб можно было создавать произвольные как вы говорите flash страницы
(я их почему-то называю splash страницы) - чтобы можно было добавлять их с минимумом усилий
вот что у меня получилось
PHP:
class Layout_Front extends Controller_Template {
// .....
/**
* Redirects to splash page
*
* @param string $code splash data code
* @param array $params splash data parameters
*/
protected function showSplash($code, array $params = NULL) {
$uri = sprintf("splash/%s", str_replace(array('_', '.'), '/', $code));
$code = str_replace(array('/', '.'), '_', $code);
$this->sess->set('splash_code', $code);
if (NULL !== $params && is_array($params)) {
$this->sess->set('splash_params', $params);
}
$this->request->redirect($uri);
}
}
теперь после успешной обработки формы (например сохранение профиля пользователя) я делаю просто:
PHP:
$this->showSplash('profile/saved');
перед этим добавив в конфиг соответствующее сообщение:
application/messages/splash.php
PHP:
<?php
return array(
// .......
'profile_saved' => array(
'message' => 'Profile saved',
'redirect' => 'home',
'timeout' => 5,
),
);
метод showSplash записывает в сессию некий код (в данном случае profile_saved) и делает редирект на адрес /splash/profile/saved, где из сессиии извлекается код
и по этому коду извлекаются данные из application/messages/splash.php - в данном случае это сообщение, которое показывается пользователю,
адрес, на который надо перейти после показа сообщения и время показа сообщения (передается с header Refresh)
т.е. для новой Splash-страницы как правило достатосно добавить соответствующий код с сообщением и возможно другими данными
сам контроллер Splash-страниц
PHP:
class Controller_Splash extends Layout_Front {
public function action_index() {
if ($code = $this->sess->get('splash_code', FALSE)) {
$params = $this->sess->get('splash_params', FALSE);
$this->sess->delete('splash_code');
$this->sess->delete('splash_params');
// get the splash data by code
$data = Kohana::message('splash', $code);
if (empty($data)) {
$data = array('message' => 'Unknown');
}
// possible to specify specific view in the splash data
$_view = isset($data['view']) ? $data['view'] : 'front/splash/message';
$content = View::factory($_view);
if (isset($data['redirect'])) {
// add Refresh header
$_uri = $params ? strtr($data['redirect'], $params) : $data['redirect'];
$_timeout = isset($data['timeout']) ? intval($data['timeout']) : 3;
$this->request->refresh($_uri, $_timeout);
}
unset($data['view'], $data['timeout']);
// pass rest data to the view
foreach ($data as $var => $value) {
$content->set($var, $params ? strtr($value, $params) : $value);
}
$this->template->set('content', $content);
} else {
$this->request->redirect('index');
}
}
}