Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Веб-сервисы. Настройка выгрузки товара

00 голосов
3
Добрый день!
Посмотрев статью http://dev.1c-bitrix.ru/community/blogs/cookbook/198.php решил сделать что-то похожее у себя по выгрузке товара у каталог с полями XML_ID, NAME, CODE, QUANTITY, CATALOG_WEIGHT, PRICE_1, CURRENCY_1, ACTIVE. Но столкнулся с двумя проблемами:
1) Всегда создаются новые товары. А мне нужно чтобы-бы товары с одинаковыми XML_ID перезаписывались.
2) Не получается вывести поля QUANTITY, WEIGHT, PRICE_1, CURRENCY_1.
Вот код компонента:

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

if(!CModule::IncludeModule("webservice") || !CModule::IncludeModule("iblock"))
   return;

// наш новый класс наследуется от базового IWebService
class CAddGoodsWS extends IWebService
{
   function AddGoods($XML_ID, $NAME, $CODE, $QUANTITY, $CATALOG_WEIGHT, $PRICE_1, $CURRENCY_1, $ACTIVE)
   {
      $iblock_permission = CIBlock::GetPermission(8);
      if ($iblock_permission < "W")
      {
         $GLOBALS["USER"]->RequiredHTTPAuthBasic();
         return new CSOAPFault('Server Error', 'Unable to authorize user.');
      }

      $arFields = Array(
            "IBLOCK_ID"=>8, // инфоблок "Товары рус"
            "XML_ID"=>$XML_ID,
                "NAME"=>$NAME,
                "CODE"=>$CODE,
            "QUANTITY"=>$QUANTITY,
            "CATALOG_WEIGHT"=>$CATALOG_WEIGHT,
            "CATALOG_PRICE_1"=>$PRICE_1,
                "CATALOG_CURRENCY_1"=>$CURRENCY_1,
            "ACTIVE"=>$ACTIVE,

         );
      $ib_element = new CIBlockElement();
      $result = $ib_element->Add($arFields);
      if($result>0)
         return Array("id"=>$result);

      return new CSOAPFault( 'Server Error', 'Error: '.$ib_element->LAST_ERROR );

   }

   // метод GetWebServiceDesc возвращает описание сервиса и его методов
   function GetWebServiceDesc()
   {
      $wsdesc = new CWebServiceDesc();
      $wsdesc->wsname = "bitrix.webservice.addgoods";
      $wsdesc->wsclassname = "CAddGoodsWS";
      $wsdesc->wsdlauto = true;
      $wsdesc->wsendpoint = CWebService::GetDefaultEndpoint();
      $wsdesc->wstargetns = CWebService::GetDefaultTargetNS();

      $wsdesc->classTypes = array();
      $wsdesc->structTypes = Array();

      $wsdesc->classes = array(
         "CAddGoodsWS"=> array(
            "AddGoods" => array(
               "type"      => "public",
               "input"      => array(
                  "XML_ID" => array("varType" => "string"),
                        "NAME" => array("varType" => "string"),
                        "CODE" => array("varType" => "string"),
                  "QUANTITY" => array("varType" => "string"),
                  "CATALOG_WEIGHT" => array("varType" => "string"),
                  "CATALOG_PRICE_1" => array("varType" => "string"),
                  "CATALOG_CURRENCY_1" => array("varType" => "string"),
                  "ACTIVE" => array("varType" => "string"),
                  ),
               "output"   => array(
                  "id" => array("varType" => "integer")
               ),
               "httpauth" => "Y"
            ),
         )
      );

      return $wsdesc;
   }
}

$arParams["WEBSERVICE_NAME"] = "bitrix.webservice.addgoods";
$arParams["WEBSERVICE_CLASS"] = "CAddGoodsWS";
$arParams["WEBSERVICE_MODULE"] = "";

// передаем в компонент описание веб-сервиса
$APPLICATION->IncludeComponent(
   "bitrix:webservice.server",
   "",
   $arParams
   );

