Flash сообщения

Часто бродя по сайтам и заполняя формы встречаю некоторые типичные недоработки при обработке форм.
Например, после обработки забывают сделать редирект, в итоге при нажатии «Обновить», данные посылаются повторно, что очень неприятно.
Поэтому, не забываем

header('Location: ' . $url);

Теперь появляется новая проблема — как сообщить о результатах обработки. Для этого воспользуемся так называемыми flash сообщениями.

Я приведу один из вариантов.

В начале сценария мы создаём объект $flash, при этом данные из $_SESSION[‘flash’] копируем в закрытую переменную класса и очищаем $_SESSION[‘flash’].

С помощью магических методо мы работаем с флэш данными:

1. __set() используем для занесения переменной в сессию.

2. __get() для извлечения флэш данных.

3. __isset() для проверки на сущестование данных.

<?php
error_reporting(E_ALL);
$flash = Amdy_Flash::Singleton();
if (isset( $flash->test ) ) echo 'true - ' , $flash->test;
else echo 'false';
$flash->test = 'ok';
class Amdy_Flash {
    public static $instance;
    protected $_data = array();
    /**
    * @return Amdy_Flash $instance
    */
    public static function Singleton() {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c();
        }
        return self::$instance;
    }
    private function __construct() {
        if (!session_id()) session_start();
        if ( isset($_SESSION['flash']) ) {
            $this->_data = $_SESSION['flash'];
            unset($_SESSION['flash']);
        }
    }
    public function __set($varName, $varValue) {
        $_SESSION['flash'][$varName] = $varValue;
    }
    public function __get($varName) {
        return (isset($this->_data[$varName]) ? $this->_data[$varName] : null);
    }
    public function __isset($varName) {
        if (isset($this->_data[$varName])) return true;
        else return false;
    }
}
?>

В следующем очерке сделаю всё на статических методах и изменю алгоритм.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *