Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Доступ к переменной контроллера из любого файла шаблона


Recommended Posts

Добра всем! Не то что бы знакомлюсь с движком, но и до мастера мне еще далеко. Возникла проблема, нужна переменная которая будет доступна в catalog/view/theme/my_template/common/header.tpl. В гуглях ничего не нашел, может плохо искал.

Да, без проблем можно вставить в соответствующем контроллере эту переменную + обращение к model... Но я не хочу лезть не в свой код. Хочу уложиться исключительно в свой код, свои классы и т.п. Задача следующая:

- пользователь открывает интернет магазин

- контроллер запускает функцию обращения к БД, функция возвращает данные из БД и объявляет эту переменную

- я прописываю в header.tpl своего шаблона вывод этой переменной и она выводится.

Можно (наверное) это прописать и в самом header.tpl, но это будет не эстетично.

Если это можно как-то реализовать не вмешиваясь в код самого движка, а используя исключительно файлы для своего модуля/шаблона, то подскажите пожалуйста как? Куда копать?

Надіслати
Поділитися на інших сайтах


Не поддерживаю такого решения, файл шаблона должен оставаться им и архитектура приложения должна быть сохранена. В противном случае столкнетесь с проблемами при дальнейшем развитии проекта. А вы костыль городите из-за "Но я не хочу лезть не в свой код". Это вам не wordpress, в код лезть все равно придется.

 

Перепишете контроллер или используйте библиотеку library (system/library), хотя вангую, что тоже криво получится. Есть еще варианты с написанием модификации vqmod/ocmod или даже event trigger для 2.x, но придется его создать.

 

В случае, если вы создаете новый шаблон для его дальнейшего использования на других сайтах, то рекомендую vqmod/ocmod, самое распространенное, на мой взгляд, решение.

Змінено користувачем halfhope
Надіслати
Поділитися на інших сайтах

В случае, если вы создаете новый шаблон для его дальнейшего использования на других сайтах, то рекомендую vqmod/ocmod, самое распространенное, на мой взгляд, решение.

Да, это шаблон, он для распространения, потому же и хочу добиться того, чтоб код шаблона был исключительно его кодом. И у меня это одновременно шаблон с модулем, тоесть если пользователь захочет, он включит модуль. В начале пути своего в контроллере controller/tool/upload я добавил свою строчку чтоб получать имя файла при выгрузке файла. Это я тоже хочу исправить. Сейчас (исключительно для опыта) я добавил две строчки кода в контроллер header: первая подгружает модель $this->load->model(extension/module/my_module), и вторая объявляет переменную с функцией из этой модели $data[theme-colors] = $this->extension_model_mymodule->getThemeColors(). И это работает, тоесть запускает фунцию модели, та получает из БД данные, и объявляет переменную с этими данными. Дальше в header.tpl перебираю переменную и т.д.

Есть вариант, мои мысли. Да, как Вы и сказали использовать ocmod: при установке в файле install.sql прописать не только создание БД и т.п., а еще запись в БД в какую-то таблицу, которая используется при загрузке страницы запуск этой самой функции в контроллере+функции модели.

Вот теперь возникают вопросы. Есть ли такая таблица, где прописаны эти загрузки? Если же есть, то какие данные туда вставлять sql-запросом при установке шаблона/модуля чтоб при загрузке страницы срабатывала функция?

Продумываль мысль делать это всё во включенном модуле. Тоесть модуль сначала надо подключить и вставить на страницу. Но это глупо: переменная должна присутствовать буквально на каждой странице, и должна выводится между тегами <head></head> рядом с переменными $styles $scripts $analitics и .т.д.; пользователь не захочет вообще добавлять этот модуль; и много других причин. Тоесть в любом случае это нужно сделать по умному именно для header.tpl

Змінено користувачем SerjBliznyuk
Надіслати
Поділитися на інших сайтах


Нашел решение на форуме от meowmeow

 

Придумал новую переменную - current_page. Далее пошагово, какие строки куда добавлял:

1. В файле document.php (system/library/) добавил две функции - получение новой переменной и передача новой переменной:

public function setCurrent($current_page) {
$this->current_page = $current_page;
}

public function getCurrent() {
return $this->current_page;

}

2. В файле home.php (catalog/controller/common) устанавливаем значение переменной:

$this->document->setCurrent('home'); 

3. В файле header.php (catalog/controller/common) получаем значение переменной:

$this->data['current_page'] = $this->document->getCurrent();

4. Ну и в конце концов, в файле шаблона header.tpl (catalog/view/theme/default/template/common) задаем условие, которое проверяет значение этой переменной:

<?php if ($current_page=='home') { ?>
<div class="1"></div><?php }
else { ?>
<div class="2"><?php echo $heading_title; ?>
</div> <?php } ?> 

 

Ссылка на пост: https://opencartforum.com/topic/11529-resheno-proverka-kakaia-tekuschaia-stranitca-uslovi/

Надіслати
Поділитися на інших сайтах

Нашел решение на форуме от meowmeow

 

 

Ссылка на пост: https://opencartforum.com/topic/11529-resheno-proverka-kakaia-tekuschaia-stranitca-uslovi/

Ну смотри, это можно сделать без проблем в своем интернет-магазине. Потому что пользоваться им будешь только ты. А если это дополнение для распространения, то нужно делать так, чтоб совершенно не менять код движка. Представь, если пользователь, который скачал твой модуль/дополнение, устанавливает его, а твой модуль перезаписывает раннее отредактированный пользователем файл с его функциями. Не хорошо ведь получится. Потому я и пытаю возможность сделать именно так :)

Надіслати
Поділитися на інших сайтах


Ну смотри, это можно сделать без проблем в своем интернет-магазине. Потому что пользоваться им будешь только ты. А если это дополнение для распространения, то нужно делать так, чтоб совершенно не менять код движка. Представь, если пользователь, который скачал твой модуль/дополнение, устанавливает его, а твой модуль перезаписывает раннее отредактированный пользователем файл с его функциями. Не хорошо ведь получится. Потому я и пытаю возможность сделать именно так :)

а если внести эти изменения через ocmod?

Надіслати
Поділитися на інших сайтах

а если внести эти изменения через ocmod?

Если и через ocmod, разницы нет. Всё равно таки код меняется.

Хотя нет,извиняюсь за невежество свое, действительно ocmod может помочь. Только что почитал как это работает.

Змінено користувачем SerjBliznyuk
Надіслати
Поділитися на інших сайтах


Нашел решение на форуме от meowmeow

 

 

Ссылка на пост: https://opencartforum.com/topic/11529-resheno-proverka-kakaia-tekuschaia-stranitca-uslovi/

Все норм здесь - можете так делать через ocmod

Только не забудьте в document.php $current_page как private

Да и вообще заведите там как array для переменных своей темы private $my_theme_vars = array(); Где my_theme  ваш уникальный "префикс" темы

Старайтесь заводить только уникальные имена методов и переменных. А иначе может быть такое что кто то другой заведет тоже $current_page или getCurrent()  (getCurrent - довольно тривиальное название метода, большая вероятность "повтора") - и получиться конфликт

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.