Выгрузка заказов в xml файл для курьерской службы

Выгрузка заказов в xml файл для Курьерской службы

Этот пост будет о том как в CMS Битрикс организовать выгрузку необходимой информации о заказах в файл xml для транспортно-экспедиционной компании. Информацию из данной статьи можно применить для компиляции файла xml любого вида (для этого потребуются незначительные изменения).
Итак, наша цель сделать возможность выгрузки файла, как показано на картинке ниже.

Выгрузка заказов в xml файл для компании БизнесПост

Для этого мы по этому адресу /bitrix/modules/sale/export создадим файл xml.php и занесем туда следующий код:

<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/catalog/include.php");

IncludeModuleLangFile(__FILE__);

if (!isset($arFilter) || !is_array($arFilter))
	die("Wrong use 1");
if (!isset($arSelectFields) || !is_array($arSelectFields))
	die("Wrong use 2");

$fieldsSeparator = ",";

$dbOrderList = CSaleOrder::GetList(
		array($by => $order),
		$arFilter,
		false,
		false,
		$arSelectFields
	);

ob_start();

echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
echo "<dataroot generated=\"".date('Y-m-d')."T".date('H:m:s')."+03:00"."\">";
echo "<OrdersList>";

while ($arOrder = $dbOrderList->Fetch())
{

            echo "<Order>";

            //Получаем параметры заказа
            $Order = CSaleOrder::GetByID($arOrder["ID"]);

            //Получаем свойства заказа
            $db_props = CSaleOrderPropsValue::GetOrderProps($arOrder["ID"]);

            // Получаем Содержимое заказа, и его вес
				$bNeedLine = False;
				$dbItemsList = CSaleBasket::GetList(
						array("NAME" => "ASC"),
						array("ORDER_ID" => $arOrder["ID"])
					);
				while ($arItem = $dbItemsList->Fetch())
				{
					if ($bNeedLine)
						$printValue .= "\n";
					$bNeedLine = True;

					$printValue .= $arItem["NAME"];
					$printValue .= " (".$arItem["QUANTITY"].GetMessage("SEXC_SHT");

                                        $w = $w + ($arItem["QUANTITY"]*$arItem["WEIGHT"]);

                               // Получаем названия категорий к которым принадлежит элемент заказа
                               $db_old_groups = CIBlockElement::GetElementGroups($arItem["PRODUCT_ID"], true);
                               $ar_group = $db_old_groups->Fetch();
                               $groups[] = $ar_group["NAME"];

				}

// Удаляем повторяющиеся названия категорий
$log = 1;
for($i=0; $i < count($groups); $i++)
   {
      for($j=0; $j < count($groups); $j++)
        {
             if (($groups[$i] == $groups[$j]) && ($log == 2))
             {
              $groups[$j] = "del";
              $log = 1;
             }
             if (($groups[$i] == $groups[$j]) && ($log == 1))
             {
              $log = 2;
             }
        }
   } 

      for($i=0; $i < count($groups); $i++)
        {
             if ($groups[$i] != "del") $groups_1[] = $groups[$i];
        }

// Кладем в соответствующие переменные нужную нам инфромацию
       if ($Order["PERSON_TYPE_ID"] == "1")
         {
            while ($arProps = $db_props->Fetch())
                {
                      switch($arProps["CODE"])
                        {
                           // Для физических лиц
                           case "FIO":
                           $FIO = $arProps["VALUE"];
                           break;
                           case "EMAIL":
                           $EMAIL = $arProps["VALUE"];
                           break;
                           case "PHONE":
                           $PHONE = $arProps["VALUE"];
                           break;
                           case "ZIP":
                           $ZIP = $arProps["VALUE"];
                           break;
                           case "LOCATION":
                           $LOCATION = $arProps["VALUE"];
                           break;
                           case "ADDRESS":
                           $ADDRESS = $arProps["VALUE"];
                           break;
                           case "METRO":
                           $METRO = $arProps["VALUE"];
                           break;
                           case "DATA_DOSTAVKI":
                           $DATA_DOSTAVKI = $arProps["VALUE"];
                           break;
                           case "TIME1":
                           $TIME1 = $arProps["VALUE"];
                           break;
                           case "TIME2":
                           $TIME2 = $arProps["VALUE"];
                           break;
                         }
                }
        };
       if ($Order["PERSON_TYPE_ID"] == "2")
         {
            while ($arProps = $db_props->Fetch())
                {
                      switch($arProps["CODE"])
                        {
                           case "EMAIL":
                           $EMAIL = $arProps["VALUE"];
                           break;
                           case "PHONE":
                           $PHONE = $arProps["VALUE"];
                           break;
                           case "ZIP":
                           $ZIP = $arProps["VALUE"];
                           break;
                           case "LOCATION":
                           $LOCATION = $arProps["VALUE"];
                           break;
                           case "ADDRESS":
                           $ADDRESS = $arProps["VALUE"];
                           break;
                           case "COMPANY":
                           $COMPANY = $arProps["VALUE"];
                           break;
                           case "CONTACK_PERSON":
                           $FIO_UR = $arProps["VALUE"];
                           break;
                           case "METRO":
                           $METRO = $arProps["VALUE"];
                           break;
                           case "DATA_DOSTAVKI":
                           $DATA_DOSTAVKI = $arProps["VALUE"];
                           break;
                           case "TIME1":
                           $TIME1 = $arProps["VALUE"];
                           break;
                           case "TIME2":
                           $TIME2 = $arProps["VALUE"];
                           break;
                         }
                }
        };
// Переменные могут называться как угодно, создать или отредактировать их вы можете
// в административной разделе битрикса по адресу магазин - свойства заказов - список свойств

            $s = $Order["ID"];

            $St = strtok($Order["DATE_INSERT"], " ");
            $St = explode("-", $St);
            echo "<Order_Date>".$St[2].".".$St[1].".".$St[0]."</Order_Date>";

            if (($TIME1 != "") and ($TIME2 != "")) {$DATA_DOSTAVKI = $DATA_DOSTAVKI." c ".$TIME1." до ".$TIME2;};
            echo "<Order_DeliveryDate>".$DATA_DOSTAVKI."</Order_DeliveryDate>";

            echo "<Recipient_Company>".$COMPANY."</Recipient_Company>";

            echo "<Recipient_Name>".$FIO.$FIO_UR."</Recipient_Name>";

            echo "<Recipient_ZipCode>".$ZIP."</Recipient_ZipCode>";

            $Gorod = CSaleLocation::GetByID($LOCATION);
            echo "<Recipient_City>".$Gorod["CITY_NAME"]."</Recipient_City>";

            echo "<Recipient_Address>".$ADDRESS."</Recipient_Address>";

            echo "<Recipient_Phone>".$PHONE."</Recipient_Phone>";

            $arLocs = CSaleLocation::GetByID($METRO, LANGUAGE_ID);
            echo "<Recipient_SubwayStation>".$arLocs["CITY_NAME_ORIG"]."</Recipient_SubwayStation>";

            echo "<Recipient_Email>".$EMAIL."</Recipient_Email>";

            echo "<Order_CargoType>";
            for($i=0; $i < count($groups_1); $i++)
                {
                    echo $groups_1[$i];
                    if ($i < (count($groups_1)-1)) echo ", ";
                }
            echo "</Order_CargoType>";

            echo "<Order_Weight>".$w.".0"."</Order_Weight>";

            echo "<Order_Place>"."1"."</Order_Place>";

            $Sum = $Order["PRICE"];
            echo "<Payment_Declared>".$Sum."</Payment_Declared>";

            echo "<Payment_Charge>";
            if ($Order["PAY_SYSTEM_ID"] == "1")
               {
                 $n = $Order["PRICE"]+$Order["PRICE_DELIVERY"];
                 echo $n;
               }
            else echo "0";
            echo "</Payment_Charge>";

            echo "<Payment_Type>";
            if ($Order["PAY_SYSTEM_ID"] == "1")
               {
                 echo "нал";
               }
            else echo "безнал";
            echo "</Payment_Type>";

            echo "<Order_Comment>".$Order["USER_DESCRIPTION"]."</Order_Comment>";

            echo "</Order>";

           // Обнуляем переменные для того чтобы в следующем заходе цикла
           // использовать их вновь, для следующего заказа
                           $FIO = "";
                           $EMAIL = "";
                           $PHONE = "";
                           $ZIP = "";
                           $LOCATION = "";
                           $ADRESS = "";
                           $COMPANY = "";
                           $FIO_UR = "";
                           $METRO = "";
                           $Gorod = "";
                           $printValue = "";
                           $w = "";
                           $Sum = "";
                           $groups = "";
                           $groups_1 = "";
                           $DATA_DOSTAVKI = "";
                           $TIME1 = "";
                           $TIME2 = "";

}

echo "</OrdersList>";
echo "</dataroot>";

$content = ob_get_contents();
ob_end_clean();

header('Pragma: public');
header('Cache-control: private');
header('Accept-Ranges: bytes');
header('Content-Length: '.strlen($content));
header("Content-Type: text/xml");
header('Content-Disposition: attachment; filename=orders_upload.xml');

echo $content;
?>

Чтобы понять как работает код смотрите комментарии, официальное руководство для разработчиков от битрикса, ну и еще нужно знать соответствующие функции php.

Таким образом скомпилируется файл orders_upload.xml, будет предложено сразу скачать его, в нем будет находиться информация о заказах. По такому принципу можно компилировать любой xml файл, да и вообще любой файл подобного типа. Необходимо только знать его структуру и располагать нужными свойствами товара, заказа или пользователя.

Похожие посты:
  • Отправка письма пользователю при смене статуса заказа (Битрикс)
  • Отправка письма на почту пользователю при оформлении нового заказа (Битрикс)
  • Создать аккаунт администратора на Битриксе
  • Товарный чек в формате xml (Excel)
  • Самостоятельное присвоение аффилиатов к заказам (Битрикс)
  • Добавить комментарий:

    Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: