tabook

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

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

tabook    129

Пятничное.

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

 

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

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


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

Странно

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

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


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

Странно

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

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

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


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

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

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

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


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

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

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


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

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

 

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

 

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

 

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

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


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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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


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

 

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

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

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


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

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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

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

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

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

 

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

 

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

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

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


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

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


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

 

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

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


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

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

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

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


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

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

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


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

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

 

 

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

 

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

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


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

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

 

 

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

 

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

 

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

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

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

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


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

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

 

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 пользователей онлайн

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