예제 #1
0
 /**
  * Предварительная обработка страницы - самое время выполнить сабмит формы, редирект и остальные подобные вещи
  */
 private final function postProcess()
 {
     //Проверим и сменим состояние
     $this->changeState(self::STATE_STARTED, self::STATE_FINISHED);
     //Устанавливаем контекст
     $BUILDER_CTXT = PageBuilderContext::getInstance();
     //Проверим, что наш контекст не был сброшен
     check_condition(__CLASS__ == $BUILDER_CTXT->getContextIdent(), 'Unexpected ' . get_class($BUILDER_CTXT) . ': ' . $BUILDER_CTXT->getContextIdent());
     //Получим параметры страницы
     $pagePrams = new PageParams($BUILDER_CTXT->finalizeTplContent(null));
     //Сброим контекст, он нам больше не нужен
     $BUILDER_CTXT->dropContext();
     try {
         //Вызываем завершающую обработку страницы
         $result = $this->postProcessImpl($pagePrams, RequestArrayAdapter::inst());
         //Останавливаем профайлер
         $sec = $this->PROFILER->stop();
         //Отлогируем
         $this->LOGGER->info('Page build done in {} sec', $sec->getTime());
         //Вернём
         return $result;
         //---
     } catch (Exception $ex) {
         $this->PROFILER->stop(false);
         throw $ex;
     }
 }
예제 #2
0
 public final function includePanel($panelName)
 {
     if (array_key_exists($panelName, $this->includedPanels)) {
         return $this->includedPanels[$panelName];
     }
     check_condition($this instanceof PanelFolding, "Фолдинг {$this} не может работать с панелями");
     check_condition(in_array($panelName, PsUtil::getClassConsts($this, 'PANEL_')), "Панель [{$panelName}] не может быть предоставлена фолдингом {$this}");
     //Сразу отметим, что панель была запрошена, так как может возникнуть ошибка
     $this->includedPanels[$panelName] = '';
     /*
      * Уникальный код панели - тот самый, через который потом можно будет 
      * достучаться до параметров панели из javascript.
      */
     $panelUnique = $this->getUnique($panelName);
     //Стартуем профайлер
     $this->profilerStart(__FUNCTION__ . "({$panelName})");
     /** @var PluggablePanel */
     $panel = $this->buildPanel($panelName);
     //Мог вернуться и null, тогда ничего не подключаем
     if ($panel == null) {
         //Останавливаем профайлер без сохранения
         $this->profilerStop(false);
         return '';
     }
     //Останавливаем профайлер
     $this->profilerStop();
     check_condition($panel instanceof PluggablePanel, "Возвращена некорректная панель {$panelUnique}. Ожидался обект типа PluggablePanel, получен: " . PsUtil::getClassName($panel));
     //Html content
     $this->includedPanels[$panelName] = trim($panel->getHtml());
     //Js params
     $jsParams = $panel->getJsParams();
     if (!isTotallyEmpty($jsParams)) {
         PageBuilderContext::getInstance()->setJsParamsGroup(PsConstJs::PAGE_JS_GROUP_PANELS, $panelUnique, $jsParams);
     }
     //Smarty resources params
     $smartyParams4Resources = $panel->getSmartyParams4Resources();
     if (is_array($smartyParams4Resources) && !empty($smartyParams4Resources)) {
         PageBuilderContext::getInstance()->setSmartyParams4Resources($smartyParams4Resources);
     }
     return $this->includedPanels[$panelName];
 }
예제 #3
0
 protected function getFoldedContext()
 {
     return PageBuilderContext::getInstance();
 }
