Документация для разработчиков

Update

bool
CCatalogDiscount::Update(
 int ID,
 array arFields
);

Метод изменяет параметры скидки с кодом ID в соответствии с данными из массива arFields. Нестатический метод.

Параметры вызова

ПараметрОписание
ID Код скидки.
arFields Ассоциативный массив параметров новой скидки, ключами в котором являются названия параметров, а значениями - соответствующие значения. Допустимые ключи:
  • SITE_ID - сайт;
  • ACTIVE - флаг активности;
  • NAME - название скидки;
  • COUPON - код купона;
  • USE_COUPONS - [Y/N] - есть купоны или нет, обновляется автоматически.
  • SORT - индекс сортировки;
  • MAX_DISCOUNT - максимальная величина скидки;
  • VALUE_TYPE - тип скидки (P - в процентах, F - фиксированная величина, S - Установить цену на товар);
  • VALUE - величина скидки;
  • CURRENCY - валюта;
  • RENEWAL - флаг "Скидка на продление";
  • ACTIVE_FROM - дата начала действия скидки;
  • ACTIVE_TO - дата окончания действия скидки;
  • IBLOCK_IDS - массив кодов инфоблоков, на которые действует скидка (если скидка действует не на все инфоблоки). Ключ является устаревшим с версии 12.0.0;
  • PRODUCT_IDS - массив кодов товаров, на которые действует скидка (если скидка действует не на все товары). Ключ является устаревшим с версии 12.0.0;
  • SECTION_IDS - массив кодов групп товаров, на которые действует скидка (если скидка действует не на все группы товары). Ключ является устаревшим с версии 12.0.0;
  • GROUP_IDS - массив кодов групп пользователей, на которые действует скидка (если скидка действует не на все группы пользователей);
  • CATALOG_GROUP_IDS - массив кодов типов цен, на которые действует скидка (если скидка действует не на все типы цен);
  • CONDITIONS - массив для изменения условий использования скидки. Массив перезаписывается, поэтому при обновлении скидки следует добавлять в массив все необходимые данные. Ключ доступен с версии 12.0.0.

    Если он задан и не пуст, то массивы PRODUCT_IDS, SECTION_IDS и IBLOCK_IDS использоваться не будут. Чтобы задать параметры скидки через эти 3 ключа, то CONDITIONS в массиве arFields должен отсутствовать, а старые данные будут изменены в соответствии PRODUCT_IDS, SECTION_IDS и IBLOCK_IDS.

    Каждое условие массива CONDITIONS описывается массивом следующей структуры:
    • CLASS_ID - идентификатор (строка);
    • DATA => array() - массив параметров условий;
    • CHILDREN => array() - массив подусловий, каждое из которых является массивом аналогичной структуры, где ключами являются значения 0,1,2,3,..

    Возможные логические условия:
    • Equal - равно;
    • Not - не равно;
    • Great - больше;
    • Less - меньше;
    • EqGr - больше либо равно;
    • EqLs - меньше либо равно.

    Наименования условий:
    • CondIBElement - товар;
    • CondIBIBlock - инфоблок;
    • CondIBSection - раздел;
    • CondIBCode - символьный код;
    • CondIBXmlID - внешний код;
    • CondIBName - название;
    • CondIBActive - активность;
    • CondIBDateActiveFrom - начало активности;
    • CondIBDateActiveTo - окончание активности;
    • CondIBSort - сортировка;
    • CondIBPreviewText - описание для анонса;
    • CondIBDetailText - детальное описание;
    • CondIBDateCreate - дата создания;
    • CondIBCreatedBy - автор;
    • CondIBTimestampX - дата изменения;
    • CondIBModifiedBy - изменивший;
    • CondIBTags - теги;
    • CondCatQuantity - количество товара на складе;
    • CondCatWeight - вес товара;
    • CondCatVatID - НДС;
    • CondCatVatIncluded - НДС включен в цену.

    Кроме того, возможна привязка условий к свойствам товара.

    Верхний элемент массива CONDITIONS всегда один и тот же (для скидок каталога может быть получен методом CCatalogCondTree::GetDefaultConditions()):
    array(
             'CLASS_ID' => 'CondGroup',
             'DATA' => array('All' => 'AND', 'True' => 'True'),
             'CHILDREN' => array()
    );
    

