Часто бродя по сайтам и заполняя формы встречаю некоторые типичные недоработки при обработке форм.
Например, после обработки забывают сделать редирект, в итоге при нажатии «Обновить», данные посылаются повторно, что очень неприятно.
Поэтому, не забываем
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; } } ?>
В следующем очерке сделаю всё на статических методах и изменю алгоритм.