Возникают проблема следующего рода: так как используется "заказ в 1 шаг", при оформлении заказа этап оплаты бонусами пролетаем мимо, что видно из следующего кода (как в wiki "Оформление заказа в один шаг – xslt шаблонизатор", да и в classes\modules\emarket\__purchasing_one_step.php точно такое же написано):
//сохранение способа оплаты и редирект на итоговую страницу, либо страницу подтверждения оплаты.
$order->setValue('payment_id', getRequest('payment-id'));
$order->refresh();
$paymentId = getRequest('payment-id');
if(!$paymentId) {
$this->errorNewMessage(getLabel('error-emarket-choose-payment'));
$this->errorPanic();
}
$payment = payment::get($paymentId);
if($payment instanceof payment) {
$paymentName = $payment->getCodeName();
$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/purchase/payment/{$paymentName}/";
} else {
$url = "{$this->pre_lang}/".cmsController::getInstance()->getUrlPrefix()."emarket/cart/";
}
$this->redirect($url);
Здесь мне становиться непонятно как и когда вызвать метод отвечающий за оплату бонусами. Ради интереса, пробовал, находясь в корзине с товаром, вбивать в адресную строку запрос вида mysite/emarket/purchase/payment/bonus/. Попадал на этап оплаты бонусами, далее если бонусов хватало на всю покупку, то выдавалась страница об успешном оформлении заказа, если нет, то предлагался выбор способа оплаты, затем опять успешное завершение оформления. Ни в том, ни в другом случае после оформления заказа в нем не было сохранено ни способа оплаты, ни адреса доставки. Также заметил, что если доставка выбиралась платной, то ее бонусами оплатить нельзя было, т.е. оплачивать можно только товары.
Есть ли какие-то мысли? Может это только мне не очевидно, т.к. недавно работаю в этой области :(
Может кому понадобится... В общем, решил задачу переписав немного стандартный метод использования бонусов в заказе и их начисления покупателю. Кастомный метод использования бонусов в заказе описал в emarket/__custom.php:
public function applyBonus(){
$urlPrefix = cmsController::getInstance()->getUrlPrefix() ? (cmsController::getInstance()->getUrlPrefix() . '/') : '';
$order = $this->getBasketOrder();
$bonus = getRequest('bonus');
if ($bonus || $bonus === 0 || $bonus === '0') {
$order->setBonusDiscount($bonus);
$order->refresh();
if (!$order->getActualPrice()) {
$order->setPaymentStatus('accepted');
}
}
$this->redirect($this->pre_lang .'/'. $urlPrefix . 'emarket/cart/');
}
Также не надо забывать про permissions.custom.php:
$permissions = array('purchasing' => array('applyBonus'));
В xsl-шаблоне, описывающий вывод корзины, добавил следующее:
<xsl:if test="$bonus > 0">
<tr>
<td colspan="6" style="border:0;text-align:right;color:#408fd1;font-weight:bold;padding:2px 5px;">
Вы можете оплатить Ваш заказ накопленными бонусами. Доступно бонусов на <span id="bonus_available"><xsl:value-of select="$bonus" /></span> руб.
</td>
<td colspan="2" style="border:0;text-align:center;padding:2px 5px;">
<input type="text" id="bonus_amount" name="bonus" placeholder="Введите кол-во бонусов"/>
</td>
<td style="border:0">
<input type="button" id="bonus_apply" class="btn bonus_apply" value="Оплатить" />
</td>
</tr>
</xsl:if>
Далее остается только связать это дело ajax'ом:
$('#bonus_apply').live('click',function(e){
e.preventDefault();
//Вызов кастомного метода зачисления бонусов
$.ajax({
type: "POST",
url: '/emarket/applyBonus/',
data: $('#bonus_amount').serialize(),
success: function(response){
var totalPrice = $('#total_price').text().replace(/\s/g, ''),
deliveryPrice = $('#result_delivery_price').text(),
newDiscount = $(response).find('#result_discount').text().replace(/\s/g, ''),
bonusAvailable = $(response).find('#bonus_available').text(),
resultTotalPrice;
resultTotalPrice = +totalPrice + +deliveryPrice - +newDiscount;
$('#result_discount').text(newDiscount.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));
$('#result_total_price').text(String(resultTotalPrice).replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 '));
$('#bonus_available').text(bonusAvailable);
}
});
});
Также была необходимость сделать зачисление бонусов покупателю всегда от полной стоимости покупки. Изменил строчку в функции addBonus в файле emarket/__events.php, описывающий события:
$price = $order->getActualPrice();
на $price = $order->getOriginalPrice();
Понимаю, что это неправильно. Кто подскажет как это вынести в кастомный файл?