Списание со складов — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
Строка 1: Строка 1:
<b style="color: red">не актуально для версии 2.9</b>
+
'''Актуально для версии 2.9.1'''<br><br>
 +
В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обрабатывающим заказ. В этой статье мы добавим данным параметрам функциональности и организуем списание со склада.<br><br>
  
В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обрабатывающим заказ. В этой статье мы добавим данным параметрам функциональности и организуем списание со складов.
+
'''Задача:''' Реализовать функционал автоматического списания или возврата товара со склада.<br><br>
 
+
'''Условия работы макроса:'''
За основу возмём оригинальный метод order_edit, который выполняется при редактировании заказа. Поместим его в файл __custom_adm.php модуля emarket и переименуем, например в order_edit_custom.
+
<ol>
Добавляем свой код, который будет производить взаимодействие со складами, листинг метода будет выглядеть примерно следующим образом:
+
<li>В модуле "Шаблоны данных" в типе данных "Заказ" должно присутствовать поле типа "Кнопка-флажок" с идентификатором ''current_mode''</li>
 +
<li>В модуле "Шаблоны данных" в типе данных "Объекты каталога" должно присутствовать поле типа "Составное" с идентификатором ''stores_state'' ("Состояние на складах")</li>
 +
</ol>
 +
<br>
 +
'''Реализация:''' Напишем обработчик события для точки вызова systemModifyObject, которое вызывается при сохранении объекта в административной панели. Вся логика списания или возврата будет находиться в обработчике события. Списание происходит, если статус заказа был изменен на "Готов" (статус 'ready'); возврат товара со склада, если статус заказа был изменен на "Отменен" (статус 'canceled').<br>
 +
В директорию classes\modules\emarket\ добавим файл с названием custom_events.php и содержанием:
 
<source lang="php">
 
<source lang="php">
public function order_edit_custom() {
+
<?php
$object = $this->expectObject("param0", true);
+
    new umiEventListener("systemModifyObject", "emarket", "storesReact");
$mode = (string) getRequest('param1');
 
$objectId = $object->getId();
 
$this->setHeaderLabel("header-users-edit-" . $this->getObjectTypeMethod($object));
 
$this->checkSv($objectId);
 
$inputData = Array( "object" => $object,
 
"allowed-element-types" => Array('emarket', 'order')
 
);
 
if($mode == "do") {
 
$oldDeliveryPrice = $object->getValue('delivery_price');
 
 
 
//----------Наш код--------------------------------------------------------------------------
 
$old_state=$object->getValue('status_id');
 
$new_state=getRequest('data');
 
$new_state=$new_state[$objectId]['status_id'];
 
if(($new_state!=$old_state)&&(($new_state==91)||($new_state==85))){
 
$items=$object->getValue('order_items');
 
$items_count=count($items);
 
$objectsCollection = umiObjectsCollection::getInstance();
 
$hierarchy = umiHierarchy::getInstance();
 
$variablja=Array();
 
$var_arr=Array();
 
for($i=0;$i<$items_count;$i++){
 
$item=$objectsCollection ->getObject($items[$i]);
 
$amo=$item->item_amount;
 
$link_from_item_to_catalog=$item->getValue('item_link');
 
$link_to_catalog=$link_from_item_to_catalog[0];
 
$id_tovara=$link_to_catalog->id;
 
$page_in_catalog = $hierarchy->getElement($id_tovara);
 
$store=$page_in_catalog->getValue('stores_state');
 
$item_options=$item->getValue('options');
 
$store_location='';
 
$tempo=count($item_options);
 
for($j=0;$j<$tempo;$j++){
 
if($item_options[$j]['varchar']=="stores_state"){
 
$store_location=$item_options[$j]['rel'];
 
}
 
}
 
for($j=0;$j<$tempo;$j++){
 
if($store_location==$store[$j]['rel']){
 
if($new_state==91){
 
$store[$j]['int']-=$amo;
 
settype($store[$j]['int'], "string");
 
}else{
 
$store[$j]['int']+=$amo;
 
}
 
}
 
}
 
$page_in_catalog->setValue('stores_state',$store);
 
$page_in_catalog->commit();
 
}
 
}
 
//==========================================================================================
 
$object = $this->saveEditedObjectData($inputData);
 
 
$newDeliveryPrice = $object->getValue('delivery_price');
 
 
$order = order::get($object->id);
 
 
$amounts = getRequest('order-amount-item');
 
$dels = getRequest('order-del-item');
 
 
$isChanged = false;
 
if(is_array($amounts)) foreach($amounts as $itemId => $amount) {
 
$item = $order->getItem($itemId);
 
if($item instanceof orderItem) {
 
if($item->getAmount() != $amount) {
 
$item->setAmount($amount);
 
$item->commit();
 
$isChanged = true;
 
}
 
}
 
}
 
 
if(is_array($dels)) foreach($dels as $itemId) {
 
$item = orderItem::get($itemId);
 
if($item instanceof orderItem) {
 
$order->removeItem($item);
 
$isChanged = true;
 
}
 
}
 
 
if($isChanged) {
 
$order->refresh();
 
$order->commit();
 
}
 
 
if ($oldDeliveryPrice != $newDeliveryPrice && !$isChanged) {
 
$originalPrice = $object->getValue('total_original_price');
 
$totalPrice = $originalPrice;
 
 
$discount = $order->getDiscount();
 
if($discount instanceof discount) {
 
$totalPrice = $discount->recalcPrice($originalPrice);
 
}
 
$totalPrice += $newDeliveryPrice;
 
$object->setValue('total_price', $totalPrice);
 
$object->commit();
 
}
 
 
$this->chooseRedirect();
 
}
 
 
$this->setDataType("form");
 
$this->setActionType("modify");
 
 
$data = $this->prepareData($inputData, "object");
 
 
$this->setData($data);
 
return $this->doData();
 
}
 
