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); }