public function showPage($lang = NULL, $slug = false)
 {
     #dd($lang);
     #$route = Route::current();
     #echo $route->getPath();
     #dd($route);
     #dd($slug);
     if (!$lang) {
         $lang = Config::get('app.locale');
     }
     ## Как будем искать страницы - в кеше или в БД?
     if (Config::get('pages.not_cached')) {
         ## Кеширование отключено (или не найдено ни одной страницы) - ищем в БД
         $page = (new Page())->where('publication', 1)->where('version_of', NULL);
         if ($slug) {
             $page = $page->where('slug', $slug);
         } else {
             $page = $page->where('start_page', 1);
         }
         $page->with(['blocks.meta', 'seo']);
         $page = $page->first();
     } else {
         ## Если страниц нет в кеше - показываем 404
         if (!count(Page::all_by_slug())) {
             App::abort(404);
         }
         ## Кеширование включено - ищем страницу в кеше
         $page = Page::by_slug($slug ?: '/');
     }
     #Helper::smartQueries(1); #die;
     #Helper::tad($page);
     ## Если страница не найдена...
     if (!isset($page) || !is_object($page)) {
         ## ...пробуем в теме найти шаблон с таким же именем, как запрошенный slug...
         if ($slug != '' && !Config::get('pages.disable_slug_to_template') && preg_match("~^[A-Za-z0-9\\-\\_]+?\$~is", $slug) && View::exists(Helper::layout($slug))) {
             $page = new Page();
             return View::make(Helper::layout($slug), compact('slug', 'page'));
         }
         ## ...иначе показываем 404
         App::abort(404);
     }
     ## 301 редирект в том случае, если страница является главной, но ее запросили по slug.
     ## В случае в кешированием такого не должно произойти.
     if ($page->start_page && $slug != '') {
         $redirect = URL::route('mainpage');
         return Redirect::to($redirect, 301);
     }
     ## Если у страницы не задан шаблон - устанавливаем simple-page
     if (!$page->template) {
         $page->template = 'simple-page';
     }
     ## Ищем шаблон
     if (empty($page->template) || !View::exists($this->module['gtpl'] . $page->template) && !View::exists(Helper::layout($page->template))) {
         throw new Exception('Template [' . $this->module['gtpl'] . $page->template . '] not found.');
     }
     $template = NULL;
     if (View::exists($this->module['gtpl'] . $page->template)) {
         $template = $this->module['gtpl'] . $page->template;
     } elseif (View::exists(Helper::layout($page->template))) {
         $template = Helper::layout($page->template);
     }
     ## Экстрактим страницу
     $page->extract(true);
     ## Настройки page_meta
     $page_meta_settings = isset($page->metas) && isset($page->metas[Config::get('app.locale')]) && is_object($page->metas[Config::get('app.locale')]) ? (array) json_decode($page->metas[Config::get('app.locale')]->settings, true) : [];
     $page->page_meta_settings = $page_meta_settings;
     #Helper::tad($page);
     #Helper::dd($page->blocks['pervyy_blok']->meta->content);
     ## Рендерим контент всех блоков - обрабатываем шорткоды
     if (isset($page->blocks) && is_object($page->blocks) && $page->blocks->count()) {
         foreach ($page->blocks as $b => $block) {
             #if (is_object($block) && is_object($block->meta)) {
             if (is_object($block)) {
                 #Helper::dd($block->meta);
                 if ($block->content != '') {
                     #$block->meta->content = self::content_render($meta->content);
                     $page->blocks[$b]->content = self::content_render($block->content);
                 }
             }
         }
     }
     #Helper::tad($page);
     #Helper::ta($template);
     ## Текущий роут - может пригодиться по вьюшке
     $route = Route::current();
     ## Рендерим контент
     $content = View::make($template, compact('page', 'lang', 'page_meta_settings', 'route'))->render();
     ## Проверяем, не возвращена ли JSON-строка с сообщением об ошибке или редиректом
     /*
     ## Пример строки, которая позволяет вернуть из вьюшки ошибку 404:
     echo json_encode(['responseType' => 'error', 'responseCode' => 404]);
     return;
     ## Или ошибку с произвольным кодом, и сообщением (к 404 ошибке нельзя добавить сообщение):
     echo json_encode(['responseType' => 'error', 'responseCode' => 500, 'responseMessage' => 'Unexpected Error']);
     return;
     ## А вот так можно сделать редирект (код по умолчанию - 301):
     echo json_encode(['responseType' => 'redirect', 'redirectUrl' => '/', 'redirectCode' => 301]);
     return;
     */
     $data = is_json($content);
     if ($data) {
         ## Redirect
         if (isset($data['responseType']) && $data['responseType'] == 'redirect' && isset($data['redirectUrl']) && $data['redirectUrl']) {
             $redirect_code = isset($data['responseCode']) && is_numeric($data['responseCode']) ? $data['responseCode'] : 301;
             return Redirect::to($data['redirectUrl'], $redirect_code);
         }
         ## Error
         if (isset($data['responseType']) && $data['responseType'] == 'error' && isset($data['responseCode']) && is_numeric($data['responseCode'])) {
             $responseMessage = isset($data['responseMessage']) ? $data['responseMessage'] : null;
             $headers = [];
             if ($responseMessage) {
                 $headers['ErrorResponseMessage'] = $responseMessage;
             }
             #dd($headers);
             App::abort($data['responseCode'], $responseMessage, $headers);
         }
     }
     return Response::make($content);
 }