/**
  * @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;
             #*/
 }
 /**
  * Функция сохраняет текущее состояние записи,
  * восстанавливает состояние записи из резервной копии
  * и удаляет все резервные копии, превысившие лимит
  *
  * @param $id
  *
  * @return string
  * @throws Exception
  */
 public function restore($id)
 {
     /**
      * Находим запись резервной копии для восстановления
      */
     $version = $this->essence->where('id', $id)->with(['metas', 'blocks.metas', 'seos'])->first();
     if (!isset($version) || !is_object($version) || $version->version_of == NULL) {
         return Redirect::to(URL::previous());
     }
     #Helper::tad($version);
     /**
      * Находим запись оригинала
      */
     $element = $this->essence->where('id', $version->version_of)->with(['metas', 'blocks.metas', 'seos', 'versions'])->first();
     if (!isset($element) || !is_object($element) || $element->version_of != NULL) {
         return Redirect::to(URL::previous());
     }
     #Helper::ta($version);
     #Helper::ta($element);
     #dd();
     #Helper::ta($element->versions);
     /**
      * Создаем резервную копию оригинальной записи
      */
     $create_backup_result = $this->create_backup($version->version_of, FALSE);
     if (!$create_backup_result) {
         throw new Exception("Can't create backup of original record");
     }
     #Helper::tad($element->versions);
     /**
      * Восстанавливаем содержимое записи из резервной копии
      */
     $restore_backup_result = $this->restore_backup($version->id);
     if (!$restore_backup_result) {
         throw new Exception("Can't restore backup of original record");
     }
     /**
      * Удаляем старые резервные копии (если их больше лимита)
      */
     $delete_backup_result = $this->delete_backups($element->id);
     if (!$delete_backup_result) {
         throw new Exception("Can't delete over backups of original record");
     }
     #Helper::dd((int)$create_backup_result . ' / ' . (int)$restore_backup_result . ' / ' . (int)$delete_backup_result);
     $url = action('page.edit', array('id' => $element->id)) . (Request::getQueryString() ? '?' . Request::getQueryString() : '');
     #Helper::d($element);
     #Helper::dd($url);
     ## Clear & reload pages cache
     Page::drop_cache();
     Page::preload();
     #return Redirect::to($url);
     Redirect($url);
     return '';
 }