/**
  * Функция удаляет резервные копии, превысившие лимит
  *
  * @param int $dicval_id
  * @return bool
  */
 private function delete_backups($dicval_id = 0)
 {
     /**
      * Находим запись словаря для удаления ее бэкапов
      * Запись должна быть оригиналом, т.е. иметь version_of = NULL
      */
     $element = DicVal::where('id', $dicval_id)->with('dic', 'metas', 'allfields', 'seos', 'versions')->first();
     if (!isset($element) || !is_object($element) || $element->version_of != NULL) {
         return false;
     }
     #Helper::tad($element);
     $dic = $element->dic;
     $versions = Config::get('dic/' . $dic->slug . '.versions');
     $element_versions = $element->versions;
     $result = true;
     if (count($element_versions) > 0 && count($element_versions) >= $versions) {
         /**
          * Вычисляем ID записей, подлежащих удалению
          */
         $for_delete = $element_versions->lists('id');
         krsort($for_delete);
         $for_delete = array_slice($for_delete, 0, count($element_versions) - $versions);
         #Helper::dd($for_delete);
         if (count($for_delete)) {
             $result = false;
             /**
              * Открываем транзакцию
              */
             DB::transaction(function () use($element, $for_delete, $result) {
                 /**
                  * Удаляем старые резервные копии и их доп. поля, META и SEO-данные
                  */
                 DicFieldVal::whereIn('dicval_id', $for_delete)->delete();
                 DicValMeta::whereIn('dicval_id', $for_delete)->delete();
                 if (Allow::module('seo')) {
                     Seo::where('module', 'DicVal')->whereIn('unit_id', $for_delete)->delete();
                 }
                 $deleted = DicVal::where('version_of', $element->id)->whereIn('id', $for_delete)->delete();
                 #Helper::d($deleted);
                 #Helper::dd($for_delete);
                 if ($deleted) {
                     $result = true;
                 }
             });
         }
     }
     return $result;
 }
 /**
  * Функция удаляет резервные копии, превысившие лимит
  *
  * @param int $page_id
  *
  * @return bool
  */
 private function delete_backups($page_id = 0)
 {
     /**
      * Находим запись для удаления ее бэкапов
      * Запись должна быть оригиналом, т.е. иметь version_of = NULL
      */
     $element = $this->essence->where('id', $page_id)->with(['metas', 'blocks.metas', 'seos', 'versions'])->first();
     if (!isset($element) || !is_object($element) || $element->version_of != NULL) {
         return FALSE;
     }
     #Helper::tad($element);
     $versions = Config::get('pages.versions');
     $element_versions = $element->versions;
     $result = TRUE;
     if (count($element_versions) > 0 && count($element_versions) >= $versions) {
         /**
          * Вычисляем ID записей, подлежащих удалению
          */
         $for_delete = $element_versions->lists('id');
         krsort($for_delete);
         $for_delete = array_slice($for_delete, 0, count($element_versions) - $versions);
         #Helper::dd($for_delete);
         if (count($for_delete)) {
             $result = FALSE;
             /**
              * Открываем транзакцию
              */
             DB::transaction(function () use($element, $for_delete, $result) {
                 /**
                  * Удаляем старые резервные копии и META данные, блоки (и их META данные) и SEO-данные
                  */
                 $this->pages_meta->whereIn('page_id', $for_delete)->delete();
                 $element_blocks = $this->pages_blocks->whereIn('page_id', $for_delete)->get();
                 if (isset($element_blocks) && count($element_blocks)) {
                     $element_blocks_ids = $element_blocks->lists('id');
                     $element_blocks_metas = $this->pages_blocks_meta->whereIn('block_id', $element_blocks_ids)->delete();
                 }
                 $this->pages_blocks->whereIn('page_id', $for_delete)->delete();
                 if (Allow::module('seo')) {
                     Seo::where('module', 'Page')->whereIn('unit_id', $for_delete)->delete();
                 }
                 $deleted = $this->essence->where('version_of', $element->id)->whereIn('id', $for_delete)->delete();
                 #Helper::d($deleted);
                 #Helper::dd($for_delete);
                 if ($deleted) {
                     $result = TRUE;
                 }
             });
         }
     }
     return $result;
 }
 /**
  * @author Alexander Zelensky
  * @todo Возможно, в будущем здесь нужно будет добавить проверку параметра, использовать ли вообще мультиязычность по сегментам урла, или нет. Например, удобно будет отключить мультиязычность по сегментам при использовании разных доменных имен для каждой языковой версии.
  */
 public static function returnRoutes($prefix = null)
 {
     #Helper::dd(I18nPage::count());
     $class = __CLASS__;
     /**
      * Laravel не дает возможности переписывать пути (роуты), если они были зарегистрированы ранее.
      * А это значит, что если данный модуль активен и в нем создана хоть одна страница, то будет переписан корневой путь: /
      * Это не даст в будущем добавлять роуты от корня с помощью метода Route::controller('', '..@..'), придется все прописывать руками.
      * Надо бы подключать модуль страниц последним
      * [
      *     '/login' => Route object to /login,
      *     '{_missing}' => Fallthrough route object,
      *     '/' => Route object to /,
      * ]
      * Описание данной ситуации здесь:
      * http://stackoverflow.com/questions/20617244/laravel-4-1-controller-method-not-found?rq=1
      * https://github.com/laravel/framework/issues/2848
      * https://github.com/laravel/framework/pull/2850
      * https://github.com/laravel/framework/issues/2863
      * https://github.com/bencorlett/framework/pull/1
      * https://github.com/bencorlett/framework/commit/ac091a25465d070f8925a80b46eb237ef21ea912
      */
     if (!Allow::module(self::$group) || Config::get('site.pages.disabled')) {
         return false;
     }
     Page::preload();
     ##
     ## Add URL modifier for check SEO url of the page (custom UrlGenerator functionality)
     ##
     /*
     URL::add_url_modifier('page', function(&$name, &$parameters) use ($class) {
         #var_dump($class); die;
         #Helper::dd('Page url modifier!');
         #Helper::dd($parameters);
         #return;
         if (
             #is_string($parameters)
             #&&
             count(Config::get('app.locales')) > 1
             && !Config::get('pages.disable_url_modification')
             && Allow::module('seo')
         ) {
             $pages = new $class;
             $right_url = $pages->getRightPageUrl($parameters);
             #Helper::d("Change page URL: " . $parameters . " -> " . $right_url);
             #Helper::dd("Change page URL: " . $parameters . " -> " . $right_url);
             if (@$right_url)
                 $parameters = $right_url;
             #$parameters = '111';
         }
     });
     */
     #/*
     if (count(Config::get('app.locales')) > 1 && !Config::get('pages.disable_url_modification')) {
         ## Mainpage route modifier
         URL::add_url_modifier('mainpage', function (&$name, &$parameters) use($class) {
             #print_r($parameters);
             if (isset($parameters['lang']) && $parameters['lang'] == Config::get('app.default_locale')) {
                 unset($parameters['lang']);
             }
             #print_r($parameters);
         });
     }
     #*/
     ## Будем генерим отдельные роуты для "параметризированных" страниц: у которых в slug есть параметр(ы) (например: {city}/hello)
     ## Как будем искать страницы - в кеше или в БД?
     if (Config::get('pages.not_cached')) {
         ## Кеширование отключено (или не найдено ни одной страницы) - ищем в БД
         #$page = (new Page())->where('publication', 1)->where('version_of', NULL);
         $pages_parametrized = Page::where('parametrized', 1)->get();
     } else {
         $pages_parametrized = new Collection();
         ## Если страниц нет в кеше - показываем 404
         if (null != ($temp = Page::all_by_slug()) && count($temp)) {
             #Helper::tad($temp);
             foreach ($temp as $tmp) {
                 if ($tmp->parametrized) {
                     $pages_parametrized[$tmp->slug] = $tmp;
                 }
             }
         }
     }
     #Helper::tad($pages_parametrized);
     ## Если в конфиге прописано несколько языковых версий - генерим роуты с языковым префиксом
     if (is_array(Config::get('app.locales')) && count(Config::get('app.locales')) > 1) {
         $default_locale_mainpage = Config::get('app.default_locale') == Config::get('app.locale');
         #$locale_sign = Config::get('app.locale');
         ## Генерим роуты для всех языков с префиксом (первый сегмент), который будет указывать на текущую локаль
         Route::group(array('before' => 'i18n_url', 'prefix' => '{lang}'), function () use($class, $default_locale_mainpage, $pages_parametrized) {
             ## Генерим роуты для параметризированных страниц
             if ($pages_parametrized->count()) {
                 foreach ($pages_parametrized as $page) {
                     Route::any($page->slug, array('as' => 'page.' . $page->sysname, 'uses' => $class . '@showPageParametrize'));
                 }
             }
             ## Regular page
             Route::any('/{url}', array('as' => 'page', 'uses' => $class . '@showPage'));
             ## Main page for non-default locale
             #if (!Config::get('pages.disable_mainpage_route') && !$default_locale_mainpage)
             #    Route::any('/', array('as' => 'mainpage', 'uses' => $class.'@showPage'));
             ## Main page for current locale (non-default)
             #Route::any('/', array('as' => 'mainpage_i18n', 'uses' => $class.'@showPage'));
         });
         Route::any('{lang?}', array('as' => 'mainpage', 'uses' => $class . '@showPage'));
         ## Main page for default locale
         #if (!Config::get('pages.disable_mainpage_route') && $default_locale_mainpage)
         #    Route::any('/', array('as' => 'mainpage', 'uses' => $class.'@showPage'));
         ## Main page for default locale
         #Route::any('/', array('as' => 'mainpage_default', 'uses' => $class.'@showPage'));
     } else {
         ## Генерим роуты без языкового префикса
         Route::group(array('before' => 'pages_right_url'), function () use($class, $pages_parametrized) {
             ## Генерим роуты для параметризированных страниц
             if ($pages_parametrized->count()) {
                 foreach ($pages_parametrized as $page) {
                     Route::any($page->slug, array('as' => 'page.' . $page->sysname, 'uses' => $class . '@showPageSingleParametrize'));
                 }
             }
             ## Regular page
             Route::any('{url}', array('as' => 'page', 'uses' => $class . '@showPageSingle'));
             ## Main page
             if (!Config::get('pages.disable_mainpage_route')) {
                 Route::any('/', array('as' => 'mainpage', 'uses' => $class . '@showPageSingle'));
             }
         });
     }
     /*
             #dd(Route::getRoutes());
             $routes = Route::getRoutes();
             foreach($routes as $route) {
                 echo $route->getPath() . "<br/>";
             }
             die;
             #*/
 }
