Flash сообщения 2

Как и обещал, вернулся к flash сообщениям. Переделаем его на статические методы. Итак, немножко теории.
Статические методы могут вызываться без создания экземпляра класса (объекта), при объявлении метода указывается ключевое слово static. Точно так же объявляется и статический атрибут класса.

class Foo {
    static public $atr;
    static public function test() {}
}

Т.к. статические атрибуты не связаны с экземпляром, то и вызов их осуществляется не через $this->atr, а через self::$atr, обращаю внимания на двойное двоеточие и баксик. Есть ещё одна печальная особенность, сильно ограничивающая маневры – при расширении (extends) класса статический атрибут остаётся связанным и с родителем, поэтому ждём PHP 5.2.6, где появится возможность вызывать через static::$atrатрибут определённого этого класса.

Заведём константы для разных типов сообщений
const INFO = 1;
const NOTICE = 2;
const WARNING = 3;
И статические переменные
static protected $_name = ‘flash’;
static protected $_nameMessage = ‘message’;
Первая служит ключом массива для flash сообщений, а второй для подвида — message, который имеет три вышеуказаных типа: информация, предупреждение и критическая ошибка.

Ну и описываем три основных метода

    static public function get($index, $keep = false) {
        if ( self::isExists($index) ) {
            $retVal = $_SESSION[ self::$_name ][ $index ];
            if (!$keep) {
                unset($_SESSION[ self::$_name ][ $index ]);
            }
            return $retVal;
        }
    }
    static function set($index, $value) {
        $_SESSION[ self::$_name ][ $index ] = $value;
    }
    static function isExists($index) {
        return isset($_SESSION[ self::$_name ][ $index ]);
    }

Первый — get, он принимает индекс и второй переменной может идти значение $keep, которая позволяет не удалять переменную после запроса. Ну а внутри проверяем есть ли что, берем и чистим если нужно.

Вот весь класс

<?php
class Amdy_Flash {
    static protected $_name = 'flash';
    static protected $_nameMessage = 'message';
    const INFO = 1;
    const NOTICE = 2;
    const WARNING = 3;
    static public function get($index, $keep = false) {
        if ( self::isExists($index) ) {
            $retVal = $_SESSION[ self::$_name ][ $index ];
            if (!$keep) {
                unset($_SESSION[ self::$_name ][ $index ]);
            }
            return $retVal;
        }
    }
    static function set($index, $value) {
        $_SESSION[ self::$_name ][ $index ] = $value;
    }
    static function isExists($index) {
        return isset($_SESSION[ self::$_name ][ $index ]);
    }
    static function setMessage($text, $type) {
        self::set(
            self::$_nameMessage,
            array(
                'text' => $text,
                'type' => $type
            )
        );
    }
    static public function getMessage($keep = false) {
        return self::get( self::$_nameMessage, $keep );
    }
    static public function getMessageText($keep = false) {
        if ( self::isExists( self::$_nameMessage ) ) {
            $message = self::getMessage($keep);
            return $message['text'];
        }
    }
    static public function getMessageType($keep = true) {
        if ( self::isExists( self::$_nameMessage ) ) {
            $message = self::getMessage($keep);
            return $message['type'];
        }
    }
    static public function setInfo($text) {
        self::setMessage($text, self::INFO );
    }
    static public function setNotice($text) {
        self::setMessage($text, self::NOTICE );
    }
    static public function setWarning($text) {
        self::setMessage($text, self::WARNING );
    }
}
?>

Теперь его можно смело добавить в хелперы к форме, в другой статье напишу как.

Используем так

var_dump( Amdy_Flash::get('var') );
Amdy_Flash::set('var', 'value');
var_dump( Amdy_Flash::getMessageText() );
Amdy_Flash::setInfo('test');

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

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