</source>
 
 
 
Здесь мы добавили проверку на изменение статуса заказа и в зависимости от этого условия выполянется код. В данном случае, при изменении статуса заказа на "Готов" (id статуса 91) будет происходить списание со склада, а при изменении на статус "Отменён" (id статуса 85) возврат товара на стклад. Можно поставить эти параметры на своё усмотрение.
 
Теперь ещё один очень важный момент, этот метод должен каким то образом запускаться, для этого изменим action формы редактирования заказа. Для этого отредактируем файл ~/styles/skins/mac/data/modules/emarket/form.modify.xsl добавив в него шаблон
 
<source lang="xml">
 
<xsl:template match="data[@type = 'form' and (@action = 'modify' or @action = 'create')]">
 
 
<form method="post" action="/admin/emarket/order_edit_custom/{object/@id}/do/" enctype="multipart/form-data">
 
<input type="hidden" name="referer" value="{/result/@referer-uri}" id="form-referer" />
 
<input type="hidden" name="domain" value="{$domain-floated}"/>
 
 
 
<xsl:apply-templates mode="form-modify" />
 
<xsl:apply-templates select="page" mode="permissions" />
 
 
 
<xsl:if test="@action = 'modify' and count(page) = 1">
 
<xsl:apply-templates select="document(concat('udata://backup/backup_panel/', page/@id))/udata" />
 
</xsl:if>
 
</form>
 
</xsl:template>
 
 
</source>
 
</source>
 
без него форма редактирования выводится по стандартному шаблону.
 
 
Теперь при изменении статуса заказа, если он меняется на готов, со склада списывается количество товаров, указанное в заказе, а при отмене заказа, возвращается.
 
[[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]
 

Версия 12:02, 21 августа 2013

Актуально для версии 2.9.1

В системе UMI.CMS склады введены в основном для наглядности и для удобства менеджерам, обрабатывающим заказ. В этой статье мы добавим данным параметрам функциональности и организуем списание со склада.

Задача: Реализовать функционал автоматического списания или возврата товара со склада.

Условия работы макроса:

  1. В модуле "Шаблоны данных" в типе данных "Заказ" должно присутствовать поле типа "Кнопка-флажок" с идентификатором current_mode
  2. В модуле "Шаблоны данных" в типе данных "Объекты каталога" должно присутствовать поле типа "Составное" с идентификатором stores_state ("Состояние на складах")


Реализация: Напишем обработчик события для точки вызова systemModifyObject, которое вызывается при сохранении объекта в административной панели. Вся логика списания или возврата будет находиться в обработчике события. Списание происходит, если статус заказа был изменен на "Готов" (статус 'ready'); возврат товара со склада, если статус заказа был изменен на "Отменен" (статус 'canceled').
В директорию classes\modules\emarket\ добавим файл с названием custom_events.php и содержанием:

<?php
    new umiEventListener("systemModifyObject", "emarket", "storesReact");