示例#4
0
 public function showFullNews($url = false)
 {
     if (!Allow::module($this->module['group'])) {
         App::abort(404);
     }
     if (!@$url) {
         $url = Input::get('url');
     } else {
         $url = (int) $url;
     }
     $news = $this->news->where('publication', 1);
     ## News by ID
     if (is_numeric($url)) {
         $slug = false;
         $news = $news->where('id', $url);
         $news = $news->with('meta.seo', 'meta.photo', 'meta.gallery.photos')->first();
         if (@is_object($news)) {
             if (@is_object($news->meta) && @is_object($news->meta->seo)) {
                 $slug = $news->meta->seo->url;
             } else {
                 $slug = $news->slug;
             }
             #$slug = false;
             #Helper::dd($slug);
             if ($slug) {
                 $redirect = URL::route('news_full', array('url' => $slug));
                 #Helper::dd($redirect);
                 return Redirect::to($redirect, 301);
             }
         }
     } else {
         ## News by SLUG
         ## Search slug in SEO URL
         $news_meta_seo = Seo::where('module', 'news_meta')->where('url', $url)->first();
         #Helper::tad($news_meta_seo);
         if (is_object($news_meta_seo) && is_numeric($news_meta_seo->unit_id)) {
             $news = $this->news_meta->where('id', $news_meta_seo->unit_id)->with(array('news' => function ($query) {
                 $query->with('meta.seo', 'meta.photo', 'meta.gallery.photos');
             }))->first()->news;
             #Helper::tad($news);
         } else {
             ## Search slug in SLUG
             $news = $this->news->where('slug', $url)->with('meta.seo', 'meta.photo', 'meta.gallery.photos')->first();
             ## Check SEO url & gettin' $url
             ## and make 301 redirect if need it
             if (@is_object($news->meta) && @is_object($news->meta->seo) && $news->meta->seo->url != '' && $news->meta->seo->url != $url) {
                 $redirect = URL::route('news_full', array('url' => $news->meta->seo->url));
                 #Helper::dd($redirect);
                 return Redirect::to($redirect, 301);
             }
         }
     }
     #Helper::tad($news->template);
     if (!@is_object($news) || !@is_object($news->meta)) {
         App::abort(404);
     }
     if (!$news->template) {
         $news->template = 'default';
     }
     #Helper::tad($news);
     if (empty($news->template) || !View::exists($this->module['gtpl'] . $news->template)) {
         throw new Exception('Template [' . $this->module['gtpl'] . $news->template . '] not found.');
     }
     return View::make($this->module['gtpl'] . $news->template, compact('news'));
 }