Класс страниц

Тема в разделе "Базовые решения", создана пользователем Gisma, 15 янв 2007.

Статус темы:
Закрыта.
  1. Gisma

    Gisma Гость

    Предназначен для создания классов страниц. Активно используется для создания модульных страниц. В последствии, модульные страницы через наследование дорабатываются до конкретного проекта и переносятся на вывод.

    Кроме стандартного функционал, в основу разработки класса положены идеи паттерна проектирования Facade. Он отлично подходит для расширения функционала страниц.

    Немножко теории. Замечена склонность людей описывать в одном скрипте несколько реакций на переменные из GET/POST или других объектов внешной среды. Соотв. в зависимости от разных параметров скрипт выдает/осуществялет разные данные/действия. Все хорошо, если таких вариантов развития событий два или три, но картина заметно усложняется как только таких реакций становится целое множество :). Все становится просто адски сложно если такую старницу нужно постоянно дорабатывать.

    Эту проблему можно решить с помощью ввода класса страницы, пусть методы этого класса будут реакциями на внешние события, так проще если реакций несколько. И пусть на одно и тоже событие можно подключить несколько методов класса (Facade).

    полная документация здесь:
    http://help.smartdesign.by/part/method.php?id=35
    сам класс:
    Код (Text):
    <?
    //************************************************************//
    //                                                          //
    //               Базовый класс Страницы                 //
    //    Copyright (c) 2006 ООО SmartDesign              //
    //            отдел/сектор                                //
    //    Email: gis2002@inbox.ru                            //
    //                                                          //
    // Разработчик: Gisma (13.01.2007)                         //
    // Модифицирован: 27.06.2006 by Gisma                   //
    //                                                          //
    //************************************************************//
    class CPage {
    /**
    *  @var array Массив хранит все существющие схемы обработок для POST
    */
    var $aPostSchema = array();
    /**
    *  @var array Массив, хранящий существующие схемы обработок для GET
    */
    var $aGetSchema = array();
    /**
    *  @var array Массив, хранящий имена финишных функций для _POST
    */
    var $aPostFinish = array();
    /**
    *  @var array Массив, хранящий имена финишных функций для _GET
    */
    var $aGetFinish = array();
    /**
    *  @var array Массив, хранящий имена функции для каждого сценария
    */
    var $aFunction = array();
    /**
    *  @var string Строка хранящая имя функции по умолчанию
    */
    var $szDefault = '';
    function CPage() {
    // устанавливаем дефолтовую переменную
    $this->szDefault = 'main';
    }
    /**
    *  @desc Дефолтовая функция куда передается управления страницой
    *  @return
    */
    function main() {
    }
    /**
    *  @desc Добавляет новый обработчик _GET
    *  @return
    */
    function addPost($name,$action) {
    // сначала, мы должны получить схему (если ее нет, она будет создана)
    $nResult = $this->findSchema($name,true);
    // проверяем есть ли такая уже функция, т.к. обработчики не должны повторяться
    $nFound = array_search($action,$this->aFunction[$nResult]);
    if ($nFound === false ) {
    // нет не существует ничего не делаем
    // проверяем нет ли функции а массиве финишных функция
    if ($this->aPostFinish[$nResult] != $action) {
    // нет, нету
    } else {
    // да, есть
    // удаляем из финишных функцию
    $this->aPostFinish[$nResult] = '';
    }
    // добавляем функцию
    $this->aFunction[$nResult][] = $action;
    }
    }
    /**
    *  @desc Добавляет новый обработчик _POST
    *  @return
    */
    function addGet($name,$action) {
    // сначала, мы должны получить схему (если ее нет, она будет создана)
    $nResult = $this->findSchema($name,false);
    // проверяем есть ли такая уже функция, т.к. обработчики не должны повторяться

    $nFound = array_search($action,$this->aFunction[$nResult]);
    if ($nFound === false ) {
    // нет не существует ничего не делаем
    // проверяем нет ли функции а массиве финишных функция

    if ($this->aGetFinish[$nResult] != $action) {
    // нет, нету
    } else {
    // да, есть
    // удаляем из финишных функцию
    $this->aGetFinish[$nResult] = '';
    }
    // добавляем функцию
    if (!isset($this->aFunction[$nResult])) {
    $this->aFunction[$nResult] = array();
    }
    $this->aFunction[$nResult][] = $action;


    }
    }
    /**
    *  @var Добавляет финишную функции в POST схемы
    */
    function addPostFinish($name,$action) {
    // сначала, мы должны получить схему (если ее нет, она будет создана)
    $nResult = $this->findSchema($name,true);
    // проверяем есть ли такая уже функция в массиве функций
    $nFound = array_search($action,$this->aFunction[$nResult]);
    if ($nFound !== false) {
    // удаляем функцию
    unset($this->aFunction[$nResult][$nFound]);
    }
    $this->aPostFinish[$nResult] = $action;
    }
    function addGetFinish($name,$action) {

    // сначала, мы должны получить схему (если ее нет, она будет создана)
    $nResult = $this->findSchema($name,false);

    // проверяем есть ли такая уже функция в массиве функций
    $nFound = array_search($action,$this->aFunction[$nResult]);
    if ($nFound !== false) {
    // удаляем функцию
    unset($this->aFunction[$nResult][$nFound]);
    }
    $this->aGetFinish[$nResult] = $action;
    }
    function setDefault($name) {
    $this->szDefault = $name;
    }
    function process() {
    $szMethod = $_SERVER['REQUEST_METHOD'];
    if ( $szMethod == 'GET')
    $this->callProcs(false);
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    $this->callProcs(true);
    }
    /**
    *  @desc Выставляет 403:)
    */
    function error403() {
    //global $trace;
    //$trace->makeDebug();
    //$Application->destroy();
    header ("HTTP/1.0 403 Forbidden"); die;
    }
    /**
    *  @desc Выставляет 404:)
    */
    function error404() {
    //global $trace,$Application;
    //$trace->makeDebug();
    //$Application->destroy();
    header("HTTP/1.0 404 Not Found");
    die;
    }
    /**
    *  @desc Выполняет редирект на указанный url
    */
    function jump($url = '') {
    global $Application;
    if (empty($url)) {
    die('Page:jump Url empty');
    }
    //global $trace;
    //$trace->makeDebug();
    //$Application->destroy();
    header('Location: '.$url);
    die();
    }
    /**
    *  @desc Ищет указанную схему, если ее нет, то создает заново
    *  @return
    */
    function findSchema($name,$is_post = false) {
    if ($is_post) {
    $aData = &$this->aPostSchema;
    } else {
    $aData = &$this->aGetSchema;
    }
    // разрезаем схему по запятой
    $aSchema = explode(',',$name);
    // перебираем все существующие схемы
    foreach ($aData as $key=>$value) {
    // ищем совпадает ли схема с существующей
    if (sizeof($aSchema) == sizeof($value)) {
    // вычисляем разницу между схемами
    $aDiff = array_diff($aSchema,$value);
    if (sizeof($aDiff) == 0) {
    // значит схема совпадает и найдена
    // возвращает результат
    return $key;
    }
    }
    }
    // если мы дошли до этой точки, значит схема до сих пор не найдена

    $this->aFunction[] = array();
    $nResult = sizeof($this->aFunction) - 1;
    $this->aGetFinish[$nResult] = '';
    $this->aPostFinish[$nResult] = '';
    $aData[$nResult] = $aSchema;
    return $nResult;
    }
    /**
    *  @var Вызываем обработчики для
    */
    function callProcs($is_post = false) {
    // определяем массивы данных
    if ($is_post) {
    $aData = $_POST;
    $aSchema = $this->aPostSchema;
    $aFinish = $this->aPostFinish;
    } else {
    $aData = $_GET;
    $aSchema = $this->aGetSchema;
    $aFinish = $this->aGetFinish;
    }

    // определяем активную схему
    $nSchema = -1;
    foreach ($aSchema as $key => $value) {
    // перебираем все параметры
    $bFlag = true;
    foreach ($value as $szParam) {
    if (!isset($aData[$szParam])) {
    $bFlag = false;
    break;
    }
    }

    if ($bFlag) {
    $nSchema = $key;
    break;
    }
    }

    // для активной схемы
    if ($nSchema >= 0) {
    // собираем аргументы по схеме
    $aArgument = array();
    foreach ($aSchema[$nSchema] as $key=>$value) {
    $aArguments[] =$aData[$value];
    }
    // вызываем все переменные
    foreach ($this->aFunction[$nSchema] as $szFunction) {
    if (is_callable(array(&$this,$szFunction))) {

    call_user_func_array(array(&$this,$szFunction),$aArguments);
    } else {

    die('Method `'.$szFunction.'` doesn`t exists');
    }
    }
    // вызываем финишную функцию
    if (!empty($aFinish[$nSchema]) && is_callable(array($this,$aFinish[$nSchema]))) {
    call_user_func_array(array(&$this,$aFinish[$nSchema]),$aArguments);
    } elseif (!empty($aFinish[$nSchema])) {
    die('Method `'.$aFinish[$nSchema].'` doesn`t exists');
    }

    } else {
    // иначе
    // определеня дефолтовая функцию?

    if (is_callable(array($this,$this->szDefault))) {
    // да
    // вызываем
    call_user_func(array($this,$this->szDefault));

    } else {
    // нет

    }
    }




    }
    }

    /**
    *  @desc
    *  @return
    */
    /*function callProcs($aParam,$aData) {
    global $trace;
    $bFlagFound = false;

    foreach ($aParam as $value=>$name) {
    $tmp = explode(',',$name);
    $bFlag = 1;
    $aParam = array();

    for ($i = 0; $i < sizeof($tmp); $i++)
    if (!isset($aData[$tmp[$i]])) {
    $bFlag = 0;
    break;
    } else {
    $aParam[] = $aData[$tmp[$i]];
    }
    if ($bFlag == 1)
    if (is_callable(array($this,$value))) {
    $trace->addDebug('Page','callProcs: Вызов метода `'.$value.'`');

    call_user_func_array(array(&$this,$value),$aParam);
    $bFlagFound = true;
    } else postError('CPage::process не могу найти функцию :"'.$value.'"');
    }
    if ((false == $bFlagFound) && (is_callable(array($this,$this->szDefault)))) {
    $trace->addDebug('Page','callProcs: Вызов метода `'.$this->szDefault.'`');
    call_user_func(array($this,$this->szDefault));
    }
    }*/
    ?>
     
Загрузка...
Похожие Темы - Класс страниц
  1. swyatogor
    Ответов:
    0
    Просмотров:
    65
  2. Corexis
    Ответов:
    0
    Просмотров:
    68
  3. rrrFer
    Ответов:
    0
    Просмотров:
    130
  4. Sander
    Ответов:
    1
    Просмотров:
    507
  5. Искушенный
    Ответов:
    0
    Просмотров:
    430
Статус темы:
Закрыта.

Поделиться этой страницей