2015-11-30 3 views

ответ

1

Хорошо. Вы можете использовать функцию Session::get_once(). Но это позволит вам только один раз получить переменную, и вы не сможете использовать ее снова в том же запросе. Пока вы хотите, чтобы флэш-сообщение сохраняло полный цикл запросов. Чтобы справиться с этим, вам понадобится класс-оболочка, что-то вроде этого.


class Flash { 
    private $session; 
    private $messages = array(); 

    private static $_instance; // Singleton object 

    public static function instance() { 
     if (! isset(self::$_instance)) { 
      self::$_instance = new Flash(); 
     } 

     return self::$_instance; 
    } 

    private function __construct() { 
     $this->session = Session::instance(); 
     $this->messages['current'] = $this->session->get_once('flash'); 
     if(! is_array($this->messages['current'])) { 
      $this->messages['current'] = array(); 
     } 
    } 

    public function add($key, $message === null) { 
     if (is_null($message)) { 
      $message = $key; 
      $key = null; 
     } 
     $this->messages['new'][$key] = $message; 
     $this->session->set('flash', $this->messages['new']); 
     return true; 
    } 

    public function get($item = null) { 
     if($item === null) { 
      return $this->messages['current']; 
     } 
     if(! array_key_exists($item, $this->messages['current'])) { 
      return null; 
     } 
     return $this->messages['current'][$item]; 
    } 

} 

Использование:

 
$flash = Flash::instance(); 

$flash->add('A random message'); 
$flash->add('some_key', 'Some message'); 

$flash->get(); // array(0 => 'A random message', 'some_key' => 'Some message') 
$flash->get('some_key'); // 'A Random message' 

Что это делает в основном на этапе инициализации извлекает текущее сообщение из сеанса, используя функцию get_once(). Эта переменная не входит в объект Session, поэтому она будет продолжать этот запрос. Каждый раз, когда вы добавляете переменную, она сразу же сохраняется для объекта Session.

Есть только одна проблема; если вы используете вызовы ajax, сообщения будут доступны только в исходном запросе php, а не при последующих вызовах ajax. И нет никаких ограничений на то, какую переменную вы храните (но это must be serializable). Для этого вам также придется создавать некоторые проверки.

предупреждение: класс не тестируется, так что удивило бы меня, если вы не получите синтаксическую ошибку;)

И пойти на шаг дальше: вам потребуется дополнительное обновление в любом случае. Поток запроса должен быть таким: imo:

Запрос 1: Пользователь с информацией о компании Запрос 2: Пользователь отправляет обработанную форму. Данные вставляются в базу данных. Когда это будет сделано, пользователь будет перенаправлен . Запрос 3: отображается страница подтверждения (может быть «спасибо» или страница подробностей, что угодно).

Вы должны установить флеш-сообщение в запросе 2 и показать его в 3. Я бы не стал показывать страницу благодарности по запросу 2, потому что когда пользователь обновится, форма будет вывешена снова.

Смежные вопросы