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

Установить цену товара из свойства инфоблока

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

На одном из проектов, нужно было единоразово заполнить цены товаров из свойства инфоблока. Сделать это можно через API, методами CPrice::Update и CPrice::Add

Реализация

Итак: имеем инфоблок, в котором, у каждого элемента заполнено свойство типа срока и называется "Минимальная цена" c кодом "ATT_PRICE". Нам нужно заполнить этим свойством, базовую цену. По сути, скопировать значение этого свойства в цену элемента.

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

Дальше, создаем в корне сайта файл addprice.php и добавляем внего код:


require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
Cmodule::IncludeModule('iblock');
Cmodule::IncludeModule('catalog');
$getProps = CIBlockElement::GetList (
Array("ID" => "ASC"),
Array("IBLOCK_ID" => 5), //Инфоблок с которым работаем
		false,
		false,
			Array(
			'ID', //Получили ID элемента
			'PROPERTY_ATT_PRICE' //Получили значение свойства с ценой
			)
);
while($ar_fields = $getProps->GetNext())
{
    $arFields = Array(
        "PRODUCT_ID" => $ar_fields['ID'], //ID типа цены, которую заполняем
        "CATALOG_GROUP_ID" => "1",
        "PRICE" => $ar_fields['PROPERTY_ATT_PRICE_VALUE'], //Заполнили цену свойством
        "CURRENCY" => "RUB", //Указали валюту
    );
    $res = CPrice::GetList(
        array(),
        array(
            "PRODUCT_ID" => $PRODUCT_ID,
            "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
        )
    );
    if ($arr = $res->Fetch())
    {
        CPrice::Update($arFields); //Обновили цену
    }
    else
    {
        CPrice::Add($arFields); //Или добавили
    }
}

Открываем в браузере и ждем выполнения. Если нужно, для красоты, можно сделать пошаговое выполнение с отображением процесса- но это лишняя "свистоперделка".

Дополнительно:

Если нужно заполнить цену несколькими свойствами, например в зависимости от количества покупки, указать цену от-до. Можно модифицировать код, дополнив таким образом.


$arFields = Array(
    "PRODUCT_ID" => $ar_fields['ID'],
    "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
    "PRICE" => $ar_fields['PROPERTY_ATT_PRICE_VALUE'], //Заполнили цену свойством
    "CURRENCY" => "RUB",
    "QUANTITY_FROM" => 1, //От этого
    "QUANTITY_TO" => 10 //До этого количества
);

$res = CPrice::GetList(
        array(),
        array(
                "PRODUCT_ID" => $PRODUCT_ID,
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
    );

if ($arr = $res->Fetch())
{
    CPrice::Update($arr["ID"], $arFields);
}
else
{
    CPrice::Add($arFields);
}

Постоянное обновление цены из свойства. Cron задание.

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

Можно создать скрипт обновления и запускать его по cron. В директории /bitrix/php_interface/include/ создаем файл cron_price_refresher.php и добавляем в него:


$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/../../..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
@set_time_limit(0);

define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);

Cmodule::IncludeModule('iblock');
Cmodule::IncludeModule('catalog');
$getProps = CIBlockElement::GetList (
Array("ID" => "ASC"),
Array("IBLOCK_ID" => 5),
        false,
        false,
            Array(
            'ID',
            'PROPERTY_ATT_PRICE'
            )
);
while($ar_fields = $getProps->GetNext())
{
    $arFields = Array(
        "PRODUCT_ID" => $ar_fields['ID'],
        "CATALOG_GROUP_ID" => "1",
        "PRICE" => $ar_fields['PROPERTY_ATT_PRICE_VALUE'],
        "CURRENCY" => "RUB",
    );
    $res = CPrice::GetList(
        array(),
        array(
            "PRODUCT_ID" => $PRODUCT_ID,
            "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
        )
    );
    if ($arr = $res->Fetch())
    {
        CPrice::Update($arFields);
    }
    else
    {
        CPrice::Add($arFields);
    }
}

Здесь мы, подключили ядро битрикс, без шаблона и отключили статистику с проверкой прав. Делаем этот файл исполняемым chmod +x cron_price_refresher.php И добавляем в cron (в примере, каждое утро в 7 часов). /usr/bin/php72/bin/php -f - путь к интерпритатору php


0 7 * * * /usr/bin/php72/bin/php -f /sites/carrie-sex.shop/bitrix/php_interface/include/cron_price_refresher.php

