Перейти к содержанию
tabook

Пятничная викторина по программированию

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

Пятничное.

Решил как то я вчера вечером достичь дзена и написать простенький модуль,но такой чтобы ну совсем без vqmod и модификации системных файлов opencart. Конкретнее - получить id заказа в модуле, который выводится в схеме checkout/success, для того чтобы вытянуть данные о заказе на странице "Спасибо за покупку". Самая главная беда - что этот номер сразу затирается из сессии в checkout/success/index

 

Где то за час полтора с перекурами родился рабочий вариант, но одна беда - для чистого opencart. В случае, когда на сайте установлена Simpla, метод не работает. И вот это уже победить никак не удается. Дело принципа - возможно ли это или нет, придется делать одну строчку VQMOD, что скажете, гуру? Можно ли решить задачу?

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


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

Странно

simpla ведь на этапе success уже не участвует.

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


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

Странно

simpla ведь на этапе success уже не участвует.

Это так. Но на этапе success уже поздно и для симплы и для чистого ОС. Просто симпла по другому устанавливает session['order_id'], перехватить не могу

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


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

Можно в принципе

Перехватите модель

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


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

в checkout опубликуйте еще один модуль без представления, и запишите в свой параметр в сессию номер заказа. А в success уже выводите данные.

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


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

Для тех кто не умеет читать

 

но такой чтобы ну совсем без vqmod и модификации системных файлов opencart.

 

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


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

в checkout опубликуйте еще один модуль без представления, и запишите в свой параметр в сессию номер заказа. А в success уже выводите данные.

Это слишком просто :) Хочу красиво по феншую без модификаций.

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


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

Для тех кто не умеет читать

А где вы видите что надо vqmod ?

В сессию записывается номер заказа

И при success достается оттуда

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


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

Можно в принципе

Перехватите модель

Думал и сюда. Перехвачу. А дальше? Ну перехватил я addOrder, как узнаю id заказа? getLastId уже будет показывать не пойми что.

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


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

В сессию записывается номер заказа

 

В какой момент?

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


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

мы об этом говорим?

class ControllerCheckoutSuccess extends Controller { 
	public function index() { 	
		if (isset($this->session->data['order_id'])) {
			$this->cart->clear();
...
			unset($this->session->data['order_id']);
...
$this->template = $this->config->get('config_template') . '/template/common/success.tpl';

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


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

Подменяете временно (на выполнение модуля) Loader на свой

Перехватываете модель

Обрабатываете данные через _call

Записываете в сессию order_id

Возвращаете Loader

При success проверяете свою переменную сессии и выводите то вам нужно

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


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

addOrder возвращает $order_id

Если вы перехватили модель order то там уже тривиально получить и записать в сессию

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


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

 

мы об этом говорим?

class ControllerCheckoutSuccess extends Controller { 
	public function index() { 	
		if (isset($this->session->data['order_id'])) {
			$this->cart->clear();
...
			unset($this->session->data['order_id']);
...
$this->template = $this->config->get('config_template') . '/template/common/success.tpl';

Ага, об этом. Если перехватить вызов CheckoutSuccess/index() то до его вызова order_id еще в сессии.

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


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

addOrder возвращает $order_id

Если вы перехватили модель order то там уже тривиально получить и записать в сессию

Проморгал, спасибо! Да, действительно метод возвращает order_id.

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


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

Обрабатываете так приблизительно

class newOrder extends Controller
{
    protected $Order;


    public function __call($name, array $params)
    {
          $modules = false;

            $modules   = call_user_func_array(array(
                $this->Order,
                $name
            ), $params);
            unset($this->Order);
        
        if ($name=='addOrder') {
......
        } 

        return $modules;
    }

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


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

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

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


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

Подменяете временно (на выполнение модуля) Loader на свой

Перехватываете модель

Обрабатываете данные через _call

Записываете в сессию order_id

Возвращаете Loader

При success проверяете свою переменную сессии и выводите то вам нужно

 

Перехват лоадера в моем контроллере возможен только выполнения "основного" контроллера, но тогда уже поздно.

 

Вы сами у себя в SEO CMS PRO используете модификацию системного контроллера maintenance.php, чтобы сесть на прослушку как можно раньше. Но это противоречит условиям задания. Никаких модификаций файлов.

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

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


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

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


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

 

А я ж просто не в курсе был, как у Марка перехват делается, сейчас ради интереса глянул. Да VQMOD не используется, это правда. Но и файлы модифицирует )))

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


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

Помните то время, когда еще не был vqmod так популярен, и мануалы по установке выглядели как скопируй и вставь куски кода.

Я все чаще понимаю что это было хорошее время.

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


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

Да не воспринимайте задачу всерьез. Конечно в суровом мире она решается в одну строчку путем модификации одного контроллера. Вся прелесть в поиске академического, олимпиадного "решения" :)

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


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

Я не знаю как выглядит код для чистого OC, ведь что-то получилось..

 

 

Задача  - зацепить order_id

 

Для этого нужно привязать к схеме simple свой модуль, и в своей переменной сессии хранить его

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


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

Я не знаю как выглядит код для чистого OC, ведь что-то получилось..

 

 

Задача  - зацепить order_id

 

Для этого нужно привязать к схеме simple свой модуль, и в своей переменной сессии хранить его

 

Неа, с симплой не получится. В чистом ОС я действительно подцепился модулем к схеме checkout/confirm и перехватил session['order_id']

В симпле это не прокатит. Там создание заказа не в отдельной схеме, а ajax вызовом в checkout/simplecheckout. Т.е. можно конечно подцепиться к вышеуказанной layout, но тогда еще и заказа нет. Но потом он создается так, что никто никому ничего уже не скажет. Вот в чем беда ) А следующий контроллер - уже checkout/success где все благополучно и затирается.

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

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


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

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

 

1. Делаем контроллер с одним методом checkout/foo/bar

    public function bar() {
        if (isset($this->session->data['order_id']))
            $this->session->data['foo_order_id'] = $this->session->data['order_id'];
    }

2. Настройки Simple: вешаем на поля рефреш после изменений

3. Настройки Simple: закладка интеграция добавляем код 

$.get( "/index.php?route=checkout/foo/bar"); 

4. Идем пить пиво :)

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

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

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.