Банк данных ПРОДУКЦИЯ РОССИИ

Собственный движок портала

Озниев Н.К. ктн

Дата публикации: 08.01.2018 г.

Введение

Суть такого заголовка не в том, что движок портала Банка данных ПРОДУКЦИЯ РОССИИ (БДПР) – вообще уникальное явление. Просто это движок, который разработан именно для данной веб-разработки, он не взят из какой-либо системы разработки типа WordPrees, Yii или еще какой. Т.е. это собственная разработка

Движок – это набор серверных скриптов, логически увязанных между собой для обеспечения решения комплекса задач БДПР, в том числе обеспечивающий необходимое удобство для расширения функционала портала и его модификации в процессе жизнедеятельности. В целом структура ПО, функциональная схема которого приведена на нижеследующем рисунке, напоминает известный шаблон проектирования MVC (model-view-controller), но эта схожесть весьма условная. Автор это сходство отметил для себя спустя много времени после начала разработки. В данном случае существует не одна, а две точки входа на веб-сервер. Первая из этих точек входа (через индексный файл index.php) реализует открытие соответствующей веб-страницы. Вторая точка входа (через файл обработки специальных вызовов functions.php) реализует доступ к внутренним функциям веб-сервера через специальный менеджер обработки (класс Manager) в модуле class.manager.php, который управляет дальнейшим распределением запросов внутри системы. У менеджера обработки есть доступ ко всему внутреннему функционалу веб-сервера.

В целом ПО веб-сервера реализовано на PHP с использованием объектно-ориентированного подхода, исключением из которого являются скрипты index.php и functions.php.

Структура программного обеспечения БДПР

Набор веб-страниц реализуется через набор шаблонов, которыми управляет специальный класс Template модуля class.template.php. Непосредственное отображение веб-страниц сосредоточено в соответствующем скрипте php (из набора классов контроллеров Class_controls) данного модуля. Таким образом, в реализации веб-страницы участвует тройка: шаблон веб-страницы, модуль отображения (контроллер), содержащий управляющий скрипт php, и класс Template.

Когда нужна сложная логика обработки, требующая обращения к базе данных MySQL, задействуется система классов, реализующая требуемую бизнес-логику (функции веб-сервера Class_funcs), но при этом непосредственный доступ к серверу баз данных имеет только один фиксированный класс Database, который реализован как шаблон singleton, т.е. для каждого пользователя веб-сервер предоставляет только одно соединение с сервером MySQL, через которое реализуется весь обмен с браузером пользователя.

Любой класс, обеспечивающий реализацию бизнес-логики, является наследником базового класса GlobalClass. Соответственно, любой класс, обеспечивающий управление веб-страницей, является наследником базового класса Modules.

Все основные параметры веб-страниц, включая параметры соединения с сервером MySQL, находятся в классе Config, реализованном в модуле class.config.php.

Кроме того, ПО веб-сервера содержит набор служебных объектов, обеспечивающих функционирование портала, таких как объекты контроля данных, почтовых отправлений и т.д.

Модуль index.php

В модуле index.php реализуется вызов любой веб-страницы портала. Типовой вызов выглядит как <веб-сервер>/<имя веб-страницы>. При этом сначала формируется имя контроллера веб-страницы из имени затребованной веб-страницы, и для показа веб-страницы вызывается объект контроллера, который полностью управляет вызваемой веб-страницей.

При этом приняты следующие соглашения:

1.                     Контроллер веб-страницы должен иметь стандартизованное название <Имя-страницы>_PageControl.

2.                     Файл php, в котором описан объект контроллера веб-страницы, должен иметь имя <Имя веб-страницы>_control.php.

Если эти условия не будут выполнены, то не будет найден контроллер веб-страницы, и вызов будет перенаправлен на стандартную веб-страницу notFound

Если все правильно, то будет создан объект контроллера и управление передается в него.

Модуль functions.php