예제 #4
0
 public final function buildPage(array $buildParams = array())
 {
     header('Content-Type: text/html; charset=utf-8');
     ExceptionHandler::registerPretty();
     //Запросим адаптер, чтобы сбросить параметры в сессии
     UnloadArrayAdapter::inst();
     // Подготовим необходимые классы
     $CTXT = PageContext::inst();
     $PAGE = $CTXT->getPage();
     $BUILDER = $this->getPageBuilder($CTXT->getPageType());
     $PROFILER = $BUILDER->getProfiler();
     $RESOURCES = null;
     $TITLE = null;
     $CONTENT = null;
     if ($PROFILER) {
         // Начинаем профилирование
         $PROFILER->start($CTXT->getRequestUrl());
     }
     try {
         //Подготовим объекты, которые будем передавать построителю страницы
         $RQ_PARAMS = RequestArrayAdapter::inst();
         $BUILD_PARAMS = ArrayAdapter::inst($buildParams);
         $BUILDER_CTXT = PageBuilderContext::getInstance();
         //Стартуем контекст
         $BUILDER_CTXT->setContextWithFoldedEntity($BUILDER->getFoldedEntity());
         //Вызываем предварительную обработку страницы
         $BUILDER->preProcessPage($CTXT, $RQ_PARAMS, $BUILD_PARAMS);
         // Оповещаем слушателей
         /* @var $listener PagePreloadListener */
         foreach (Handlers::getInstance()->getPagePreloadListeners() as $listener) {
             $listener->onPagePreload($PAGE);
         }
         //Билдер строит страницу, наполняя контекст. Нам от него нужны будут только данные из контекста
         $PARAMS = $BUILDER->buildPage($CTXT, $BUILDER_CTXT, $RQ_PARAMS, $BUILD_PARAMS);
         //Остановим контекст
         $BUILDER_CTXT->dropContext();
         //Загрузим параметры
         $TITLE = $PARAMS->getTitle();
         $CONTENT = $PARAMS->getContent();
         // Подключаем все необходимые ресурсы
         $RESOURCES = $this->buildResources($PARAMS, $CTXT);
         //Проведём финализацию страницы, чтобы различные менеджеры могли добавить к ней свои данные
         $CONTENT = PageFinaliserFoldings::finalize($this->LOGGER, $CONTENT);
     } catch (Exception $ex) {
         $TITLE = trim($TITLE) . ' (произошла ошибка)';
         $CONTENT = ExceptionHandler::getHtml($ex);
     }
     //Непосредственное построение страницы.
     $PAGE_PARAMS['RESOURCES'] = $RESOURCES;
     $PAGE_PARAMS['TITLE'] = $TITLE;
     $PAGE_PARAMS['CONTENT'] = $CONTENT;
     //ПОДСТАВЛЯЕМ ВСЕ ПАРАМЕТРЫ СТРАНИЦЫ В БАЗОВЫЙ ШАБЛОН
     $PAGE_CONTENT = PSSmarty::template('page/page_pattern.tpl', $PAGE_PARAMS)->fetch();
     $this->LOGGER->infoBox('HTML PAGE', $PAGE_CONTENT);
     //ФИНАЛИЗАЦИЯ СТРАНИЦЫ - ВЫЧИСЛИМ РЕСУРСЫ, КОТОРЫЕ НУЖНО ОТКЛЮЧИТЬ
     $PAGE_CONTENT = PageFinaliserRegExp::finalize($this->LOGGER, $PAGE_CONTENT);
     //НОРМАЛИЗАЦИЯ СТРАНИЦЫ - УДАЛИМ ДВОЙНЫЕ ПРОБЕЛЫ И ПЕРЕНОСЫ
     if (PsDefines::isNormalizePage()) {
         $PAGE_CONTENT = PageNormalizer::finalize($this->LOGGER, $PAGE_CONTENT);
     }
     //ВСТАВИМ ASIS ПАРАМЕТРЫ, ТАК КАК БОЛЕЕ SMARTY ФИЛЬТРЫ ВЫЗЫВАТЬСЯ НЕ БУДУТ
     $PAGE_CONTENT = $this->replaceAsIsValues($PAGE_CONTENT);
     $this->LOGGER->infoBox('PAGE WITH ASIS REPLACED', $PAGE_CONTENT);
     //BOOOM :)
     echo $PAGE_CONTENT;
     if ($PROFILER) {
         // Заканчиваем профилирование
         $PROFILER->stop();
         PageOpenWatcher::updateUserPageWatch($CTXT->getRequestUrl());
     }
 }