Как определить текущий layout_id? В каком месте проводить операции с фоном сайта?

Тема в разделе "OpenCart", создана пользователем halfhope, 16 ноя 2013.

  1. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Доброго времени суток.
    Для начала уточню, что пишу менеджер для фоновых изображений. Который назначает фон разным design_layout и категориям.
    Это дополнение не является модулем, т.е не отображается и не устанавливается как модуль. Все необходимые действия с БД и обработка проводятся в контроллере header.php. Аругментирую это тем, что он загружается на всех страницах всех design_layout и категорий. Поэтому в нем можно реализовать добавление фона к разным design_layout и категориям.
    Вопрос 1. Столкнулся с определением текущего layout_id странцы. Никак не могу его нормально получить.
    Приходилось изобретать велосипед. Получал
    PHP:
    $this->request->get['route']
    а затем выполнял запрос к БД, к таблице layout_route. Таким образом получал layout_id.
    Можно ли обойтись без запросов к БД?
    Вопрос 2. Почему-то подумал, что может быть все действия проводить не в header.php, а в другом месте. Посоветуйте, если что-нибудь пришло на ум.
    Буду очень благодарен.
     
  2. cobalt

    cobalt

    Регистрация:
    18 окт 2012
    Сообщения:
    278
    Симпатии:
    128
    1. Открываете в админке нужную страницу и смотрите в конце её id.
    Например, категории отображаются как ...category_id=, страница с товаром - ...product_id=, производители - manufacturer_id=, где - её номер id.
    Остальное - по аналогии.
     
    halfhope нравится это.
  3. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Получить лэйаут без дополнительного запроса к БД не получиться.
    Но есть несколько хитростей. Чтоб опознать страницу категории, можно проверять наличие
    PHP:
    $this->request->get['path']
    А распарсив его, можно узнать и id текущей категории.
     
    halfhope нравится это.
  4. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Да, спасибо сделал определение категории.
    PHP:
    if (isset($this->request->get['route']) && ($this->request->get['route'] == 'product/category')) {
        
    var_dump('This is category');
        
    var_dump('categories_ids = '.$this->request->get['path']);
    }else{
        
    var_dump('This is not category');
    }
    По теме нашел http://opencartforum.ru/topic/27095-layouts-omzcybnt-мне/
    Решил все данные обрабатывать в footer.php т.к. ко времени обработки footer.php design_layout уже будет обработан.
     
    HPlus нравится это.
  5. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Только вы сейчас получаеет не id конкретной категории, а весь путь к ней. Если это категория, например, третьего уровня вложенности, в path будет что-то такого плана: 21_12_33, где текущая категория - это последняя цифра, а первые две - это её родители.

    Выдернуть оттуда id текущей можно так:
    PHP:
    $cat_path explode('_'$this->request->get['path']);
    $cat_id end($cat_path);
     
    halfhope нравится это.
  6. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Окончательный ответ. Без запросов обойтись нельзя.
    Вот код, который получает layout_id и category на любой странице(Использовать в контроллере).
    PHP:
    private function get_layout_id(){
        
    $this->load->model('design/layout');
        
    $this->load->model('catalog/category');
        
    $this->load->model('catalog/product');
        
    $this->load->model('catalog/information');    $layout_id 0
        
    $route = (isset($this->request->get['route'])?$this->request->get['route']:'');
        if (
    $route == 'product/category' && isset($this->request->get['path'])) {
            
    $path explode('_', (string)$this->request->get['path']);
            
    $layout_id $this->model_catalog_category->getCategoryLayoutId(end($path));            
        }
        if (
    $route == 'product/product' && isset($this->request->get['product_id'])) {
            
    $layout_id $this->model_catalog_product->getProductLayoutId($this->request->get['product_id']);
        }
        if (
    $route == 'information/information' && isset($this->request->get['information_id'])) {
            
    $layout_id $this->model_catalog_information->getInformationLayoutId($this->request->get['information_id']);
        }
        if (!
    $layout_id) {
            
    $layout_id $this->model_design_layout->getLayout($route);
        }
        if (!
    $layout_id) {
            
    $layout_id $this->config->get('config_layout_id');
        }
        return 
    $layout_id;
    }
     
    HPlus и Dotrox нравится это.
  7. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Почему вы не используете else if вместо второго и третьего if? Сейчас получается, что если это окажется категория, вы всё равно проверите не товар ли это и не информационная страница ли. И последние два условия можно упростить.

    PHP:
    private function get_layout_id(){
        
    $this->load->model('design/layout');
        
    $this->load->model('catalog/category');
        
    $this->load->model('catalog/product');
        
    $this->load->model('catalog/information');  
        
    $layout_id 0;
        
    $route = (isset($this->request->get['route'])?$this->request->get['route']:'');
        if (
    $route == 'product/category' && isset($this->request->get['path'])) {
            
    $path explode('_', (string)$this->request->get['path']);
            
    $layout_id $this->model_catalog_category->getCategoryLayoutId(end($path));         
        } else if (
    $route == 'product/product' && isset($this->request->get['product_id'])) {
            
    $layout_id $this->model_catalog_product->getProductLayoutId($this->request->get['product_id']);
        } else if (
    $route == 'information/information' && isset($this->request->get['information_id'])) {
            
    $layout_id $this->model_catalog_information->getInformationLayoutId($this->request->get['information_id']);
        }
        if (!
    $layout_id) {
            
    $layout_id $this->model_design_layout->getLayout($route) ? $this->model_design_layout->getLayout($route) : $this->config->get('config_layout_id');
        }
        return 
    $layout_id;
    }
     
    halfhope нравится это.
  8. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Да, спасибо, буду использовать Ваш код)
     
    HPlus нравится это.