Меню

Проверка на наличие существующего элемента в инфоблоке по свойству (Битрикс)

RSS
Проверка на наличие существующего элемента в инфоблоке по свойству (Битрикс)
 
Привет Михаил и участники форума, заранее прошу, отнестись к вопросу не очень строго, пишу скрипт первый раз.
Есть 2 инфоблока:
  1. Инфоблок (ID=2) с товарами, там собираю массив с артикулами на WB;
  2. Инфоблок (ID=7) туда добавляю сами отзывы (которые забираю по API).
Функция скрипта: По API получаю отзывы с WB по определенным товарам (по артикулу WB, которые указаны в инфоблоке с товарами) и добавляет элементы в инфоблок с отзывами.
Подскажите пожалуйста как сделать, чтобы при выполнении функции проверялось, на наличие этого отзыва (то есть при повторном запуске скрипта, те что уже есть не добавлялись), у каждого отзыва с WB есть уникальный ID (пример: kzgXM4MB65w5GC7j5vjK), вот по этому свойству элемента инфоблока с отзывами (ID 7) и проверять на существования отзыва.
Заранее всем благодарен за помощь!

аранее всем благодарен за помощь!

Код
<?php
// подключение функций пролога
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");

set_time_limit(60);

CModule::IncludeModule("main"); // CFile
CModule::IncludeModule("iblock"); // CIBlockElement

$PRODUCT_IBLOCK = '2';
$REVIEWS_IBLOCK = '7';

function getRequestResult($request)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $headers = array();
    $headers[] = 'Content-Type: application/json';
    $headers[] = 'Authorization: ........';
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $result = curl_exec($ch);
    if (curl_errno($ch)) { 
        echo 'Error:' . curl_error($ch);
    }
    curl_close($ch);
    return $result;
}

function parseAndAdd($artnum, $PRODUCT_IBLOCK) {
    $org_url = 'https://feedbacks-api.wildberries.ru/api/v1/feedbacks?isAnswered=true&amp;nmId=&#39;. $artnum .'&take=5000&skip=0';
    $html = getRequestResult($org_url);
    
    $arr = json_decode($html, true);
    $counter = 0;
    
    foreach($arr['data']['feedbacks'] as $value){
    
        //Свойства
        $PROP = array();
        $i = 0;
        if (!empty($value['photoLinks'])) {
            foreach ($value['photoLinks'] as $morePhoto) {
                $arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto['fullSize']));
                $i++;
            }
        }
        $PROP['ART_WB'] = $value['productDetails']['nmId'];
        $PROP['RAITING'] = $value['productValuation'];
        $PROP['ISTOCHNIK'] = $value['state'];
        $PROP['PHOTO'] = $arMorePhoto;
        $PROP['REVIEWSID'] = $value['id'];
        
        //$photolinks[] = $value['photoLinks'];
        /*if (!empty($photolinks)) {
            foreach($photolinks as $photo){
                $photo = $photo['fullSize'];
            }
        }*/
        
        $el = new CIBlockElement;
        $fields = [
            'ACTIVE' => "Y",
            'IBLOCK_ID' => 7,
            "IBLOCK_SECTION_ID" => false,
            "NAME" => $value['userName'],
            "PREVIEW_TEXT" => $value['text'],
            "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
            "PROPERTY_VALUES" => $PROP,
            //'ACTIVE_FROM' => $date, // Начало активности
            //'DATE_CREATE' => $date, // Дата создания
        ];
        
        if ($PRODUCT_ID = $el->Add($fields)) {
            echo 'Добавлен отзыв, ID: ' . $PRODUCT_ID . '<br />';
            $counter++;
        } else {
            echo "Error[" . $PRODUCT_ID . "]: " . $el->LAST_ERROR . '<br />';
        }
        
    }
    
    echo 'Отзывы по товару с артикулом '.$artnum . ' добавлены. Количество '. $counter. '<br>';
    
}

//print_r($photo);
//print_r(parseAndAdd(113509876, 6));

$places_ids = []; // Храню артикулы всех товаров, по которым будет забирать отзывы
$arSelect = ["NAME","PROPERTY_ART_WB"];
$arFilter = ["IBLOCK_ID" => $PRODUCT_IBLOCK,"ACTIVE" => "Y",];
$resp = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $resp->GetNextElement()) {
    $arFields = $ob->GetFields(); // Получаю значения полей элемента
    $places_ids[] = $arFields['PROPERTY_ART_WB_VALUE']; // Заполняю массив с артикулами
}

