+7 495 008 8452 пн.-пт. 10:00 – 17:00

Новый тип поля «PHP-код» создан, в первую очередь, для сложных и особых случаев. Необходимо понимать, что данный тип поля рассчитан на профессионалов и пользователей, знакомых с языком программирования PHP.

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

Пример: выгрузка стоимости доставки в зависимости от веса товара. Часто эту задачу решали с помощью мультиусловий: если вес больше 100 кг, то цена одна, если вес от 50 до 100 кг - цена другая, если от 10 до 50кг - цена третья, и т.д. Если же требуется условия расширить, например, в зависимости от габаритов товара, то задача и вовсе становится нереально сложной с точки зрения настройки. С помощью PHP-кода, отказавшись от мультиусловий, программист может решать такие задачи более качественно.

Конечно, использование PHP-кода вместо простых полей гораздо менее наглядно, особенно для пользователей без знания PHP. Поэтому, рекомендуем в начале кода оставлять комментарий (начинающийся с символов //), например:
// Получаем цену в зависимости от веса и габаритов.

В коде Вы можете использовать следующие переменные:

  • $intElementId - ID элемента
  • $intIBlockId - ID инфоблока
  • $intProfileId - ID профиля
  • $arElement - массив данных элемента
  • $arProfile - массив данных профиля
  • $obField - объект текущего поля
  • $obPlugin - объект текущего плагина

Весь код должен вернуть (через return) текстовое значение, которое и будет использовано для выгрузки. При этом не забывайте, что PHP-код управляет значением. И это значение входит в поле, т.е. если для поля заданы какие-то настройки, то они будут применены для данного текста.

Код не должен содержать открывающих (<? или <?php) и закрывающих (?>) тегов PHP.

В случае возникновения ошибок в коде, их текст будет попадать в лог профиля.

Для просмотра содержимого переменных используйте Helper::P() - это «красивый» аналог для print_r(). При этом имейте в виду, что вывод будет доступен только в предпросмотре товара (в профиле кнопка «Предпросмотр» на панели и далее ссылка «пример», либо же просто нажмите Alt+F).

Основные данные хранятся в массиве $arElement, но в этом массиве не полный набор данных. Этот массив составляется для каждого PHP-поля в профиле, и поэтому получение полного набора всех данных может привести к различным проблемам. Поэтому для получения дополнительных данных используйте API модуля или API Битрикса. Например, для получения цены, зная ID типа цены, можете делать так:

$arPrice = $this->getProductPrice($intElementId, 1);

Helper::P($arPrice); // Это покажет массив цены

Имея этот массив $arPrice, можно получить оптимальную цену (со скидками):

$arOptimalPrice = $this->getProductOptimalPrice($intElementId, $arPrice);

Helper::P($arOptimalPrice); // Это покажет массив оптимальной цены

При возникновении сложностей - пожалуйста, обращайтесь к нам.


Пример. Выгружать остаток как сумму остатков на двух складах, а в субботу - только по одному складу

$arAmounts = []; // В этом массиве будут остатки товара в виде ID_склада => Остаток
$arFilter = [
	'PRODUCT_ID' => $intElementId, // Ищем остатки только для данного товара
];
$arSelect = ['STORE_ID', 'AMOUNT'];
$resAmounts = \CCatalogStoreProduct::getList([], $arFilter, false, false, $arSelect);
while($arAmount = $resAmounts->fetch()){
	$arAmounts[$arAmount['STORE_ID']] = intVal($arAmount['AMOUNT']);
}
$count = $arAmounts[1] + $arAmounts[2]; // Для всех дней используем сумму складов 1 и 2
if(date('w') == 6){ // Проверяем, суббота ли сегодня?
	$count = $arAmounts[1]; // Для субботы используем только склад с ID=1
}
return $count; // Возвращаем полученное значение


Возврат к списку