Возвращаемые значения

Метод возвращает код измененной записи или false в случае ошибки.

Примеры использования

Получить детальную информацию об ошибке при изменении можно следующим образом:

$res = CCatalogDiscount::Update($ID, $arFields);  
if (!$res) { 
    $ex = $APPLICATION->GetException();  
    $ex->GetString(); 
}

Пример массива arFields:

$arFields = array(
   "SITE_ID" => "s1",
   "MAX_DISCOUNT" => 0,
   "VALUE" => 15,
   "ACTIVE" => "Y",
   "CONDITIONS" =>  array (
      'CLASS_ID' => 'CondGroup',
      'DATA' =>
      array (
         'All' => 'AND',
         'True' => 'True',
      ),
      'CHILDREN' =>
      array (
         0 =>
         array (
            'CLASS_ID' => 'CondIBElement',
            'DATA' =>
            array (
               'logic' => 'Equal',
               'value' => 2975, //товар с ID=2975
            ),
         ),
         1 =>
         array (
            'CLASS_ID' => 'CondCatQuantity',
            'DATA' =>
            array (
               'logic' => 'Equal',
               'value' => 10, //остаток на складе равен 10
            ),
         ),
      ),  
   )
);


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
1
Владимир Дуденков
Цитата

Кроме того, возможна привязка условий к свойствам товара.
Сам способ привязки не описан. Разберем его.
Для получения массива необходимых условий используем событие OnBeforeDiscountUpdate:
Код
AddEventHandler("catalog", "OnBeforeDiscountUpdate", Array("CustomEventsClass", "OnBeforeDiscountUpdateHandler" ) );
class CustomEventsClass
{
   function OnBeforeDiscountUpdateHandler($ID, $arFields){
      $str = json_encode($arFields);
      AddMessage2Log($str);
   }
}
Или, в случае проблем с кодировкой:
Код
class CustomEventsClass
{
   function OnBeforeDiscountUpdateHandler($ID, $arFields){
      array_walk_recursive($arFields, function(&$item, $key){
         $item = utf8_encode($item);
      });
      $str = json_encode($arFields);
      AddMessage2Log($str);
   }
}
В лог-файле при изменении скидки теперь будет записан весь массив arFields для CCatalogDiscount::Update. Например если мы поставим условие "Свойство X" содержит "123", то получим следующий JSON:
Код
{
  "SITE_ID": "s1",
  "ACTIVE": "Y",
  "XML_ID": "",
  "ACTIVE_FROM": "",
  "ACTIVE_TO": "",
  "RENEWAL": "N",
  "NAME": "\u00c8\u00c1001818",
  "SORT": "100",
  "MAX_DISCOUNT": "0",
  "VALUE_TYPE": "P",
  "VALUE": "16",
  "CURRENCY": "RUB",
  "NOTES": "",
  "PRIORITY": "1",
  "LAST_DISCOUNT": "Y",
  "GROUP_IDS": [
    "2011"
  ],
  "CATALOG_GROUP_IDS": [
    "168"
  ],
  "CONDITIONS": {
    "CLASS_ID": "CondGroup",
    "DATA": {
      "All": "AND",
      "True": "True"
    },
    "CHILDREN": [
      {
        "CLASS_ID": "CondIBSection",
        "DATA": {
          "logic": "Equal",
          "value": "10634"
        }
      },
      {
        "CLASS_ID": "CondIBProp:11:75",
        "DATA": {
          "logic": "Contain",
          "value": "123"
        }
      }
    ]
  }
}
где наше условие записано как CondIBProp:11:75 (11 - ID инфоблока, 75 - ID свойства)
© «Битрикс», 2001-2019, «1С-Битрикс», 2019
Наверх