Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Заполнить свойство инфоблока ценой из торгового каталога

Просмотров: 4584

Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. Например, для вывода старой цены в редакции Битрикс "Малый бизнес" (цена товара за минусом какого-то процента). Можно воспользоваться данной заметкой.

Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. Например, для вывода старой цены в редакции Битрикс "Малый бизнес" (цена товара за минусом какого-то процента). Можно воспользоваться данной заметкой.

Итак: у нас есть инфоблок торгового каталога, в котором мы хотим заполнить свойство типа число (или строка) стоимостью элемента. В моем случае, код этого свойства "ATT_PRICE"

Единоразовое заполнение или по необходимости

Если нужно выполнить заполнение один раз или в ручную, по необходимости.

Создаем новую страничку на сайте (можно ограничить к ней доступ, только для администраторов) и вставляем туда такой код, подсказки по коду, прямо внутри:

CModule::IncludeModule('iblock');
CModule::IncludeModule('catalog');
CModule::IncludeModule('currency');

$IBLOCK_ID = 34; //Инфоблок с которым работаем

//Получаем ID всех элементов
$addProps = CIBlockElement::GetList (
	Array("ID" => "ASC"),
	Array("IBLOCK_ID" => $IBLOCK_ID),
		false,
		false,
		Array(
			'ID'
		)
);
while($ar_fields = $addProps->GetNext())
{
$arProductID =  $ar_fields['ID'];
//Узнаем цену элемента
    $rsPrices = CPrice::GetList(
        array(),
        array(
            "PRODUCT_ID" => $arProductID,
        )
    );
    while($arPrice = $rsPrices->Fetch())
    //Передаем цену в переменную
    {
       $PropPrice = $arPrice["PRICE"];
    }
    //Заполняем свойство с кодом "ATT_PRICE" ценой
    CIBlockElement::SetPropertyValuesEx(
        $arProductID,
        $IBLOCK_ID,
        array(
            "ATT_PRICE" => $PropPrice,
        )
    );
}

Сохраняем и открываем в браузере. Скрипт отработает и у всех товаров заполнится свойство ATT_PRICE. Учтите, что если у вас большой каталог, это может занять некоторое время. Если каталог очень большой, убедитесь что работа не завершится по таймауту. Я пробовал на каталоге с 50 000-ами товаров. Код отработал за 12 секунд

Далее, можете выполнять этот код в ручную или повесить выполнение на крон.

Постоянная работа скрипта. Обработчик в init.php

Если вам нужно, что бы свойство ATT_PRICE обновлялось постоянно, при каждом добавлении товаров и обновлении цен. Например, при обмене с 1С

Можете добавить обработчик в init.php. Код основан на томже, что приведен выше, в принципе выполняет теже самые действия по событиям обновления/добавления элементов

AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "DoIBlockAfterSave");
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "DoIBlockAfterSave");
AddEventHandler("catalog", "OnPriceAdd", "DoIBlockAfterSave");
AddEventHandler("catalog", "OnPriceUpdate", "DoIBlockAfterSave");
function DoIBlockAfterSave($arg1, $arg2 = false) {
	
CModule::IncludeModule('iblock');
CModule::IncludeModule('catalog');
CModule::IncludeModule('currency');
 
    $IBLOCK_ID = 34;
	      if (is_array($arg2) && $arg2["PRODUCT_ID"] > 0) {
	         $ELEMENT_ID = $arg2["PRODUCT_ID"];
	      } elseif (is_array($arg1) && $arg1["ID"] > 0) {
	         $arElementFields = CIBlockElement::GetByID($arg1["ID"])->GetNext();
	         if(in_array($arElementFields["IBLOCK_ID"],array($IBLOCK_ID))) {
	            $ELEMENT_ID = $arg1["ID"];
	         }
	      }
      
        $arProductID = array($ELEMENT_ID);
       
        $rsProperty = CIBlockProperty::GetByID("PRICE", $IBLOCK_ID);
        $arProperty = $rsProperty->Fetch();
	$arPropCache[$IBLOCK_ID] = $arProperty["ID"];
		
	$rsPrices = CPrice::GetList(
            array(),
            array(
                "PRODUCT_ID" => $arProductID,
            )
        );
        while($arPrice = $rsPrices->Fetch())
        {
	$PRICE = $arPrice["PRICE"];
        $PropPrice = $PRICE;
        }
        CIBlockElement::SetPropertyValuesEx(
            $ELEMENT_ID,
            $IBLOCK_ID,
                array(
                    "ATT_PRICE" => $PropPrice,
            )
        );
}

