Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

Как модифицируются способы оплаты для использования с QCPM.1513

11 мая 2012 г. Ruslan Brest Просмотров: 7919 RSS 6
За кулисами текущих проектов » Howto » OpenCart
QCPM из-за необходимости изменения способов оплаты делает невозможным одновременное использование стандартной формы и QCPM: либо одна, либо другая. Поэтому обязательно храните резервные копии изменяемых стандартных файлов (точный путь указан в документации - README или INSTALL файлах).

Суть изменений проста: в TPL файлах способов оплаты содержится самая последняя кнопка подтверждения заказа, на нажатие которой обычно вешается обработчик (javascript-функция). Эта функция делает 2 вещи: окончательно подтверждает заказ (после этого он формируется и становится виден в админке) и делает что-то требуемое этому способу оплаты (переадресация на внешний сайт плат. системы или другие действия).

В стандартной форме заказа все проверки производятся до действия этой кнопки.

В QCPM - нет, поскольку всё на одной странице и эта кнопка может быть нажата сразу после загрузки, первой. Поэтому нам требуется вмешаться в стандартный процесс:

  1. Сначала произвести валидацию формы заказа;
  2. Затем сделать то, что предполагалось сделать модулем по нажатию на кнопку "Подтвердить заказ" (передать управление стандартной функции модуля оплаты)

Изменяемые файлы модулей оплаты находятся в catalog/view/theme/default/template/payment/

Теперь на примерах: alertpay.tpl

<form action="<?php echo $action; ?>" method="post">
   <input type="hidden" name="ap_merchant" value="<?php echo $ap_merchant; ?>" />
   <input type="hidden" name="ap_amount" value="<?php echo $ap_amount; ?>" />
   <input type="hidden" name="ap_currency" value="<?php echo $ap_currency; ?>" />
   <input type="hidden" name="ap_purchasetype" value="<?php echo $ap_purchasetype; ?>" />
   <input type="hidden" name="ap_itemname" value="<?php echo $ap_itemname; ?>" />
   <input type="hidden" name="ap_itemcode" value="<?php echo $ap_itemcode; ?>" />
   <input type="hidden" name="ap_returnurl" value="<?php echo $ap_returnurl; ?>" />
   <input type="hidden" name="ap_cancelurl" value="<?php echo $ap_cancelurl; ?>" />
   <div class="buttons">
     <div class="right">
       <input type="submit" value="<?php echo $button_confirm; ?>" class="button" />
     </div>
   </div>
 </form>

Что мы видим? Есть форма, по нажатию кнопки происходит отсылка данных этой формы.

Вмешиваемся в этот процесс:

1. по нажатию на кнопку делаем валидацию формы заказа (поменяли кнопку на свою):

<div class="buttons">
     <div class="right"><a onclick="validate_generate();" class="button"><span><?php echo $button_confirm; ?></span></a></div>
   </div>

2. Обеспечиваем работу того, что было предусмотрено модулем. QCPM вызывает функцию payment_confirm(), поэтому надо просто переместить предусмотренную модулем функцию по нажатию на кнопку, в функцию с таким названием:

<script type="text/javascript"><!--
 function payment_confirm()
 {
         $('#payment').submit();
 }
 //--></script>

Этот механизм переделки стандартный для всех модулей: переносим стандартную реакцию на кнопку подтверждения заказа в ф-цию payment_confirm(), а на её место ставим вызов валидации формы заказа.

Другой пример: cheque.tpl

Была кнопка

<div class="buttons">
   <div class="right">
     <input type="button" value="<?php echo $button_confirm; ?>" id="button-confirm" class="button" />
   </div>
 </div>
 <script type="text/javascript"><!--
 $('#button-confirm').bind('click', function() {
         $.ajax({ 
                 type: 'GET',
                 url: 'index.php?route=payment/cheque/confirm',
                 success: function() {
                         location = '<?php echo $continue; ?>';
                 } 
         });
 });
 //--></script>

По ID кнопки (id="button-confirm") вызывается AJAX-обработчик. Который что-то там делает.

Мы переносим этот обработчик в функцию payment_confirm(), а нажатие на кнопку заменяем на валидацию формы:

