линия

Главная

среда, 10 июня 2020 г.

Bitrix: как деактивировать элементы которые отсутствуют в выгрузке

Июнь. Я стоял в одних труселях на балконе и с третьего этажа лицезрел течение жизни в нашем дворе. Дядя Толик с утра был пьян и с улыбкой на лице наслаждался утренней свежестью. Тетя Галя в компании таких же крупных женщин как она, оживленно обсуждали  девушку, что прошла мимо них.  На ней (имею ввиду девушку,а не тетю Галю) был короткий сарафан, и ее изумительно красивые ноги и не только , вдохновляли меня на написание кода также как заставляли тетю Галю и Ко обсуждать ее вид. Детвора словно бешеные носились  туда сюда. В общем - лепота.
  Наслаждение происходящим прервало сообщение от заказчика. Как обычно, что то сломалось и наотрез отказывалось работать. Конечно, всю работу описывать не будут, а напишу только скрипт, который получает данные в формате xml,  и потом деактивирует те элементы что отсутствуют в битриксе.



  Да, задач простая, согласен. Но нужно было что то написать в блоге.
Итак, вот он скрипт:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
 header('Access-Control-Allow-Origin: *');
 header('Content-Type: text/html; charset=utf-8');
 set_time_limit(0);
 
 require($_SERVER["DOCUMENT_ROOT"]. "/bitrix/modules/main/include/prolog_before.php");
 define("NO_KEEP_STATISTIC", true); 
 CModule::IncludeModule("iblock");
 
 
 /*
  получаем все элементы на сайте.
 */
 $res = CIBlockElement::GetList([],['IBLOCK_ID' => 10, 'ACTIVE'=>'Y'], false);
 $codeIblockArr = [];
 while ($ar_res = $res->fetch()) {
  $codeIblockArr[] = $ar_res['CODE'];
 }
 
 /*
  получаем фид. и создаем массив с ID
 */
 $url = 'https://bitrix.site.ru/local/php_interface/lib/Export/files/partner_163723.xml';
 $codeFeedArr = [];
 $elements = new SimpleXMLElement(file_get_contents($url));
 foreach ($elements->offer as $offer) {
  $internal_id = 'internal-id';
  $id = $offer->attributes()->$internal_id;
  $codeFeedArr[] = $id;
 }
 
 
 
 /*
  Вычисялем какие элементы массива отсутсвтуют
  в другом массиве
 */
 $diffArray = array_diff($codeIblockArr,$codeFeedArr);
 

 
 /*
  Деактивируем элементы
 */
 $el = new CIBlockElement;
 foreach($diffArray as $codeElement){
  $arFilter = Array("IBLOCK_ID" => 10, "CODE" => $codeElement);
  $res = CIBlockElement::GetList(Array(), $arFilter, false);
  if ($ar_res = $res->fetch()) {
   echo '<br> Деактивирован элемент с ID = '.$ar_res['ID'].'';
   $el->Update($ar_res['ID'], ['ACTIVE'=>'N']);
  }
  else {
   echo '<br><b style="color:red"> не найден '.$codeElement.'</b>'; 
  }
  
 }

2 комментария:

  1. Приветствую! Полезная информация.
    Правда в настройках модуля обмена Битрикс есть возможность деактивации или удаления элементов не попавших в выгрузку. Или это относится только к обмену с 1С?

    ОтветитьУдалить
    Ответы
    1. Привет. Да, при обмене с 1С деактивация/удаление выполняется автоматически.

      Удалить