foreach ($places_ids as $arrwb) {
    if (!empty($arrwb)) {
        parseAndAdd($arrwb, 7);
    }
}
?>
 
Нашел решение, самостоятельно.
Сделав следующее:
вместо свойства, воспользовался полем символьного кода "CODE".
Код
$fields = [        'ACTIVE' => "Y",
        'IBLOCK_ID' => 7,
        "IBLOCK_SECTION_ID" => false,
        "NAME" => $value['userName'],
        "PREVIEW_TEXT" => $value['text'],
        "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
        "PROPERTY_VALUES" => $PROP,
        "CODE" => value['id'],
        //'ACTIVE_FROM' => $date, // Начало активности
        //'DATE_CREATE' => $date, // Дата создания
    ];

А в настройках инфоблока во вкладке "Поля", поставил галку в поле Символьный код: галочку на "Обязательное" и галочку на "Если код задан, то проверять на уникальность".
Тем самым при повторном запуске, не загружался. А выходила ошибка "Элемент с таким символьным кодом уже существует."
 
Но есть другая проблема, а именно с фотографиями.

Массив с фото
Код
[photoLinks] => Array        (
            [0] => Array
                (
                    [fullSize] => https://feedback01.wbbasket.ru/vol65/part6548/6548421/photos/fs.jpg
                    [miniSize] => https://feedback01.wbbasket.ru/vol65/part6548/6548421/photos/ms.jpg
                )

            [1] => Array
                (
                    [fullSize] => https://feedback01.wbbasket.ru/vol65/part6548/6548422/photos/fs.jpg
                    [miniSize] => https://feedback01.wbbasket.ru/vol65/part6548/6548422/photos/ms.jpg
                )

        )

Я пробую добавить следующим образом:
Код
if (!empty($value['photoLinks'])) {            
  foreach ($value['photoLinks'] as $morePhoto) {
    $arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto['fullSize']));
     $i++;
    }         
}
Но картинки добавляются в элементы в разнобой, то есть неверно. Где данных с
Код
photoLinks
вообще пустой, однако фото добавляются по очереди во все, хотя картинки нет.
Изменено: Михаил Базаров - 05.08.2024 17:35:07
 
Судя по коду: если картинок нет - то наполненный массив предыдущего элемента передается в следующий.
До начала наполнения массива обнуляй его, просто укажи до начала наполнения массива, что он создается пустым
Код
$photoLinks = array()
 
Спасибо, за ответ.
Но видимо я что то  делаю не так.
Не загружаются так картинки.
Код
function parseAndAdd($artnum, $PRODUCT_IBLOCK) {
   $org_url = 'https://feedbacks-api.wildberries.ru/api/v1/feedbacks?isAnswered=true&amp;nmId=&#39;. $artnum .'&take=5000&skip=0';
   $html = getRequestResult($org_url);
   
   $arr = json_decode($html, true);
   $counter = 0;
   
   foreach($arr['data']['feedbacks'] as $value){
      $i = 0;
      $arMorePhoto = array();
      foreach ($value['photoLinks'] as $morePhoto) {
         $arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto['fullSize']));
         $i++;
      }
      
      //Свойства
      $PROP = array();
      $PROP['ART_WB'] = $value['productDetails']['nmId'];
      $PROP['RAITING'] = $value['productValuation'];
      $PROP['ISTOCHNIK'] = array("XML_ID" =>$value['state']);
      $PROP['PHOTO'] = $arMorePhoto;
      
      /*if (!empty($photolinks)) {
         foreach($photolinks as $photo){
            $photo = $photo['fullSize'];
         }
      }*/
      
      $el = new CIBlockElement;
      $fields = [
         'ACTIVE' => "Y",
         'IBLOCK_ID' => 7,
         "IBLOCK_SECTION_ID" => '72',
         "NAME" => $value['userName'],
         "PREVIEW_TEXT" => $value['text'],
         "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
         "PROPERTY_VALUES" => $PROP,
         "CODE" => $value['id'],
         //'ACTIVE_FROM' => $date, // Начало активности
         //'DATE_CREATE' => $date, // Дата создания
      ];
      
      if ($PRODUCT_ID = $el->Add($fields)) {
         echo 'Добавлен отзыв, ID: ' . $PRODUCT_ID . '<br />';
         $counter++;
      } else {
         echo "Error[" . $PRODUCT_ID . "]: " . $el->LAST_ERROR . '<br />';
      }
      
   }
   
   echo 'Отзывы по товару с артикулом '.$artnum . ' добавлены. Количество '. $counter. '<br>';
   
}
 
