Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Использование переменных


alebard
 Share

Recommended Posts

Всем привет. Начал знакомство с opencart. И у меня есть настолько, видимо, глупый вопрос, что ответа на него нету даже в гугле. Я не могу понять как переменные передаются из контроллера в шаблон, вернее какая строка за это отвечает. Есть переменная {{text_items}} - которая используется в cart.twig. Я хочу использовать эту переменную в header.twig. Если использовать просто эту переменную в шаблоне хидера, то сответственно правильно это не работает. Что и куда я должен прописать, чтобы всё работало верно? 

Link to comment
Share on other sites


10 минут назад, alebard сказал:

И у меня есть настолько, видимо, глупый вопрос, что ответа на него нету даже в гугле.

Да нет, в гугле ответ точно есть) Хотябы по запросу MVC )

Переменные передаются из контроллера в свой шаблон (twig). Тоесть cart.php -> cart.twig. Соответсвенно если шо то хотите получить в header.twig, то в контроллере header.php нужно необходимую переменную свормировать и запихуить в массив data[]

  • +1 1
Link to comment
Share on other sites

18 минут назад, iglin сказал:

Соответсвенно если шо то хотите получить в header.twig, то в контроллере header.php нужно необходимую переменную свормировать и запихуить в массив data[]

она будет иметь те же данные что и при выводе в cart.twig? Как мне это сделать?

Link to comment
Share on other sites


17 минут назад, alebard сказал:

Как мне это сделать?

А это уж от вашего креатива зависит. Можете часть кода отвечающую за формирование переменной позаимствовать из контроллера донора, можете создать свою новую функцию в модели, ну и т.д.) Главное чтобы нужное вам значение попало в data[] того контроллера который вам рисует нужный макет

 

Link to comment
Share on other sites

чтобы {{ text }} работало в хедере, при переносе из карт твиг в хедер твиг - заходим в контроллер карт твиг и переносим оттуда модели. this-load и тд, как то так, копируем и в хедер ставим.

а чтобы перенести корзину достаточно написать {{ cart }}, код не нужно переносить из карт твиг, он не будет работать, вот в меню с телефона пример.

 

 image.png.c2682e1ed604d25f255ae6bd903c9a22.png

Link to comment
Share on other sites


В частности для text_items в контроллер header.php можно вставить где нибудь до "return $this->load->view('common/header', $data);"

 

$this->load->language('common/cart');
$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total, $this->session->data['currency']));

 

И тогда в макете header.twig это значение так же можно будет вызвать {{text_items}}

Link to comment
Share on other sites

24 минуты назад, iglin сказал:

В частности для text_items в контроллер header.php можно вставить где нибудь до "return $this->load->view('common/header', $data);"

 

$this->load->language('common/cart');
$data['text_items'] = sprintf($this->language->get('text_items'), $this->cart->countProducts() + (isset($this->session->data['vouchers']) ? count($this->session->data['vouchers']) : 0), $this->currency->format($total, $this->session->data['currency']));

 

И тогда в макете header.twig это значение так же можно будет вызвать {{text_items}}