В данном модуле обрабатываются все функциональные вызовы, поступающие отовсюду изнутри системы веб-портала через вызовы HTTP POST и GET. Т.к. модуль functions.php не имеет прямого доступа к внутренним функциям портала, он их передает через класс Manager, у которого такой доступ есть. Тем самым реализуется своего рода подсистема управления порталом. Класс Manager, вообще говоря, тоже внутренний объект портала, но доступ к нему из модуля functions.php обеспечивается вызовом PHP

require_once "manager_class.php".

Работа скрипта functions.php и начинается с создания объекта класса Manager.

Затем идет разбор структуры $_REQUEST на предмет наличия в нем параметра func, в котором должно содержаться имя вызываемой функции. Если функция не задана, то проверяется, задана ли вообще структура $_POST. Если она задана, то данные из нее передаются объекту класса Manager и на этом работа скрипта завершается. Если же задано имя функции, то идет разбор имени и параметров в структуре $_REQUEST, а затем управление также передается в объект класса Manager с этими параметрами.

Далее имеется два варианта действий.

Если нет необходимости обрабатывать полученный результат, то работа скрипта functions.php завершается.

Если же нужно дождаться результата, то functions.php его получает от объекта Manager. Если операция прошла успешно, то пользователю отправляется веб-страница, оповещающая об успехе. Если результат неуспешный, то делается одно из двух действий: возврат на страницу вызова через параметр $_SERVER[‘HTTP_REFERER’], или же на главную страницу, если такового параметра не оказалось (адрес страницы вызова по какой-то причине отсутствует).

Типовой контроллер веб-страницы

Вообще говоря, все контроллеры портала являются типовыми. Но в ряде случаев применяются ухищрения, чтобы добиться нестандартного поведения, которые в данной статье не рассматриваются, т.к. они, как правило, являются следствием не совсем удачного решения и потом постепенно изживаются.

Любой контроллер портала – наследник абстрактного класса Modules, который в свою очередь является наследником абстрактного класса AbstractModules. Так сделано для улучшения безопасности и удобства: класс AbstractModules имеет доступ ко всем модулям портала, в нем создаются первоначально все необходимые объекты, которые класс Modules использует в своей работе. В AbstractModules формируется, в том числе, шаблон вызываемой веб-страницы, и объявляется абстрактная функция формирования контента веб-страницы:

abstract protected function getContent();

Класс Modules в своем конструкторе устанавливает в качестве обработчика вызовов HTTP модуль functions.php в любом шаблоне веб-страницы. При этом не в каждом шаблоне такой обработчик предусматривается.

Затем в этом же конструкторе объект Modules создает все необходимые ссылки для вызова шаблонов веб-страниц.

В классе Modules объявлены два метода: setInfologin($topmenu_id) и setTopMenu($user).

Метод setInfologin($topmenu_id) формирует Главное меню портала, в том числе, анализируя вход пользователя в систему, и должным образом показывая ссылки Вход Регистрация или Профисль Выход. Если в системе Гость, то показывается первая пара ссылок, а если в системе пользователь, который залогинился – вторая пара. Однако, если залогинившийся пользователь не имеет ролей, то ссылка Профиль не показывается. Метод setInfologin защищенный (protected), и его реализация продолжается в конкретном котроллере.

Итак, после всех этих предварительных операций в классах AbstractModules и Modules, контроллер продолжает операции вызова веб-страницы.

Рассмотрим подробнее работу контроллера на примере вызова страницы Информация.

Код контроллера для данной страницы, согласно принятым соглашениям имеет вид:

<?php

    require_once "class.Modules.php";

 

    class Sprav_PageControl extends Modules {

        public function __construct() {

             parent::__construct();

             $this->template->display("sprav");

        }

 

        protected $title = "Продукция России";

        protected $meta_desc = "Продукция России, Россия,

Импортозамещение, ЦСМ, АРМ, Банк данных ПРОДУКЦИЯ РОССИИ";

        protected $meta_key = "Продукция России, Россия, Импортозамещение,

ЦСМ, АРМ, Банк данных ПРОДУКЦИЯ РОССИИ";

       

        public function getContent() {

             $top_id = 4; // Информация

             $this->setInfologin($top_id);

            

             $username = $this->user->username;

             $permcodes = $this->user->permcodes;

             $this->template->set("address", $this->config->address);

            

             $stat_array = $this->clplist->getCLPDayList_Stat();

             $this->template->set("stat_array", $stat_array);

 

             $this->template->set("setItem", "sprav");

 

             return "sprav";

        }

    }

?>

Это – один из простейших контроллеров. В его конструкторе задано имя шаблона с именем sprav, который расположен в модуле sprav.tpl,  затем вызывается унаследованный из класса Modules метод getContent() без параметров.

В этом методе реализуются следующие действия:

- задается индекс главного меню строкой кода

$top_id = 4;

- вызывается метод setInfologin с параметром $top_id,

- определяется имя пользователя и формируется список разрешений в его ролях в строке $permcodes. В данном случае веб-страница публичная, и в контроллере никаких проверок разрешений пользователя не производится,

- в шаблон веб-страницы (можно говорить, на веб-страницу) передается адрес веб-сервера в строке кода:

this->template->set("address", $this->config->address);

- затем идут две строки, формирующие массив $stat_array, в который передается статистика поступлений КЛП за последние 30 суток из класса ClpList. Эту работу выполняет метод  

$this->clplist->getCLPDayList_Stat();

- массив $stat_array также передается в шаблон (на веб-страницу),

- далее идет установка специального параметра setItem на веб-странице sprav. Это означает, что будет вызваться чистая страница Информация. В иных случаях, когда идет вызов веб-страниц по подменю на данной странице, то в этот параметр передаются имена шаблонов соответствующих веб-страниц. Все дело в том, что каждая страница, вызываемая через главное меню, на деле является контейнером для других страниц, которые в этом контейнере показываются пользователю,

- наконец, строка

return "sprav";

завершает формирование страницы.

Контроллер веб-страницы Информация завершил свою работу. При любом обновлении этой страницы через обновление браузера будет повторять все описанные действия.

Дальнейшая судьба веб-страницы Информация полностью зависит от того, как устроен шаблон веб-страницы, - вся необходимая для него информация контроллером сформирована и передана. Напомним, что при этом контроллер обратился к серверу баз данных MySQL и сформировал статистику поступлений КЛП за последние 30 дней.

Шаблон веб-страницы Информация

Шаблон этот находится в модуле sprav.tpl. Это по сути html-страница с управляющими элементами, предназначенными для получения необходимых данных от своего контроллера:

<?php include "head_of_page.tpl" ?>

 

<body

     onload="allClose(); datetime();

          var stat = document.getElementById('clp_daystat');

          if (stat) {

              clp_dayStat('<?=$this->address?>', 30, stat);

          }

     "

> 

     <?php include "mailcounter2.tpl" ?>

 

     <div id="body_container">

          <?php include "header.tpl" ?>

 

          <?php include "top_menu.tpl" ?>

             

          <div id="container">

              <div id="left">

                   <div id="block_menu">

                        <ul id="ul1"><?=$this->top_menu?> </ul>

                   </div>

              </div>   

             

              <div id="right">            

                   <?php

                        if (!($this->name_sprav === ""))

                             $includ = $this->name_sprav;

                        else

                             $includ = "sprav_none.tpl";

                        include $includ;                     

                   ?>

              </div>

             

              <div class="clear"></div>

          </div>   

         

          <?php include "bottom.tpl" ?>

     </div>

</body>

</html>

Рассмотрим его устройство подробнее, т.к. по такому же принципу построены все шаблоны основных веб-страниц, вызываемых из главного меню портала.