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

Материал из 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");