<script type="text/javascript"><!--
 $('#button-confirm').bind('click', function() {
         validate_generate();
 });
 function payment_confirm()
 {
         $.ajax({
                 type: 'GET',
                 url: 'index.php?route=payment/cheque/confirm',
                 success: function() {
                         location = '<?php echo $continue; ?>';
                 }
         });
 }
 //--></script>

Перенесли стандартный обработчик в payment_confirm и вызвали validate_generate. Те же два действия.

Все остальные модули точно так же устроены и модифицируются аналогично. Они все похожи и используют буквално 2-3 очень похожих схемы работы.

Проще всего увидеть изменения, сравнив стандартный файл и модифицированный. Программы, которые это умеют делать: TotalCommander, WinMerge.org (Windows), Meld (Linux), про MacOS не знаю.

В них всё наглядно видно.

При использовании QCPM желательно все файлы модуля держать только в теме Default и не дублировать в используемую тему - файлы будут подхватываться оттуда. Иначе сложней обслуживать и обновлять.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us
Более 1000 готовых шаблонов Opencart для интернет-магазинов
Комментариев: 6
  1. При подключении способа оплаты QIWI в форме заказа появляется ошибка

    Notice: Undefined index: code in /***/***/****/www/catalog/view/theme/themeglobal/template/checkout/quickcheckout_payment.tpl on line 10

    в 10 строке собственно вот это:

    Сам модуль QIWI скачан отсюда:

    http://opencartforum.ru/files/file/57-ocstoreqiwi/

  2. 2013-01-26 в 10:44:44 | Ruslan Brest

    А способ QIWI случайно не первым стоит в списке? Попробуйте его переставить пониже.

    Была такая ошибка, я вроде исправлял.

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

    Из-за таких модулей пришлось вводить принудительное формирование и запись в базу временного заказа на этапе отрисовки способов доставки и способов оплаты. Уже не помню, почему и там, и там пришлось вводить. А это, в свою очередь, приводит к росту номеров заказов.

    Альтернативный вариант - попробовать исправить модуль QIWI. Чтобы он более аккуратно ошибки обрабатывал. Но у меня руки не доходят уже долгое время, свободного времени не хватает. И таких модулей, написанных будто под копирку, встречалось несколько. Поэтому я и решил тогда оставить этот вариант, плодящий лишние номера заказов при переходе на оформление, как более универсальный.

  3. 2013-04-01 в 03:24:44 | Константин

    Подскажите пожалуйста.

    В модуле оплаты чеком cheque для Prestashop 1.5 я сделал изменения текстов на русском языке в папке translations в файле ru. Потом этот измененый модуль я закачал на хостинг, предварительно удалив старый модуль.Текст изменил с оплаты чеком на оплату по системе Контакт. Сайт aaazzz.cz

    Теперь если делать заказ в магазине - модуль оплаты чеком отображается с измененым текстом нормально. Переходим дальше - информация про заказ тоже отображается нормально с измененым текстом. Но после нажатия кнопки ,я подтверждаю заказ, появляется пустая страница и в поисковике написано - http://aaazzz.cz/ru/module/cheque/validation

    Не знаю что надо сделать чтобы отобразилась последняя страница окончания заказа. Подскажите пожалуйста.

    mail - kaka65@mail.ru

  4. 2013-04-02 в 04:08:21 | Ruslan Brest

    С Престашоп не разбирался, не знаю, как там всё устроено. Статья про Опенкарт.

  5. Здравствуйте, подскажите, пожалуйста ответ на такой вопрос:

    Клонирован модуль оплаты "Оплата при доставке", установлен. Но система не видит, что его выбирают, то есть при нажатии на кнопку этого способа выводится сообщение "Выберите способ оплаты" и дальше процесс не идет. Интересно еще, что выбрать его можно только кнопкой, нажатием на свое название он не выбирается, в отличие от других.

    Помогите, пожалуйста.

    Спасибо за статью

  6. 2015-01-24 в 06:26:24 | Ruslan Brest

    Первым делом надо смотреть на возникающие ошибки встроенными в броузеры отладчиками. Также следы этих ошибок могут быть в логе ошибок апача (веб-сервера) или опенкарта.

Оставьте комментарий!

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

Авторизация  Facebook. MaxSiteAuth. Loginza

(обязательно)