Перейти к содержимому


Редактирование покупателем своего заказа. Реализовано на Ajax.


  • Вы не можете ответить в тему
Сообщений в теме: 7

#1 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 09 January 2015 - 05:43 PM

Возможность покупателю в истории заказов изменять кол-во товара, удалять товар, отменять заказ, а также добавлять в заказ товары, используя код товара. Все это реализовано на Ajax, то есть ,без перезагрузки страницы, с уведомлением администратору о всех действиях, а также пользователю, во всплывающих сообщениях на экране. Jquery должен быть подключен.


1. Копируем файлы :

edit_order.php - в core\includes\processor
edit_order.tpl.html - в core\tpl\user\название шаблона
loading.gif - в data\название шаблона


2. В index.php строку

if ( isset ( $_GET["do"] )) {
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file" ))) {

меняем на :

if ( isset ( $_GET["do"] )) {
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file", "edit_order" ))) {


3. В order_history.php находим строки :

$smarty->assign( "order_detailed", 1 );

и после них вставляем :

$smarty->assign( "orderContent_q", count($orderContent));

4. В order_history.tpl.html :

В самом начале вставляем :


<script type="text/javascript">
{literal}

function beforeSubmit(res)
{
$(res).prepend('<div id="loader" style="position:fixed;display:none;z-index:100;"><img src="/data/{/literal}{$smarty.const.TPL}{literal}/loading.gif"></div>');
document.getElementById('loader').style.left = parseInt((document.documentElement.clientWidth-80)/2)+'px';
document.getElementById('loader').style.top = parseInt((document.documentElement.clientHeight-80)/2)+'px';
document.getElementById('loader').style.display='block';
}

function del_order(){
var order_id = $("#order_id").val();
$.ajax({
type: "POST",
url: "/index.php?do=edit_order",
cache: true,
beforeSend: beforeSubmit ('#editResult'),
data: {order_detailed : order_id, num_del_order : order_id},
error: function() {
alert('Ошибка передачи данных');
},
success: function(html) {
$("#editResult").empty();
$('#del_order_ok').fadeIn();
setTimeout(function() {
$('#del_order_ok').fadeOut();
},2000);
$("#editResult").append(html);
}
});
}

function chan_q (chan_num){
var chan_id = $("#chan_id_"+chan_num).val();
var Quantity_or = $("#Quantity_or_"+chan_num).val();
var order_id = $("#order_id").val();
if (Quantity_or < 1 || isNaN(Quantity_or)) {
alert ("Пожалуйста, укажите количество правильно") ;
return false;
}
$.ajax({
type: "POST",
url: "/index.php?do=edit_order",
cache: true,
beforeSend: beforeSubmit('#editResult'),
data: {chan_id : chan_id, Quantity_or : Quantity_or, order_detailed : order_id},
error: function() {
alert('Ошибка передачи данных');
},
success: function(html) {
$("#editResult").empty();
$('#chan_ok').fadeIn();
setTimeout(function() {
$('#chan_ok').fadeOut();
},2000);
$("#editResult").append(html);
}
});
}

function add_tovar(){
var add_id = $("#add_id").val();
var order_id = $("#order_id").val();
var quantity_add = $("#quantity_add").val();
if (add_id < 1 || isNaN(add_id) || add_id == '' ) {
alert ("Пожалуйста, укажите код товара правильно") ;
return false;
}
$.ajax({
type: "POST",
url: "/index.php?do=edit_order",
cache: true,
beforeSend: beforeSubmit('#editResult'),
data: {code_add : add_id , quantity_add : quantity_add, order_detailed : order_id},
error: function() {
alert('Ошибка передачи данных');
},
success: function(html) {
$("#editResult").empty();
$("#editResult").append(html);
$("#add_id").val('');
$("#quantity_add").val('');
if (document.getElementById('no_code').innerHTML == "") {
$('#add_ok').fadeIn();
setTimeout(function() {
$('#add_ok').fadeOut();
},2000);
}
else {
$('#add_no').fadeIn();
setTimeout(function() {
$('#add_no').fadeOut();
},2000);
}
}
});
}

function del_tovar(del_num){
var del_id = $("#del_id_"+del_num).val();
var order_id = $("#order_id").val();
$.ajax({
type: "POST",
url: "/index.php?do=edit_order",
cache: true,
beforeSend: beforeSubmit('#editResult'),
data: {del_id : del_id, order_detailed : order_id},
error: function() {
alert('Ошибка передачи данных');
},
success: function(html) {
$("#editResult").empty();
$('#del_ok').fadeIn();
setTimeout(function() {
$('#del_ok').fadeOut();
},2000);
$("#editResult").append(html);
}
});
}
{/literal}
</script>

До! первого! вхождения строки :

<div class="fil1 white"></div>

вставляем :

<input id="order_id" name="order_detailed" type="hidden" value="{$order.orderID}">
<div style="display: none;position: fixed;left: 40%;top:40%;width: 300px;height: 58px;background: none repeat scroll 0 0 #FFEBB2;
text-align: center;font-weight: bold;border: 3px solid #E48234;font-size: 13px;" id="chan_ok"><div><br>Количество товара успешно изменено</div></div>

<div style="display: none;position: fixed;left: 40%;top:40%;width: 300px;height: 58px;background: none repeat scroll 0 0 #FFEBB2;
text-align: center;font-weight: bold;border: 3px solid #E48234;font-size: 13px;" id="del_ok"><div><br>Товар успешно удален</div></div>

<div style="display: none;position: fixed;left: 40%;top:40%;width: 300px;height: 58px;background: none repeat scroll 0 0 #FFEBB2;
text-align: center;font-weight: bold;border: 3px solid #E48234;font-size: 13px;" id="add_ok"><div><br>Товар успешно добавлен</div></div>

<div style="display: none;position: fixed;left: 40%;top:40%;width: 300px;height: 58px;background: none repeat scroll 0 0 #FFEBB2;
text-align: center;font-weight: bold;border: 3px solid #E48234;font-size: 13px;" id="add_no"><div><br>Товар не найден или отсутствует в продаже</div></div>

Строку :

<td class="padt" align="left" valign="middle">{$orderContent[i].Quantity}</td>

меняем на :

<td class="padt" align="left" valign="middle">
{if $order.statusID != "5" and $order.statusID != "1"}
<input style="width:25px;text-align:center" id="Quantity_or_{$smarty.section.i.index}" name="Quantity_or" type="text" value="{$orderContent[i].Quantity}" onchange="chan_q('{$smarty.section.i.index}'); return false">
<input id="chan_id_{$smarty.section.i.index}" name="chan_id" type="hidden" value="{$orderContent[i].name}">
{else}{$orderContent[i].Quantity}{/if}
</td>

Находим строку :

<td class="hmin" align="left">

Чуть выше нее (тэг начала таблицы для этой ячейки) строку

<table cellspacing="0" cellpadding="0" width="100%">

меняем на :

<table id="editResult" cellspacing="0" cellpadding="0" width="100%">


Находим строку :

<td class="padt" align="left" valign="middle" nowrap="nowrap">{$orderContent[i].PriceToShow}</td>

после нее вставляем :

{if $order.statusID != "5" and $order.statusID != "1" and $orderContent_q > 1}
<td align="center">
<input id="del_id_{$smarty.section.i.index}" name="del_id_{$smarty.section.i.index}" type="hidden" value="{$orderContent[i].name}">
<a onclick="del_tovar('{$smarty.section.i.index}');return false;" style="cursor:pointer">X</a>
</td>{/if}

Находим строку :

<td class="lt pad" align="left" valign="middle">{$smarty.const.TABLE_PRODUCT_COST_WITHOUT_TAX}</td>

Вместо нее вставляем :

<td class="lt pad" align="left" valign="middle" {if $order.statusID != "5" and $order.statusID != "1" and $orderContent_q > 1} colspan="2"{/if}>{$smarty.const.TABLE_PRODUCT_COST_WITHOUT_TAX}</td>

Находим строку :

<td class="padt" align="right" valign="middle" colspan="2">{$smarty.const.STRING_PRED_TOTAL}:</td>

Вместо нее вставляем :

<td class="padt" align="right" valign="middle" {if $order.statusID != "5" and $order.statusID != "1" and $orderContent_q > 1}colspan="3"{else}colspan="2"{/if}>{$smarty.const.STRING_PRED_TOTAL}:</td>

Находим строку :

<td class="padt" align="right" valign="middle" colspan="2">{$smarty.const.ADMIN_DISCOUNT} {$order.order_discount}%:</td>

Вместо нее вставляем :

<td class="padt" align="right" valign="middle" {if $order.statusID != "5" and $order.statusID != "1" and $orderContent_q > 1}colspan="3"{else}colspan="2"{/if}>{$smarty.const.ADMIN_DISCOUNT} {$order.order_discount}%:</td>

Находим строку :

<td class="padt" align="right" valign="middle" colspan="2">{$smarty.const.ADMIN_SHIPPING_COST}:</td>

Вместо нее вставляем :

<td class="padt" align="right" valign="middle" {if $order.statusID != "5" and $order.statusID != "1" and $orderContent_q > 1}colspan="3"{else}colspan="2"{/if}>{$smarty.const.ADMIN_SHIPPING_COST}:</td>

Находим строку :

<td class="padt cl12" align="right" valign="middle" colspan="2">{$smarty.const.TABLE_TOTAL}:</td>

Вместо нее вставляем :

<td class="padt cl12" align="right" valign="middle" {if $order.statusID != "5" and $order.statusID != "1" and $orderContent_q > 1}colspan="3"{else}colspan="2"{/if}>{$smarty.const.TABLE_TOTAL}:</td>

Находим строку :

{if $order_status_report}

Перед ней вставляем :

{if $order.statusID != "5" and $order.statusID != "1"}
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="cbt" align="left"><b>Действия над заказом</b></td>
</tr>
</table>
<table cellspacing="1" cellpadding="10" width="100%" class="gre">
<tr>
<td align="center"><input type="button" onclick="add_tovar();return false;" value="Добавить товар к заказу"></td>
<td align="center"><input id="add_id" type="text" class="input_style" placeholder="Введите код товара" name="code_add"></td>
<td align="center"><input id="quantity_add" type="text" class="input_style" placeholder="Введите количество" name="quantity_add">
</td>
</tr>
<tr><td align="center">
<br>
<input type="button" onclick="del_order();return false;" value="Отменить заказ"></td><td></td><td></td></tr>
</table>
{/if}

Условия :

{if $order.statusID != "5" and $order.statusID != "1"}

подразумевают, что покупатель не может редактировать заказ, если он Выполнен, или Отменен. Кому это не нужно, или у кого статусы заказов другие, можно это убрать или изменить.

Прикрепленные файлы

  • Прикрепленный файл  edit_order.php   6.54К   8 Количество загрузок:
  • Прикрепленный файл  edit_order.tpl.html   5.98К   6 Количество загрузок:
  • Прикрепленный файл  loading.gif   17.29К   14 Количество загрузок:

  • 0

#2 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 21 November 2015 - 06:41 AM

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

#3 ssergioss25

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 56 сообщений
Репутация: 24
Ассистент
  • ГородСПБ

Отправлено 24 November 2015 - 05:30 PM

Значит, что либо делаете не по инструкции, либо у вас уже есть какие либо изменения в шаблоне. Модуль рабочий 100%. Проверял на чистом дефолтовом шаблоне. Раз перезагружает страницу,я бы,наверное,начал бы с проверки того,что у вас именно происходит по онклик (onclick="...), вызываются ли соответствующие функции.
  • 0

#4 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 24 November 2015 - 08:02 PM

Со всякими яваскриптами (AJAX-ами, JQuery и прочим) мне очень помогает плагин firebug для FireFox. Это такой очень удобный дебаггер, который более-менее понятен даже не особенно опытному программисту, т.к. сразу после установки УЖЕ дает какую-то информацию о происходящем и ошибках, если они есть.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#5 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 26 November 2015 - 08:58 PM

еще раз перепроверил, все ок работает видимо где то ошибку допускал
  • 0

#6 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 26 February 2016 - 08:46 PM

еще появился вопрос по модулю при удалении товара при редактировании у меня не возвращает удаленный товар обратно на склад при учете склада, это модуль так написан или у меня где то баг.
Разобрался у модуля действительно нет функции добавления товара обратно на склад, а это штатно предусмотрено, просто при учете товаров на складе это не разбериха будет.
  • 0

#7 kery

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 134 сообщений
Репутация: 17
Начинающий

Отправлено 05 March 2016 - 09:28 PM

разбираюсь с этим модулем, потихоньку его переписываю т.к. модуль практически не рабочий, не считая что нет учета склада, при добавлении товара этот товар уже не удалить из заказа т.к. в базу заносится неверное название, и если название содержит кавычки или другие символы то товар просто потом не находится по полю name
WHERE name LIKE '%".$add2['name']."%'

  • 0

#8 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 06 March 2016 - 11:55 AM

если название содержит кавычки или другие символы то товар просто потом не находится по полю name


WHERE name LIKE '%".xToText($add2['name'])."%'

  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)