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

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


tabook

Recommended Posts

Пятничное.

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

 

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

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

Странно

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 не используется, это правда. Но и файлы модифицирует )))

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

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

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

Я не знаю как выглядит код для чистого 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. Идем пить пиво :)

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

мама дАрАгая...

ф топку

 

 

не для реального магазина

 

Нет, видимо в олимпиадах по программированию никто не участвовал.

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

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

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

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

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

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

Вхід

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

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

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

Important Information

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