Возникал такая проблема. Для разных разделов веб-приложения необходимо было хранить состояния наборов параметров. Далеко ходить не нужно: значения в сессии или куки. Но управление значениями улжнилось тем, что при выходе из раздела состояния должны были терятся.
Ничего особо финтового в примере нет. Просто хелпер из трех функций: одна устанавливает состояние параметра, одна возвращает, одна сбрасывает. Значения храним в сессии.
Основная идея — в том что имя контроллера так же хранится в сессии, и при обращении к состоянию проверяется совпадение имени «последнего» контроллера и «активного». Если совпадают — возвращаем состояние. Если нет — устанавливаем дефолтовые значения состояний и возвращаем дефолтовое.
Такая схема позволяет:
Еще наверное стоит добавить вот что.
Для того чтобы состояния отарабатывали верно, нужно вызов
поместить в конструктор базового для всех контроллеров контроллера.
Это позволит гарантировано при заходе в новый котроллер (а это фактически — выход из старого) сбрасывать все состояния не дефолтовые. Именно то что и требовалось. И любое установленное новое состояние будет хранится в сессии до первого выхода из контроллера.
Ничего особо финтового в примере нет. Просто хелпер из трех функций: одна устанавливает состояние параметра, одна возвращает, одна сбрасывает. Значения храним в сессии.
Основная идея — в том что имя контроллера так же хранится в сессии, и при обращении к состоянию проверяется совпадение имени «последнего» контроллера и «активного». Если совпадают — возвращаем состояние. Если нет — устанавливаем дефолтовые значения состояний и возвращаем дефолтовое.
Такая схема позволяет:
- свести работу с состояниями к статическому контроллеру и не оперирывать живыми переменными
- вынести установку дефолтовых значений всех состояний системы в одно место
- class cnd_Core
- {
- public static function get($cnd_name)
- { //установка значения состояния
- if(Session::instance()->get('cnd_controller') != Router::$controller)
- { //если имеет место переход в новый раздел - устанавливаем дефолтовые состояния
- Session::instance()->set('cnd_controller', Router::$controller);
- switch (Session::instance()->get('cnd_controller'))
- {
- case 'razdel1':
- Session::instance()->set('razdel1_value1', 0);
- Session::instance()->set('razdel1_value2', 0);
- break;
- case 'razdel2':
- Session::instance()->set('razdel2_value1', 0);
- Session::instance()->set('razdel2_value2', 0);
- break;
- case 'razdel3':
- Session::instance()->set('razdel3_value1', 0);
- Session::instance()->set('razdel3_value2', 0);
- break;
- }
- }
- //возвращаем значение состояния, дефолтовое, сохраненное или NULL
- $v = Session::instance()->get($cnd_name, NULL);
- return $v;
- }
- public static function set($cnd_name, $cnd_val)
- { //устанавливаем значение состояния
- Session::instance()->set($cnd_name, $cnd_val);
- }
- public static function drop()
- { //сбрасываем все сохраненные состояния к дефолтовым
- Session::instance()->set('cnd_controller',"");
- cnd::get("");
- }
- }
Еще наверное стоит добавить вот что.
Для того чтобы состояния отарабатывали верно, нужно вызов
cnd::get("");
поместить в конструктор базового для всех контроллеров контроллера.
Это позволит гарантировано при заходе в новый котроллер (а это фактически — выход из старого) сбрасывать все состояния не дефолтовые. Именно то что и требовалось. И любое установленное новое состояние будет хранится в сессии до первого выхода из контроллера.