SerjBliznyuk

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

Рекомендуемые сообщения

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
halfhope    158

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

 

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

 

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

Изменено пользователем halfhope

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
MafiaBoSS    0

Мне тоже актуален данный вопрос. Мне нужно иметь доступ к переменной heading_title из файла column_left

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В случае, если вы создаете новый шаблон для его дальнейшего использования на других сайтах, то рекомендую 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
MafiaBoSS    0

Нашел решение на форуме от 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/

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
MafiaBoSS    0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем SerjBliznyuk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
markimax    1 494

Нашел решение на форуме от 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу