Для проекта потребовалось редактировать сумму заказа после размещения в корзине - предоставление скидок, без выдачи купонов.
Количество и сумма хранятся в БД:
#_k2store_orders - Общая информация о заказе и клиенте
#_k2store_orderitems - Состав заказа, сумма за единицу и кол-во
Нам необходимо на форме с деталями заказа разместить элементы редактирования и сделать процедуру сохранения изменений в двух таблицах.
Открываем файл
administrator/components/com_k2store/views/orders/tmpl/view.php
Обновляем строку с кол-вом, заменить
<?php echo $item->orderitem_quantity; ?>
На это
<input type="number" min="0" max="999" id="quant-<?php echo $item->orderitem_id;?>" style="width: 80px;border: 0;" value="<?php echo $item->orderitem_quantity; ?>" onchange="document.getElementById('div-<?php echo $item->orderitem_id;?>').style.display='';document.getElementById('quant-<?php echo $item->orderitem_id;?>').style.backgroundColor='#FFA9A9';">
И размещаем элемент с кнопкой "Сохранить":
<div style="display:none;position: relative;float: right;top: 8px;" id="div-<?php echo $item->orderitem_id;?>" >
<a style="top: -4px;position: relative;" href="#" class="btn_ex_save" id="exs-<?php echo $item->orderitem_id;?>">
<img src="/images/save.gif" />
</a>
</div>
Картинку можно взять с этого материала:
Добавляем скрипт, который отслеживает нажатие кнопки:
<script>
//изменить кол-во
jQuery("body").on("click", ".btn_ex_save", function(e) {
e.preventDefault();
//ищем ID в БД
var clickedID = this.id.split("-");
var DbNumberID = clickedID[1];
//данные для отправки POST запросом
var myData = 'recordToEx='+DbNumberID+'&quant='+document.getElementById('quant-'+DbNumberID).value+'&order=<?php echo $invoice_number;?>';
jQuery.ajax({
type: "POST",
url: "index.php?option=com_k2store&view=orders&task=view&id=<?php echo $invoice_number;?>",//ссылка на текущую страницу
dataType:"text",
data:myData,
success:function(response){
document.getElementById('div-'+DbNumberID).style.display = 'none';
document.getElementById('quant-'+DbNumberID).style.backgroundColor = 'white';
var mas = response.split(';;');
jQuery('#summ-'+DbNumberID).html(mas[0]);
jQuery('#sum-'+DbNumberID).html(mas[0]);
jQuery('#sub_summ').html(mas[1]);
jQuery('#total_summ').html(mas[1]);
},
error:function (xhr, ajaxOptions, thrownError){alert(thrownError);}
});
});
</script>
Далее размещаем обработку POST запроса, для этого редактируем страницу(необходима первая в очереди на загрузку):
administrator/components/com_k2store/views/orders/view.html.php
Добавляем обработку запроса:
if(isset($_POST["recordToEx"])){
$idToUpd = str_replace('-','',filter_var($_POST["recordToEx"],FILTER_SANITIZE_NUMBER_INT));
if (isset($_POST["quant"])) $quant = filter_var($_POST["quant"],FILTER_SANITIZE_STRING); else $quant='';
if (isset($_POST["order"]))$order = filter_var($_POST["order"],FILTER_SANITIZE_STRING); else $order='';
//обновляем кол-во
if (trim($quant) != '' and trim($order) != '')
{
$db = JFactory::getDbo();
$query =htmlspecialchars("update #__k2store_orderitems set orderitem_quantity ='".$quant."' where orderitem_id='".$idToUpd."'");
$db->setQuery($query);
if(!$db->query())
{
header('HTTP/1.1 500 '.JText::_("Ошибка ID = '".$idToUpd."' '".$db->stderr()));
exit();
}
}
//выводим сумму позиции после обновления
$query =htmlspecialchars("update #__k2store_orderitems set orderitem_final_price = (orderitem_price+ orderitem_attributes_price)*orderitem_quantity where orderitem_id='".$idToUpd."'");
$db->setQuery($query);
if(!$db->query())
{
header('HTTP/1.1 500 '.JText::_("Ошибка ID = '".$idToUpd."' '".$db->stderr()));
exit();
}
$query =htmlspecialchars("(select ROUND(sum(orderitem_final_price)) as total_summ,(select ROUND(orderitem_final_price) from #__k2store_orderitems where orderitem_id='".$idToUpd."') as summ_item from #__k2store_orderitems where order_id = (select order_id from #__k2store_orderitems where orderitem_id='".$idToUpd."'))");
$db->setQuery($query);
$res = $db->loadObject();
echo str_replace('.00000','.00 руб.',$res->summ_item).';;'.str_replace('.00000','.00 руб.',$res->total_summ);
//подсчитываем сумму общего заказа
$query =htmlspecialchars("update #__k2store_orders set is_editing='1',orderpayment_amount ='".$res->total_summ."',order_total ='".$res->total_summ."',order_subtotal ='".$res->total_summ."' where id ='".$order."'");
$db->setQuery($query);
if(!$db->query())
{
header('HTTP/1.1 500 '.JText::_("Ошибка ID = '".$idToUpd."' '".$db->stderr()));
exit();
}
exit();
}
После выполнения запроса на форме обновиться сумму единицы и общая сумма заказа.
Также запрос оставляет пометку о том. что было ручное редактирование, для этого необходимо добавить поле в таблицу
ALTERTABLE #__k2store_orders ADDCOLUMN is_editing int(1) AFTER #__k2store_orders;
Обработку этого значения разместим в файле с общим списком заказов, редактируем файл:
administrator/components/com_k2store/views/orders/tmpl/default.php
Заменить текст:
<td>
<span class="editlinktip hasTip" title="<?php echo JText::_( 'K2STORE_ORDER_VIEW' );?>::<?php echo $this->escape($row->order_id); ?>">
На
<td <?php if ($row->is_editing == 1) echo 'style="background-color: #FFFFC9;"'?>>
<span class="editlinktip hasTip" title="<?php echo JText::_( 'K2STORE_ORDER_VIEW' );?>::<?php echo $this->escape($row->order_id); ?>">
Таким же образом можно редактировать стоимость позиции и стоимость опций, добавить скидку(изменение стоимости позиции и опции на определенный процент).
Результат: