|
|
Строка 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> |
− |
| |
− | без него форма редактирования выводится по стандартному шаблону.
| |
− |
| |
− | Теперь при изменении статуса заказа, если он меняется на готов, со склада списывается количество товаров, указанное в заказе, а при отмене заказа, возвращается.
| |
− | [[Категория:Модуль Интернет магазин]][[Категория:Написание кастомных макросов]]
| |