Jump to content
Sign in to follow this  
tabook

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

Recommended Posts

Пятничное.

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

 

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

Share this post


Link to post
Share on other sites

Странно

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

Share this post


Link to post
Share on other sites

Странно

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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';

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

 

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

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 еще в сессии.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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;
    }

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

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

 

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

Edited by tabook

Share this post


Link to post
Share on other sites

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

 

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

 

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

 

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

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

Edited by tabook

Share this post


Link to post
Share on other sites

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

 

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. Идем пить пиво :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.