Доброго времени суток. Для начала уточню, что пишу менеджер для фоновых изображений. Который назначает фон разным design_layout и категориям. Это дополнение не является модулем, т.е не отображается и не устанавливается как модуль. Все необходимые действия с БД и обработка проводятся в контроллере header.php. Аругментирую это тем, что он загружается на всех страницах всех design_layout и категорий. Поэтому в нем можно реализовать добавление фона к разным design_layout и категориям. Вопрос 1. Столкнулся с определением текущего layout_id странцы. Никак не могу его нормально получить. Приходилось изобретать велосипед. Получал PHP: $this->request->get['route'] а затем выполнял запрос к БД, к таблице layout_route. Таким образом получал layout_id. Можно ли обойтись без запросов к БД? Вопрос 2. Почему-то подумал, что может быть все действия проводить не в header.php, а в другом месте. Посоветуйте, если что-нибудь пришло на ум. Буду очень благодарен.
1. Открываете в админке нужную страницу и смотрите в конце её id. Например, категории отображаются как ...category_id=№, страница с товаром - ...product_id=№, производители - manufacturer_id=№, где № - её номер id. Остальное - по аналогии.
Получить лэйаут без дополнительного запроса к БД не получиться. Но есть несколько хитростей. Чтоб опознать страницу категории, можно проверять наличие PHP: $this->request->get['path'] А распарсив его, можно узнать и id текущей категории.
Да, спасибо сделал определение категории. 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 уже будет обработан.
Только вы сейчас получаеет не id конкретной категории, а весь путь к ней. Если это категория, например, третьего уровня вложенности, в path будет что-то такого плана: 21_12_33, где текущая категория - это последняя цифра, а первые две - это её родители. Выдернуть оттуда id текущей можно так: PHP: $cat_path = explode('_', $this->request->get['path']);$cat_id = end($cat_path);
Окончательный ответ. Без запросов обойтись нельзя. Вот код, который получает 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;}
Почему вы не используете 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;}