четверг, 1 мая 2008 г.

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;
}
public 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;
}
}
?>

Комментариев нет: