tabook

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

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

tabook    124

Пятничное.

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

 

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

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


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

Странно

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

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


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

Странно

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

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

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


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

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

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

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


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

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

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


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

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

 

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

 

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

 

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

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


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

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

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 382

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

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

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

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

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

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

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


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

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

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

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


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

 

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

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    124

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

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

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

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


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

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

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    240

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

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


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

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

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

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

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

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

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

 

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

 

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

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

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


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

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


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

 

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

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


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

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

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

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


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

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

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


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

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

 

 

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

 

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

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


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

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

 

 

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

 

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

 

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

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

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

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


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

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

 

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

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