PS: Понятное дело, можно добавить обработчик в init.php - но это не всегда подходит. Обновление цен с параллельной загрузкой каталога- ресурсоемкая процедура. На больших каталогах, потребуется либо мощный, дорогой сервер. Либо сэкономить на нем, способом выше!

Сергей Петрухин 03.08.2019
Вместо
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");

пишем
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

И наслаждаемся
Михаил Базаров 03.08.2019
Цитата
Сергей Петрухин написал:
Вместо
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");

пишем
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

И наслаждаемся
Да, если не нужно отображение шаблона- можно и так. Или для cron задания
Guest 01.11.2021
А если в обратном порядке, базовую цену поместить в свойство.
Михаил Базаров 01.11.2021
Цитата
Guest написал:
А если в обратном порядке, базовую цену поместить в свойство.
С помощью метода CPrice::GetByID получить цену товара
С помощью CIBlockElement::Update и CIBlockElement::SetPropertyValues установить значение нужному свойству
Anton 07.09.2022
Добрый день, Михаил!
Подскажите, на сайте товар уже заполнен проставлены цены и есть товар новый, который только залился, тут цена в собственном поле хранится. Когда пытаюсь воспользоваться вашим примером цена из свойства кастомного записывается в поле с Ценой, но начинают создаваться дубли товара, во всем каталоге.

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

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

Вывести минимальную цену торговых предложений в Битрикс Просмотров: 26860 Если у товара несколько торговых предложений и у каждого предложения разные цены, иногда т... Картинка торгового предложения вместо иконки цвета, в выборе SKU Просмотров: 270 Задача: вместо не информативных иконок цветов нужно вывести детальную картинку торгового п... Бонус за выполненный заказ на внутренний счет пользователя Просмотров: 4268 Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить п... Вывести разделы инфоблока по первым буквам не меняя структуру каталог... Просмотров: 1808 Например: у нас есть инфоблок с большим количеством разделов. И мы хотим, на сайте разбить... Открытие мобильного приложения Apache Cordova по ссылке Просмотров: 683 Достаточно часто нужно реализовывать открытие мобильного приложения по ссылке. Например: п... Подключение мобильной версии шаблона Битрикс сайта, с автопереключени... Просмотров: 42288 Предпочитаю, что бы сайт не грузил кучу скриптов и стилей. При загрузке адаптивного шаблон... Простые калькуляторы в карточке товара каталога на Битрикс Просмотров: 15404 На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварител... Простой WEB сервер на ubuntu, для Битрикс Просмотров: 34478 Расскажу как по быстрому сконфигурировать WEB сервер для работы с Битрикс. Безо всяких ngi... Индивидуальные цены в 1С-Битрикс: в каталоге и при оформлении заказа Просмотров: 4960 В этой заметке постараюсь описать процесс реализации индивидуальных цен, для пользователей... Вывести свойство привязка к Яндекс Картам в Битрикс Просмотров: 18184 Часто бывает нужно вывести свойство привязка к Яндекс карте в детальном описании элемента... Установить цену товара из свойства инфоблока Просмотров: 8714 На одном из проектов, нужно было единоразово заполнить цены товаров из свойства инфоблока... Время на БД и веб сервере отличается на 3600 секунд, тест Битрикс Просмотров: 15306 Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок... Основные функции вывода в шаблонах Битрикс Просмотров: 155357 Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну к... Прятать или показывать описание раздела каталога Просмотров: 598 В новых компонентах и шаблонах catalog.section есть не документированный и не выводимый па... Вывести все разделы в которых находится элемент инфоблока Просмотров: 13027 Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоб... Time Capsule на Windows 10. Хранение бекапов Time Machine на компьюте... Просмотров: 6664 Заметку написал скорее для себя, что бы собрать все в одну кучу. Написана на базе нескольк... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 23034 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в... Создание мобильного приложения на cordova, для любого сайта. Просмотров: 14192 Если стоит задача разработки мобильного приложения для сайта, можете воспользоваться данно... Автоматически помечаем новинки лейблом в каталоге битрикс Просмотров: 5380 Если вы хотите помечать новинки каталога, вашего магазина на Битрикс, лейблом "Новинка". И... Массово: применить наценку ко всем товарам каталога с пересчетом от б... Просмотров: 5584 Рассмотрим как, в магазине работающем на 1С-битрикс, массово применить наценку на все това...