Пример #1
0
 public static function draw($slug, $options = false)
 {
     $menu = Storage::where('module', 'menu')->where('name', $slug)->first();
     $value = json_decode($menu->value, 1);
     #Helper::dd($value);
     #$menu = self::get_menu_level($value->items, $options);
 }
 public static function returnRoutes($prefix = null)
 {
     $class = __CLASS__;
     $entity = self::$entity;
     Route::group(array('before' => 'auth', 'prefix' => $prefix . "/" . $class::$group), function () use($class, $entity) {
         Route::post('cache/drop', array('as' => 'drop_cache', 'uses' => $class . '@dropCache'));
         Route::post('update', array('as' => $class::$group . '.' . $class::$name . '.update', 'uses' => $class . '@update'));
         Route::resource($class::$name, $class, array('except' => array('show', 'create', 'store', 'edit', 'update', 'destroy'), 'names' => array('index' => $class::$group . '.' . $class::$name . '.index')));
     });
     if (Cache::has('cms.settings')) {
         $settings = Cache::get('cms.settings');
     } else {
         $settings = Storage::where('module', 'system')->where('name', 'settings')->pluck('value');
         $settings = json_decode($settings, true);
     }
     Config::set('app.settings', $settings);
     #$temp = Config::get('app.settings.main');
     #dd($temp);
 }
 public function destroy($id)
 {
     Allow::permission($this->module['group'], $this->module['name']);
     if (!Request::ajax()) {
         App::abort(404);
     }
     $json_request = array('status' => FALSE, 'responseText' => '');
     $deleted = Storage::where('module', 'menu')->where('id', $id)->delete();
     $json_request['responseText'] = 'Удалено';
     $json_request['status'] = TRUE;
     return Response::json($json_request, 200);
 }
 public function postAjaxNestedSetModel()
 {
     #$input = Input::all();
     $data = Input::get('data');
     $data = json_decode($data, 1);
     #Helper::dd($data);
     $dic_id = NULL;
     $dic = NULL;
     if (count($data)) {
         $id_left_right = (new NestedSetModel())->get_id_left_right($data);
         #Helper::tad($id_left_right);
         Storage::where('module', 'pages')->where('name', 'hierarchy')->update(['value' => json_encode($id_left_right)]);
         #if (count($id_left_right)) {
         /*
         $dicvals = DicVal::whereIn('id', array_keys($id_left_right))->get();
         
         if (count($dicvals)) {
             foreach ($dicvals as $dicval) {
                 if (!$dic_id)
                     $dic_id = $dicval->dic_id;
                 $dicval->lft = $id_left_right[$dicval->id]['left'];
                 $dicval->rgt = $id_left_right[$dicval->id]['right'];
                 $dicval->save();
             }
             if ($dic_id) {
                 $dic = Dic::by_id($dic_id);
             }
         }
         */
         #}
     }
     return Response::make('1');
 }