Код
 function parseAndAdd($artnum, $PRODUCT_IBLOCK) {
   $org_url = 'https://feedbacks-api.wildberries.ru/api/v1/feedbacks?isAnswered=true&nmId=&#39;. $artnum .'&take=5000&skip=0';
   $html = getRequestResult($org_url);
   
   $arr = json_decode($html, true);
   $counter = 0;
   
   foreach($arr['data']['feedbacks'] as $value){
      $i = 0;
      $arMorePhoto = array();
      foreach ($value['photoLinks'] as $morePhoto) {
         $arMorePhoto['n'.$i] = array("VALUE"=>CFile::MakeFileArray($morePhoto['fullSize']));
         $i++;
      }
      
      //Свойства
      $PROP = array();
      $PROP['ART_WB'] = $value['productDetails']['nmId'];
      $PROP['RAITING'] = $value['productValuation'];
      $PROP['ISTOCHNIK'] = array("XML_ID" =>$value['state']);
      $PROP['PHOTO'] = $arMorePhoto;
      
      /*if (!empty($photolinks)) {
         foreach($photolinks as $photo){
            $photo = $photo['fullSize'];
         }
      }*/
      
      $el = new CIBlockElement;
      $fields = [
         'ACTIVE' => "Y",
         'IBLOCK_ID' => 7,
         "IBLOCK_SECTION_ID" => '72',
         "NAME" => $value['userName'],
         "PREVIEW_TEXT" => $value['text'],
         "PREVIEW_PICTURE" => $imgUrl ? CFile::MakeFileArray($imgUrl) : CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/local/api/wb/avatar.png"),
         "PROPERTY_VALUES" => $PROP,
         "CODE" => $value['id'],
         //'ACTIVE_FROM' => $date, // Начало активности
         //'DATE_CREATE' => $date, // Дата создания
      ];
      
      if ($PRODUCT_ID = $el->Add($fields)) {
         echo 'Добавлен отзыв, ID: ' . $PRODUCT_ID . '<br />';
         $counter++;
      } else {
         echo "Error[" . $PRODUCT_ID . "]: " . $el->LAST_ERROR . '<br />';
      }
      
   }
   
   echo 'Отзывы по товару с артикулом '.$artnum . ' добавлены. Количество '. $counter. '<br>';
   
} 

Решено, спасибо
Изменено: Михаил Базаров - 07.08.2024 11:08:19
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить картинки
 

Блог-note: заметки разработчика

Простые калькуляторы в карточке товара каталога на Битрикс

На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварительным подсчетом стоимости услуг...

Фотогалерея на базе компонента новостей, с fancybox.

Это заметка обновление к очень старой, уже имеющейся на сайте. Сделаем что-то типа фотогалереи на базе встроеннного в би...

Список новостей с автопрокруткой через overflow:scroll

Простенький javascript позволит сделать автопрокрутку в шаблоне списка новостей. Достаточно актуально для новостных сайт...

Фиксированная корзина с обновлением, без перезагрузки страницы.

Иногда нужно сделать так, чтобы корзина в интернет магазине, созданном на Битрикс, была постоянно на виду, при этом обно...

Ссылка на товары бренда в каталоге с автоматическим применением умного фильтра

Задача: вывести товары на странице бренда, выведенного компонентом "Новости", с ссылками на разделы в каталоге...

Вывести список всех пользователей с необходимой информацией

Если нужно, на какой-либо странице сайта, вывести всех пользователей из группы "Зарегистирированные пользователи", прост...

Установка поиска Sphinx на Ubuntu 22.04 для 1С-Битрикс

Задача: установить и сконфигурировать поиск Sphinx под управлением Ubuntu 22.04 и панели управления HestiaCP для использ...

Автоматически отгрузить заказ и сменить статус отгрузки, при выполнении заказа.

Проблема: Заказы, на сайте, обрабатываются только в 1С. При этом 1С не работает с отгрузками и обменивается только стату...

Создать pdf файл из элемента инфоблока, дать скачать пользователю, поддерживать в актуальном состоянии или отправить на e-mail.

Задача: при каждом посещении статьи, на сайте, нужно создавать pdf файл с ее содержимым и записывать в свойство инфоблок...