Как покупателю отклонить свой заказ — различия между версиями
Mad grant (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 23: | Строка 23: | ||
Для применения этого макроса скопируйте код макроса в файл /classes/modules/emarket/__custom.php. | Для применения этого макроса скопируйте код макроса в файл /classes/modules/emarket/__custom.php. | ||
+ | |||
+ | == Примечание == | ||
+ | |||
+ | Макрос меняет статусы только у заказов статусы которых нет: | ||
+ | |||
+ | <ul> | ||
+ | <li>Готов</li> | ||
+ | <li>Отклонен</li> | ||
+ | <li>Отменен</li> | ||
+ | <li>Отклонен покупателем</li> | ||
+ | </ul> | ||
+ | |||
+ | Отменить заказ сможет только тот пользователь, который его сделал. | ||
== Код макроса == | == Код макроса == | ||
Строка 33: | Строка 46: | ||
$o_coll = umiObjectsCollection::getInstance(); | $o_coll = umiObjectsCollection::getInstance(); | ||
if(!$id || !$o_coll->getObject($id)){ | if(!$id || !$o_coll->getObject($id)){ | ||
− | return $result = array('error' => 'Передан неверный | + | return $result = array('error' => 'Передан неверный идентификатор заказа'); |
} | } | ||
$order = order::get($id); | $order = order::get($id); | ||
Строка 77: | Строка 90: | ||
} | } | ||
</source> | </source> | ||
+ | '''Не забудьте добавить метод в permissions.custom.php''' | ||
Теперь перейдем к шаблону, откроем файл /templates/demodizzy/xslt/modules/emarket/orders-list.xsl и внутри <xsl:template match="udata[@method = 'ordersList']"> | Теперь перейдем к шаблону, откроем файл /templates/demodizzy/xslt/modules/emarket/orders-list.xsl и внутри <xsl:template match="udata[@method = 'ordersList']"> | ||
Строка 163: | Строка 177: | ||
<source lang="html4strict"> | <source lang="html4strict"> | ||
<strong id="status%id%"> | <strong id="status%id%"> | ||
− | |||
− | |||
</source> | </source> | ||
Текущая версия на 11:01, 24 апреля 2014
Актуально для версии 2.9.6
Содержание
Задача
Если Вы хотите дать покупателю возможность отклонить заказа через свой личный кабинет, то Вам придется писать кастомный макрос(ы), так как системного макроса нет. Пример макроса даем ниже.
Решение
Сначала создадим в справочнике "статус заказа" еще один элемент:
Теперь перейдем к макросу:
%emarket cancelOrder()% — меняет статус заказа на "Отклонен покупателем".
Параметры: emarket cancelOrder($id = false)
$id
Идентификатор заказа, который требуется отклонить.
Для применения этого макроса скопируйте код макроса в файл /classes/modules/emarket/__custom.php.
Примечание
Макрос меняет статусы только у заказов статусы которых нет:
- Готов
- Отклонен
- Отменен
- Отклонен покупателем
Отменить заказ сможет только тот пользователь, который его сделал.
Код макроса
public function cancelOrder($id = false){
if($id == false){
$id = getRequest('id');
}
$o_coll = umiObjectsCollection::getInstance();
if(!$id || !$o_coll->getObject($id)){
return $result = array('error' => 'Передан неверный идентификатор заказа');
}
$order = order::get($id);
$status_id = $order->getOrderStatus();
$status = $order->getCodeByStatus($status_id);
if($status == 'ready' || $status == 'canceled' || $status == 'rejected' || $status == 'canceled_by_customer'){
return $result = array('error' => 'У данного заказа уже нельзя поменять статус');
}
$order_cust_id = intval($order->getCustomerId());
$current_cust_id = intval(customer::get(true)->getId());
if($order_cust_id !== $current_cust_id){
return $result = array('error' => 'У Вас нет прав на смену статуса этого заказа');
}
$cancel_order_status_id = order::getStatusByCode('canceled_by_customer');
$order->setOrderStatus($cancel_order_status_id);
return $result = array('success' => 'Заказ был отклонен');
}
Не забудьте добавить метод в permissions.custom.php
Применение
Как Вы наверно уже догадались, макрос написан для обращению к нему с помощью ajax. В качестве примера, мы его применим на demodizzy. Также, нам бы хотелось, чтобы изменение статуса сразу отображалось на странице, для этого добавим еще один макрос в файл /classes/modules/emarket/__custom.php, к нему мы будем обращаться ajax'ом за получением статуса.
Код макроса
public function getOrderStatus($id = false){
if($id == false){
$id = getRequest('id');
}
$o_coll = umiObjectsCollection::getInstance();
if(!$id || !$o_coll->getObject($id)){
return $result = array('error' => 'bad_id');
}
$order = order::get($id);
$status_id = $order->getOrderStatus();
$status_object = $o_coll->getObject($status_id);
$status = $status_object->getName();
return $result = array('status' => $status);
}
Не забудьте добавить метод в permissions.custom.php
Теперь перейдем к шаблону, откроем файл /templates/demodizzy/xslt/modules/emarket/orders-list.xsl и внутри <xsl:template match="udata[@method = 'ordersList']"> добавим следующий код:
<script type="text/javascript" charset="utf-8">
function cancel_order($id){
$.ajax({
type: "POST",
url: "/udata://emarket/cancelOrder/.json",
dataType: "json",
data: {
id: $id,
}
}).done(function(json) {
if(json.error){
alert(json.error);
}else{
alert(json.success);
$.ajax({
type: "POST",
url: "/udata://emarket/getOrderStatus/.json",
dataType: "json",
data: {
id: $id,
}
}).done(function(json) {
$sel = '#status' + $id;
$($sel).html("");
$($sel).append(json.status);
});
}
});
}
</script>
Также, поменяем вызов статуса заказа с
<xsl:value-of select="status/@name" />
на
<strong id="{concat('status', ./@id)}">
<xsl:value-of select="status/@name" />
</strong>
а после
<xsl:apply-templates select="summary/price" mode="discounted-price"/>
добавим:
<xsl:text> </xsl:text>
<strong onclick="cancel_order({./@id})" style="cursor: pointer">Отменить</strong>
Результат
Теперь в личном кабинете пользователь сможет отменить заказ:
А Вы увидите это в модуле "Интернет магазин":
Если у Вас tpl...
То решение Вам тоже подойдет, только передавать id заказа в cancel_order и задавать id у статуса нужно будет по другому.
id у статуса можно будет указать так:
<strong id="status%id%">
а передавать id заказа так:
<strong onclick="cancel_order(%id%)" style="cursor: pointer">Отменить</strong>
Применять решение можно будет в шаблоне для макроса %emarket ordersList()%, в блоке ['orders_item'].