function ordMoveOrder($orderID, $toCustomerID){
$q = db_query("select customerID from ".ORDERS_TABLE." where orderID=".(int)$orderID);
if($row = db_fetch_row($q) && ($row[0] <> (int)$toCustomerID)){ // if exists order with this ID and it's not the same as dest customerID
$q1 = db_query("select c.first_name, c.last_name, c.email, ca.city, ca.address, cn.country_name, zn.zone_name from ".CUSTOMERS_TABLE." c ".
"join ".CUSTOMER_ADDRESSES_TABLE." ca on ca.customerID=c.customerID and ca.addressID=c.addressID ".
"join ".COUNTRIES_TABLE." cn on cn.countryID=ca.countryID ".
"join ".ZONES_TABLE." zn on zn.zoneID=ca.zoneID ".
"where c.customerID=".(int)$toCustomerID
);
// get data about current customer
if($row1 = db_fetch_row($q1)){
db_query("update ".ORDERS_TABLE." set ".
"customerID=".(int)$toCustomerID.", ".
"customer_firstname='".$row1[0]."', ".
"customer_lastname='".$row1[1]."', ".
"customer_email='".$row1[2]."', ".
"shipping_firstname='".$row1[0]."', ".
"shipping_lastname='".$row1[1]."', ".
"shipping_country='".$row1[5]."', ".
"shipping_state='".$row1[6]."', ".
"shipping_city='".$row1[3]."', ".
"shipping_address='".$row1[4]."', ".
"billing_firstname='".$row1[0]."', ".
"billing_lastname='".$row1[1]."', ".
"billing_country='".$row1[5]."', ".
"billing_state='".$row1[6]."', ".
"billing_city='".$row1[3]."', ".
"billing_address='".$row1[4]."' ".
"where orderID=".(int)$orderID
);
}
}
}
#1
Отправлено 01 October 2012 - 01:37 PM
#2
Отправлено 12 October 2012 - 02:49 PM
Предлагаю готовое решение с использованием данной функции.
Проверено на ShopCMS 3.1.2.
1) Открываем файл core/functions/order_functions.php и добавляем в конце перед строкой
?>новую функцию:
// ***************************************************************************** // Purpose move order to customer // Inputs // Remarks vsupport.club (by Juggler) // Returns function ordMoveOrder($orderID, $toCustomerID) { $q = db_query("select customerID FROM ".ORDERS_TABLE." WHERE orderID=".(int)$orderID); // if exists order with this ID and it's not the same as dest customerID if($row = db_fetch_row($q) && ($row[0] <> (int)$toCustomerID)) { $q1 = db_query("select c.first_name, c.last_name, c.Email, ca.city, ca.address, cn.country_name, zn.zone_name from ".CUSTOMERS_TABLE." AS c INNER JOIN ".CUSTOMER_ADDRESSES_TABLE." AS ca on (ca.customerID=c.customerID AND ca.addressID=c.addressID) INNER JOIN ".COUNTRIES_TABLE." AS cn on (cn.countryID=ca.countryID) INNER JOIN ".ZONES_TABLE." zn on zn.zoneID=ca.zoneID WHERE c.customerID=".(int)$toCustomerID); // get data about current customer if($row1 = db_fetch_row($q1)) { db_query("update ".ORDERS_TABLE." set ". "customerID=".(int)$toCustomerID.", ". "customer_firstname='".$row1[0]."', ". "customer_lastname='".$row1[1]."', ". "customer_email='".$row1[2]."', ". "shipping_firstname='".$row1[0]."', ". "shipping_lastname='".$row1[1]."', ". "shipping_country='".$row1[5]."', ". "shipping_state='".$row1[6]."', ". "shipping_city='".$row1[3]."', ". "shipping_address='".$row1[4]."', ". "billing_firstname='".$row1[0]."', ". "billing_lastname='".$row1[1]."', ". "billing_country='".$row1[5]."', ". "billing_state='".$row1[6]."', ". "billing_city='".$row1[3]."', ". "billing_address='".$row1[4]."' ". "WHERE orderID=".(int)$orderID); } return 1; } return 0; }
2) Открываем файл core/includes/admin/sub/custord_custlist.php и находим строку:
$navigatorHtml = GetNavigatorHtml( _getUrlToNavigate_ORDER_HISTORY(), 20,'ordGetOrders', $callBackParam, $orders, $offset, $count );
После нее вставляем следующий код:
if (isset($_POST["move_order"])) { $move_result = ordMoveOrder($_POST["move_order"], $_GET["customerID"]); if ((int)$move_result == 1) { Redirect(ADMIN_FILE."?dpt=custord&sub=custlist&customer_details=contact_info&customerID= ".$_GET["customerID"]."&encodedReturnUrl=".$_GET["encodedReturnUrl"]."" ); } else {$smarty->assign( "move_result", "Заказ не найден!" );} }
3) В файле core/tpl/admin/admin_order_history.tpl.html в конце кода добавляем следующее:
<form action="{$smarty.const.ADMIN_FILE}" method=post> <table class="adn"><tr><td class="se6"></td></tr></table> <table class="adn"> <tr class="lineb"> <td align="left">Переместить заказ от другого покупателя</td> </tr> <tr class="lins"> <td>Номер заказа: <input type="text" name="move_order" class="textp" size="15">{if $move_result} {$move_result}{/if}</td> </tr> </table> <table class="adn"><tr><td class="separ"><img src="data/admin/pixel.gif" alt="" class="sep"></td></tr><tr><td class="se5"></td></tr></table> <input type="submit"/> <table class="adn"><tr><td class="se6"></td></tr></table> </form>
Готово!
Прикрепленные файлы
#3
Отправлено 16 October 2012 - 10:08 PM
{if $customer_details == 'order_history'} {if $orders} <form action='{$urlToSubmit}' method=POST> {include file='admin/admin_order_history.tpl.html'} </form> {else} < {$smarty.const.ADMIN_NO_RECORD_FOUND} > {/if} {/if}
Добавить следующий код
{if $customer_details == 'order_history'} {if $orders} <form action='{$urlToSubmit}' method=POST> {include file='admin/admin_order_history.tpl.html'} </form> {else} < {$smarty.const.ADMIN_NO_RECORD_FOUND} > <form action='{$urlToSubmit}' method=POST> <table class="adn"><tr><td class="se6"></td></tr></table> <table class="adn"> <tr class="lineb"><td align="left">Переместить заказ от другого покупателя</td></tr> <tr class="lins"><td>Номер заказа: <input type="text" name="move_order" class="textp" size="15"> {if $move_result} {$move_result}{/if}</td></tr> </table> <table class="adn"> <tr><td class="separ"><img src="data/admin/pixel.gif" alt="" class="sep"></td></tr> <tr><td class="se5"></td></tr> </table> <input type="submit"/> <table class="adn"><tr><td class="se6"></td></tr></table> </form> {/if} {/if}
#4
Отправлено 17 October 2012 - 10:28 AM
#5
Отправлено 17 October 2012 - 11:02 AM
Удобнее таки не номер вводить для "забираемого" чужого заказа, а выпадающий список "Номер заказа/логин клиента" с сортировкой по логину.
Согласен. Это усложняет задачу в плане программирования. Буду рад если поможете это сделать.
#6
Отправлено 18 October 2012 - 11:03 AM
Чтобы можно было в данный заказ добавить все позиции из другого? Или может кто-нибудь уже писал инспектирующий скрипт для поиска дублирующихся записей по ФИО, e-mail или контактным телефонам? Ну и само собой чтобы можно было все записи объединить в одну, а клиенту выслать уведомление на e-mail к примеру?
#7
Отправлено 18 October 2012 - 01:45 PM
Если уж дорабатывать, то сторонний модуль администрирования заказов. Там изначально фишек больше.Вопрос, можно доработать это дело?
#8
Отправлено 18 October 2012 - 02:11 PM
Нет, только администратор. Все операции производятся в админ панели. Но не только под себя. Любой заказ под любой аккаунт.А я правильно понимаю, что любой зарегистрованный покупатель в личном кабинете сможет перетащить любой чужой заказ под себя?
Что касается именно данной задачи (перемещения заказов), не вижу необходимости в стороннем модуле.Если уж дорабатывать, то сторонний модуль администрирования заказов. Там изначально фишек больше.
Есть идея сделать перемещение заказа по-другому. Так, как это реализовано в shop-script. В режиме администрирования, в открытом заказе добавляем кнопку (Передать заказ). При нажатии появляется строка одновременного поиска покупателя по имени, фамилии и e-mail в модальном окне, с выпадающим списком результатов "живого" поиска. Как по мне это идеал.
#9
Отправлено 18 October 2012 - 02:44 PM
А! Дошло! Это не из личного кабинета делается, а из админки "Списки/Покупатели".Нет, только администратор. Все операции производятся в админ панели.
#10
Отправлено 18 October 2012 - 07:11 PM
Согласен. Это усложняет задачу в плане программирования. Буду рад если поможете это сделать.
{if $customer_details == 'order_history'}
{if $orders}
<form action='{$urlToSubmit}' method=POST>
{include file='admin/admin_order_history.tpl.html'}
</form>
{else}
< {$smarty.const.ADMIN_NO_RECORD_FOUND} >
{/if}
{*-----BEGIN OrderMove------------------*}
{php}
$data = mysql_query("
SELECT orderID, IFNULL(login,'Unregistered') AS login, IFNULL(first_name,customer_firstname) AS first, IFNULL(last_name,customer_lastname) AS last
FROM ".ORDERS_TABLE."
LEFT JOIN ".CUSTOMERS_TABLE." USING (customerID)
ORDER BY customerID,orderID");
while ($row = mysql_fetch_assoc($data)) $r[] = $row;
$this->assign("orders_list", $r);
{/php}
<form action='{$urlToSubmit}' method=POST>
<table class="adn"><tr><td class="se6"></td></tr></table>
<table class="adn">
<tr class="lineb"><td align="left">Переместить заказ от другого покупателя</td></tr>
<tr class="lins"><td>Номер заказа:
<select name="move_order">
<option value='0'>Select Order</option>
{section name=i loop=$orders_list}
<option value='{$orders_list[i].orderID}'>#{$orders_list[i].orderID} {$orders_list[i].login} ({$orders_list[i].first} {$orders_list[i].last})</option>
{/section}
</select>
{if $move_result} {$move_result}{/if}</td></tr>
</table>
<table class="adn">
<tr><td class="separ"><img src="data/admin/pixel.gif" alt="" class="sep"></td></tr>
<tr><td class="se5"></td></tr>
</table>
<input type="submit"/>
<table class="adn"><tr><td class="se6"></td></tr></table>
</form>
{*-----END OrderMove---------------------*}
{/if}
Ну и в редиректе (в custord_custlist.php) логично бы заменить
&customer_details=contact_info
на
&customer_details=order_history
ведь куда удобнее после перемещения заказа остаться на странице со списком заказов.
#12
Отправлено 18 October 2012 - 07:59 PM
Итить... А я для кого SELECT прямо в шаблон вставил - редактируй-не-хочу? Понятно, что при большом количестве заказов как-то надо делать выборку. Например, по дате (за последнюю неделю, месяц, день) или еще как-то сужать выборку. Рыба есть, вот каждый сам себе и делает. Думаю, не особо сложно исхитрить (изврат, конечно) и ввод номера в том же селекте (т.е. не только выбирать из выпадающего списка, но и просто ввести номер, как было изначально).Не очень удобно, когда 2 тысячи заказов.
PS. И таки да, когда Вы просили "можете помочь?" - не догадывались, что у Вас на сайте 2тыс ордеров?
#13
Отправлено 19 October 2012 - 06:44 PM
#14
Отправлено 19 October 2012 - 08:58 PM
Кстати, я тут задумался - а ведь совершенно никаких проблем сделать на ajax двухступенчатую выборку забираемого заказа. Сначала выбираем селектом пользователя, у которого хотим забрать заказ, а затем вторым селектом заказ из списка заказов этого пользователя.
Чесно говоря тема с селектами мне не очень нравится. Логичнее делать передачу заказа не в карточке покупателя, а в редактировании заказа. И там в модальном окне делать "живой поиск" по логину, имени, e-mail. Так сделано в WebAsyst Shop-Script. Очень удобно. Посмотрите скриншот.
Прикрепленные файлы
#15
Отправлено 19 October 2012 - 09:06 PM
А где в ShopCMS штатное редактирование заказа?Логичнее делать передачу заказа не в карточке покупателя, а в редактировании заказа.
#16
Отправлено 19 October 2012 - 09:39 PM
А где в ShopCMS штатное редактирование заказа?
Я имел ввиду Справочник заказов / открытый заказ.
www.yourshop.com/admin.php?dpt=custord&sub=new_orders&orders_detailed=yes&orderID=
В штатном варианте, там нет редактирования, но у меня есть
#17
Отправлено 19 October 2012 - 10:12 PM
Это я тихой сапой подвожу под мысль, что штатно в ShopCMS ничего нет, а если уж редактировать, то сторонний модуль. Хотя, конечно, зависит от масштабов редактирования.В штатном варианте, там нет редактирования, но у меня есть
#18
Отправлено 20 October 2012 - 12:46 AM
Прикрепленные файлы
#19
Отправлено 20 October 2012 - 01:22 PM
#20
Отправлено 20 October 2012 - 02:05 PM
AJAX - не окна . И он в данном случае не нужен, т.к. нет последовательно выбираемых селектов, где содержимое следующего зависит от выбора в предыдущем. Все делается абсолютно аналогично тому, как я сделал "забирание" ордера селектом, только выборку надо делать не по таблице ордеров, связанной с таблицей клиентов, а просто по таблице клиентов.может поможете довести дело до конца? Я не работал с ajax окнами.