Полезные дополнения:

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

Воспользуйтесь методом CCurrencyRates::ConvertCurrency в части получения цены товара

$strDefaultCurrency = CCurrency::GetBaseCurrency();
$arPrice["PRICE"] = CCurrencyRates::ConvertCurrency($arPrice["PRICE"], $arPrice["CURRENCY"], $strDefaultCurrency);
$PRICE = $arPrice["PRICE"];
$PropPrice = $PRICE;

Если нужно получить больше информации о свойстве ATT_PRICE. Например получить ее ID, проверить на заполненность итд. Воспользуйтесь методом CIBlockProperty::GetByID:

$rsProperty = CIBlockProperty::GetByID("ATT_PRICE", $IBLOCK_ID);
$arProperty = $rsProperty->Fetch();
$arPropCache[$IBLOCK_ID] = $arProperty["ID"];

Написать первый комментарий:

Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений
Нажимая кнопку "Отправить" вы соглашаетесь
с политикой конфиденциальности и обработки персональных данных.

Записная книжка разработчика

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

Менять большую картинку, при клике на маленькую, в детальной карточке Просмотров: 1763 Мини скриптик, может кому пригодится для каталога товаров или новостей при использовании д... Использование WebP изображений в 1С-Битрикс (на Битрикс: Веб окружени... Просмотров: 25894 WebP это современный формат сжатия изображений, который позволяет, при правильных настройк... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 6301 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Подключение SSL на Битрикс виртуальная машина Просмотров: 11929 С первого января 2017 года, наличие безопасного соединения HTTPS становится практически об... Заполнить свойство инфоблока ценой из торгового каталога Просмотров: 4585 Если вам по какой-то причине нужно скопировать цену товара в свойство этого же инфоблока. ... Изменить размер картинок на лету в битрикс Просмотров: 46794 Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздел... Вывести артикул в печатную форму бланка заказа Просмотров: 385 Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе. ... Не дать пользователю купить больше одного товара, в Битрикс Просмотров: 5148 Иногда нужно и такое: Например: на одном из разрабатываемых сайтов, мне нужно было создать... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 36701 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Почтовое событие на создание нового элемента инфоблока, через API Просмотров: 14341 Иногда при разработке сайта требуется реализовать функционал добавления элементов инфоблок... Помечаем новинки лейблом в каталоге битрикс Просмотров: 20036 Достаточно часто, при разработке каталога товаров или интернет магазина на системе управле... Информация о заказах и содержимое корзины текущего пользователя. Просмотров: 11776 В процессе разработки сайта могут понадобиться рецепты приведенные ниже. Использовать можн... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 27364 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И... Как подобрать редакцию Битрикс под задачи Просмотров: 6348 Последнее время, все чаще, при общении с заказчиками, сталкиваюсь с вопросом "— К... Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс Просмотров: 8484 В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне кор... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1263 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Если пользователь авторизован то... API Битрикс Просмотров: 22252 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Дать пользователю возможность быстро отредактировать материал Просмотров: 4364 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Заполнение габаритов товара, после обмена с 1С, из свойств элемента и... Просмотров: 10422 Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1... Показать пользователю накопительную скидку за все сделанные заказы, и... Просмотров: 1758 Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и ...