Меню

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

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
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить картинки
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst
Сайт в режиме тех обслуживания

Сообщения форума и комментарии не сохраняются

Возвращайтесь после 12-го января

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

Адаптивное гамбургер меню для битрикс

Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В архиве готовый шаблон для Битри...

ORM в инфоблоках, получение информации об элементах инфоблока на D7

Задача: собрать полные данные об элементах инфоблока, применяя ORM/D7, который пришел на смену устаревшему CIBlockEleme...

Если предложение SKU в корзине, поменять кнопку добавления на "В корзине"

Данная заметка является дополнением к ранее опубликованной: Если товар в корзине, поменять значение input на "В корзине"...

Добавление своих полей в почтовые шаблоны Битрикс

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

Номера страниц в Title и Description при постраничной навигации каталога

Задача: Часто SEO-специалисты просят добавить номер страницы, из постраничной навигации, в заголовок и описание раздела ...

Быстрая отписка от всех рассылок модуля "E-mail маркетинг", в кабинете пользователя

Задача: дать пользователям возможность отписаться от всех рассылок "E-mail маркетинга", не только по ссылке из...

Спойлер в списке новостей 1С-Битрикс

Иногда нужно сделать спойлеры в копонентах 1C-Битрикс, в основном конечно, имеет смысл при очень больших обьемах контент...

Переключатель валюты в каталоге 1С-Битрикс

Задача: Дать пользователю возможность самостоятельно выбирать валюту, в которой он хочет видеть цены, в разделе каталога...

Удалить половину элементов инфоблока с помощью API

Задача: вот такая странная задача, нужно удалить из инфоблока половину элементов. Не важно каких, просто половину элемен...