Пример #5
0
    /**
     * Возвращаем пометку об активности текущего пункта меню
     *
     * @param $element
     * @return bool
     */
    private function get_active($element) {
        #return false;

        #Helper::tad($element);

        $is_active = false;

        /**
         * Собственное правило для определения активности пункта меню
         * Проверка текущего URL на соответствие шаблону регулярного выражения
         */
        if (isset($element) && is_array($element)) {

            if (
                (@$element['use_active_regexp'] && @$element['active_regexp'])
            ) {

                #Helper::ta($element);

                if (@$element['use_active_regexp'] && @$element['active_regexp']) {

                    /**
                     * Сделаем замену в регулярке, если у нас обычная страница
                     */
                    if (isset($element['type']) && $element['type'] == 'page') {
                        $page = isset($this->pages[$element['page_id']]) ? $this->pages[$element['page_id']] : NULL;
                        if ($page && is_object($page) && $page->slug) {
                            $element['active_regexp'] = strtr($element['active_regexp'], [
                                '%slug%' => $page->slug, '%url%' => $page->slug,
                            ]);
                        }
                        #var_dump($element['active_regexp']);
                    }

                    try {
                        $element['active_regexp'] = $this->replaces($element['active_regexp']);
                    } catch (Exception $e) {
                        echo 'Error: ', $e->getMessage(), "\n";
                        Helper::tad($element);
                        #die;
                    }

                    /**
                     * Замена конструкций вида %_page_sysname_>url%
                     */
                    preg_match_all('~\%([A-Za-z0-9\-\_]+)\>url\%~is', $element['active_regexp'], $matches);

                    if (isset($matches[1]) && count($matches[1])) {

                        #var_dump($matches);
                        #Helper::ta($this->pages_by_sysname);
                        $pages = new Collection();
                        $page_sysnames = [];
                        ## Все найденные конструкции
                        foreach ($matches[1] as $page_sysname) {
                            if (isset($this->pages_by_sysname[$page_sysname])) {
                                ## Ищем текущую страницу среди страниц текущего меню
                                $pages[$page_sysname] = $this->pages_by_sysname[$page_sysname];
                            } elseif (NULL !== Config::get('pages.preload_pages_limit') && NULL !== ($tmp = Page::by_sysname($page_sysname))) {
                                ## Ищем текущую страницу в кеше страниц
                                $pages[$page_sysname] = $tmp;
                            } else {
                                ## Если страница уж совсем нигде не нашлась - придется ее подгружать из БД. Делать это будем позже одним запросом.
                                $page_sysnames[] = $page_sysname;
                            }
                        }
                        ## Если есть список страниц для их подгрузки из БД - сделаем это!
                        if (count($page_sysnames)) {
                            $temp = Page::whereIn('sysname', $page_sysnames)->where('version_of', NULL)->get();
                            if (count($temp)) {
                                ## Если что-то нашлось - разложим по sysname
                                $pages_by_sysnames = new Collection();
                                foreach ($temp as $tmp) {
                                    if (!$tmp->sysname)
                                        continue;
                                    $pages_by_sysnames[$tmp->sysname] = $tmp;
                                }
                                if (count($pages_by_sysnames)) {
                                    ## Найдем недостающие страницы и добавим их в список
                                    foreach ($page_sysnames as $psn) {
                                        if (isset($pages_by_sysnames[$psn]))
                                            $pages[$psn] = $pages_by_sysnames[$psn];
                                    }
                                }
                            }
                            unset($temp, $tmp);
                        }
                        #Helper::tad($pages_by_sysnames);
                        #Helper::tad($pages);

                        $replaces = [];
                        ## Еще раз пройдемся по списку найденных паттернов и сгенерируем список для замены
                        foreach ($matches[1] as $page_sysname) {
                            if (isset($pages[$page_sysname]) && NULL !== ($page = $pages[$page_sysname])) {
                                $replaces['%' . $page->sysname . '>url%'] = $page->slug;
                            }
                        }
                        #dd($replaces);

                        ## Производим замену паттернов
                        $element['active_regexp'] = strtr($element['active_regexp'], $replaces);
                        ## Если остались ненайденные паттерны - удалим их
                        $element['active_regexp'] = preg_replace('~\%([A-Za-z0-9\-\_]+)\>url\%~is', '', $element['active_regexp']);
                    }

                    #Helper::dd(Request::path());
                    #Helper::dd($element['active_regexp']);
                    #Helper::dd(preg_match($element['active_regexp'], Request::path()));

                    $is_active = @(bool)preg_match($element['active_regexp'], Request::path());
                    #return $is_active;
                }

                if ($is_active)
                    return true;
            }
        }

        /**
         * Возвращаем пометку об активности ссылки, в зависимости от типа элемента меню
         */
        switch(@$element['type']) {

            case 'page':
                #Helper::ta($this->pages);
                #Helper::ta($this->pages[$element['page_id']]);
                $page = isset($this->pages[$element['page_id']]) ? $this->pages[$element['page_id']] : NULL;
                #Helper::ta($page);
                if (!$page)
                    return NULL;

                #$return = $this->isRoute('page', ['url' => $page->slug]);
                #$return = $this->isRoute('page', $page->slug);

                $is_active = $this->isRoute($page->start_page ? 'mainpage' : 'page', ['url' => $page->slug]);
                #Helper::tad($is_active);

                if ($is_active)
                    return $is_active;

                ## Если активна опция определения активности по дочерним страницам (из структуры страниц)
                if (@$element['use_active_hierarchy']) {

                    #Helper::ta($element);
                    #Helper::ta($page);

                    ## Получим структуру страниц из Storage
                    $current_hierarchy = Storage::where('module', 'pages')->where('name', 'hierarchy')->pluck('value');
                    $elements = json_decode($current_hierarchy, false);
                    #Helper::d($elements);
                    #Helper::d($elements[$page->id]);

                    ## Сформируем id_left_right
                    $id_left_right = [];
                    if (count($elements)) {

                        foreach($elements as $element_id => $element) {
                            #dd($element);
                            $id_left_right[$element_id] = array();
                            $id_left_right[$element_id]['left'] = $element->left;
                            $id_left_right[$element_id]['right'] = $element->right;
                        }
                    }
                    #Helper::tad($id_left_right);

                    ## Получим IDs страниц, для которых текущая страница (пункт меню) является родителем
                    $pages_ids = (new NestedSetModel())->get_children_ids_by_id_from_id_left_right($id_left_right, $page->id);
                    #Helper::ta('PAGES IDS:');
                    #Helper::ta($pages_ids);

                    ## Если у текущей страницы (пункта меню) в иерархии есть потомки
                    if (isset($pages_ids) && is_array($pages_ids) && count($pages_ids)) {

                        ## Получение страниц-потомков по их IDs
                        ## Как будем искать страницы - в кеше или в БД?
                        if (Config::get('pages.not_cached')) {

                            #Helper::tad('PAGES CACHE DISABLED! MenuConstructor:709');
                            ## Кеширование отключено (или не найдено ни одной страницы) - ищем в БД
                            $pages = (new Page())
                                ->where('publication', 1)
                                ->where('version_of', NULL)
                                ->whereIn('id', $pages_ids)
                                ->get()
                            ;

                        } else {

                            ## Если страницы есть в кеше
                            if (count(Page::all_by_id())) {

                                ## Ищем все нужные страницы в кеше по их IDs
                                foreach ($pages_ids as $page_id) {

                                    $pages[] = Page::by_id($page_id);
                                }
                            }
                        }

                        ## Если получены объекты страниц
                        if (isset($pages) && count($pages)) {

                            #Helper::dd($pages);

                            ## Перебираем их
                            foreach ($pages as $page) {

                                if (!is_object($page)) {
                                    #dd($page);
                                    continue;
                                }

                                ## Проверка на активность
                                $is_active = $this->isRoute($page->start_page ? 'mainpage' : 'page', ['url' => $page->slug]);
                                if ($is_active)
                                    return true;
                            }
                        }

                    }

                    $is_active = false;
                }

                return $is_active;

                break;

            case 'link':
                return (bool)preg_match('~' . $element['url'] . '$~s', Request::fullUrl());
                break;

            case 'route':
                $route_params = array();
                if ('' != ($element['route_params'] = trim($element['route_params']))) {
                    $temp = explode("\n", $element['route_params']);
                    if (@count($temp)) {
                        foreach ($temp as $tmp) {
                            $tmp = trim($tmp);
                            if (!$tmp) {
                                continue;
                            }
                            if (strpos($tmp, '=')) {
                                $tmp_params = explode('=', $tmp, 2);
                                $route_params[trim($tmp_params[0])] = trim($tmp_params[1]);
                            } else {
                                $route_params[] = $tmp;
                            }
                        }
                    }
                }
                return $this->isRoute($element['route_name'], $route_params);
                break;

            case 'function':
                #Helper::dd($element);
                $function = Config::get('menu.functions.' . $element['function_name']);
                if (isset($function) && is_callable($function)) {
                    $result = $function();
                    #return $result['url'];


                    /**
                     * Одиночная ссылка
                     */
                    #return (bool)preg_match('~' . $result['url'] . '$~s', Request::fullUrl());
                    if (isset($result['url']))
                        $result = array($result);

                    /**
                     * Перебираем весь массив ссылок
                     */
                    foreach ($result as $res)
                        if (isset($res['url']) && (bool)preg_match('~' . $res['url'] . '$~s', Request::fullUrl()) == true)
                            return true;

                }
                return false;
                break;

            default:
                return false;
                break;
        }
    }
Пример #6
0
 public static function getObjects()
 {
     return Storage::where("ID", ">", 0)->orderBy("NAME")->get();
 }