Это работает, но выходит ошибка, ругается на отсутствие $total, если я пытаюсь удалить его, то выходит:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function Cart\Currency::format(), 1 passed in C:\xampp\htdocs\new\catalog\controller\common\header.php on line 103 and at least 2 expected in C:\xampp\htdocs\new\system\library\cart\currency.php:24 Stack trace: #0 C:\xampp\htdocs\new\catalog\controller\common\header.php(103): Cart\Currency->format('RUB') #1 C:\xampp\htdocs\new\system\engine\action.php(79): ControllerCommonHeader->index(Array) #2 C:\xampp\htdocs\new\system\engine\loader.php(48): Action->execute(Object(Registry), Array) #3 C:\xampp\htdocs\new\catalog\controller\common\home.php(21): Loader->controller('common/header') #4 C:\xampp\htdocs\new\system\engine\action.php(79): ControllerCommonHome->index() #5 C:\xampp\htdocs\new\catalog\controller\startup\router.php(25): Action->execute(Object(Registry)) #6 C:\xampp\htdocs\new\system\engine\action.php(79): ControllerStartupRouter->index() #7 C:\xampp\htdocs\new\system\engine\router.php(67): Action->execute(Object(Registry)) #8 C:\xampp\htdocs\new\system\engine\router.php(56): Router->execute(Object(Action)) #9 C:\xampp\htdocs\new\system\framework.php(168): Router->dispatch(Object(Action), Object(Action)) #10 C:\xampp\htdocs\new\system\startup.php(104): require_once('C:\\xampp\\htdocs...') #11 C:\xampp\htdocs\new\index.php(19): start('catalog') #12 {main} thrown in C:\xampp\htdocs\new\system\library\cart\currency.php on line 24

 

Link to comment
Share on other sites


1 час назад, alebard сказал:

ругается на отсутствие $total

Ну да, чтобы сумму корзины вывести, её наверное сначала нужно где то взять. Замените $total на $this->cart->getTotal(), в теории должно сработать)

  • +1 1
Link to comment
Share on other sites

В 03.07.2021 в 18:32, iglin сказал:

Ну да, чтобы сумму корзины вывести, её наверное сначала нужно где то взять. Замените $total на $this->cart->getTotal(), в теории должно сработать)

На практике тоже сработало) Спасибо)

Link to comment
Share on other sites


Теперь я пытаюсь заставить вновь добавленную в хидер переменную {{ text_items }} изменять значение сразу после добавления товара ( на данный момент обновляется только при перезагрузке страницы). 
Правильно ли я понимаю что это происходит в js файле. Мне казалось я нашёл строки которые отвечают за обновление контента, переписал пару строк но ничего не вышло. Может кто-то знает и сходу скажет мне где мне искать

 

Upd: Нашлась. Если кто-то будет искать, то это 164 строка функции add

$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');

 

Edited by alebard
Link to comment
Share on other sites


Я всё же столкнулся с проблемой, с которой провозился весь вечер. 

Мне получилось реализовать обновление добавленной в header переменной {{ text_item }}.  Она работала безотказно, пока я не полез в карточку товара, там это не работает. То есть из каталога товаров, если я добавляю товар в корзину, то переменная обновляется. А если добавлять в корзину из страницы товара, то этого не происходит. 

 

В каталоге товаров кнопка имеет

onclick="cart.add('50', '1')

тем самым мы передаем в функцию номер товара и количество.

 

А на странице товара кнопка выглядит вот так:

<button type="button" id="button-cart" data-loading-text="Загрузка..." class="btn btn-primary btn-lg btn-block">Купить</button>

И я не смог найти в скрипте обработку этой кнопки

 

Чтобы убедиться что я ничего не сломал по пути - я вывел стандартный header, со своей иконкой корзины, которая прекрасно обновляется при добавлении товара из страницы товара. Но не обновляется из каталога товаров (логично, я ведь в скрипте поменял строку, которая за это отвечала). 

 

Уже беспонятия куда копать. Кто знает как решить проблемы - прошу помощи
 

 

Link to comment
Share on other sites


Вопрос выше - снят. Мне подсказали что скрипты не только в файле common.js, скрипты так же в шаблонах есть. 

Link to comment
Share on other sites


  • 1 year later...
03.07.2021 в 14:26, iglin сказал:

Да нет, в гугле ответ точно есть) Хотябы по запросу MVC )

Переменные передаются из контроллера в свой шаблон (twig). Тоесть cart.php -> cart.twig. Соответсвенно если шо то хотите получить в header.twig, то в контроллере header.php нужно необходимую переменную свормировать и запихуить в массив data[]

 

спасибо. два дня разбирался как перенести корзину и помог

Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.