die();
?>
 


Подскажите пожалуйста, что нужно подправить
спросил 08 Авг, 13 от ronin (160 баллов)

3 Ответы

00 голосов
но погодите
у вас ведь по коду нет никакой даже наметки на анализ наличия товара?
Что вы хотите то от системы?
Проверьте наличие и используйте либо Add либо Update тогда методы
а еще прикольным является вот это:
Код
"CATALOG_WEIGHT"=>$CATALOG_WEIGHT,
            "CATALOG_PRICE_1"=>$PRICE_1,
                "CATALOG_CURRENCY_1"=>$CURRENCY_1,

 


скорее всего это вам сделать не удастся
(тут требуется уточнение экспертов, может я уже просто устарел в знаниях, но так не делается)
для начала проверьте есть ли уже элемент каталога для данного элемента инфоблока (ну и если есть или если нет выполните нужные действия)
затем уже скорректируйте данные этого элемента (каталога) по весу количеству и пр.
потом можете приступить к фиксации цены для данного элемента каталога
в общем суть в сл.
в вашей задаче участвует два модуля:
инфоблоки и каталог
вы пока что использовали методы для инфоблоков
для каталога вы методы даже не трогали
ответил 08 Авг, 13 от jenia (1,500 баллов)
00 голосов
Кое-что исправил в компоненте, но обновляет товар если только если прописать ИД товара. Подскажите еще что нужно подправить в этом коде
Код
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

if(!CModule::IncludeModule("webservice") || !CModule::IncludeModule("iblock") || !CModule::IncludeModule("catalog"))
   return;

// наш новый класс наследуется от базового IWebService
class CAddGoodsWS extends IWebService
{
   function AddGoods($XML_ID, $NAME, $CODE, $QUANTITY, $WEIGHT, $PRICE, $CURRENCY, $ACTIVE)
   {
      $iblock_permission = CIBlock::GetPermission(8);
      if ($iblock_permission < "W")
      {
         $GLOBALS["USER"]->RequiredHTTPAuthBasic();
         return new CSOAPFault('Server Error', 'Unable to authorize user.');
      }

      $arFields = Array(
             "IBLOCK_ID"=>8, // инфоблок "Товары рус"
                "ELEMENT_ID",
                "XML_ID"=>$XML_ID,
                "NAME"=>$NAME,
                "CODE"=>$CODE,
            "QUANTITY"=>1,
            "WEIGHT"=>2,
            "PRICE"=>10,
                "CURRENCY"=>"USD",
            "ACTIVE"=>$ACTIVE,
         );


    $PRICE_TYPE_ID = 1;
//      $arFields["ELEMENT_ID"] = 3302;

    $ib_element = new CIBlockElement;

         if ($arFields["ELEMENT_ID"])
         {
            $result = $ib_element->Update($arFields["ELEMENT_ID"], $arFieldsUpd, false, true, true);
            if($result>0)
                return Array("id"=>$result);
         }
         else
         {
            $result = $ib_element->Add($arFields, false, true, true);
            if($result)
               return Array("id"=>$result);      // $arElement["ELEMENT_ID"] = $result;
            else
               $strError = $ib_element->LAST_ERROR;
         }

$res = CPrice::GetList(
        array(),
        array(
                "PRODUCT_ID" => $result,
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
    );

if ($arr = $res->Fetch())
{
    CPrice::Update($arr["ID"], $arFields);
}
else
{
    CPrice::Add($arFields);
}
   }
 
ответил 11 Окт, 13 от ronin (160 баллов)
00 голосов
Добрый день! И снова мне пришлось вернутся к этой теме. Подскажите пожалуйста, как в этом примере произвести анализ наличие товара по эго XML_ID.
ответил 12 Янв, 14 от ronin (160 баллов)

Похожие вопросы

0 голосов
0 ответов
0 голосов
1 ответ
0 голосов
1 ответ