PHP код для Битрикс от основ до продвинутых техник
Основное решение: использование D7 ORM для работы с инфоблоками
Как выполнить типовые операции с элементами инфоблоков используя современный API?
В современной разработке для 1С-Битрикс рекомендуется применять D7 ORM (Object-Relational Mapping) из пространства имен Bitrix\Main\ORM. Этот подход обеспечивает типизацию, автоматическое кеширование и безопасность. Рассмотрим пример получения элементов инфоблока.
use Bitrix\Iblock\Elements\ElementCatalogTable;
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$elements = ElementCatalogTable::getList([
'select' => ['ID', 'NAME', 'PREVIEW_TEXT'],
'filter' => ['=ACTIVE' => 'Y'],
'order' => ['SORT' => 'ASC'],
'limit' => 10
]);
while ($element = $elements->fetch()) {
echo $element['NAME'] . '
';
}битрикс php код (php код для битрикс)
При таком подходе автоматически подключается кеширование запроса. Если необходимо сбросить кеш, используется метод resetCache().
Типичные проблемы:
- Неверное имя таблицы: если используется нестандартный инфоблок, нужно наследовать класс от EO_Element или создать свой класс. Ошибка Table not found решается указанием правильного инфоблока при генерации класса.
- Отсутствие кеширования на первом уровне: в режиме разработки кеш может не работать, это нормально.
- Необходимость загрузки модуля iblock перед вызовом ORM.
Как получить данные инфоблока классическим методом (старый API)?
Если проект исторически использует старый API, можно применить CIBlockElement::GetList. Этот метод хорошо документирован, но менее строг к типам.
Loader::includeModule('iblock');
$arFilter = ['IBLOCK_ID' => 2, 'ACTIVE' => 'Y'];
$arSelect = ['ID', 'NAME', 'PREVIEW_TEXT'];
$res = CIBlockElement::GetList(['SORT' => 'ASC'], $arFilter, false, ['nTopCount' => 10], $arSelect);
while ($ob = $res->GetNext()) {
echo $ob['NAME'] . '
';
}
Минус: нет проверки полей, легко ошибиться в имени свойства. Также требуется ручное управление кешем через AddIdentity.
Ошибки:
- Неправильный ключ в фильтре: для свойств используется префикс PROPERTY_.
- Забыта загрузка модуля iblock.
Когда необходим прямой SQL запрос к базе данных?
Прямой запрос через \Bitrix\Main\Application::getConnection()->query() нужен для сложных выборок, которые невозможно выразить через ORM. Например, агрегатные функции с группировкой по нескольким таблицам.
$connection = \Bitrix\Main\Application::getConnection();
$sql = "SELECT ID, NAME FROM b_iblock_element WHERE IBLOCK_ID = 2 LIMIT 10";
$result = $connection->query($sql);
while ($row = $result->fetch()) {
echo $row['NAME'] . '
';
}
Важно: прямое использование SQL лишает переносимости при смене СУБД и требует экранирования входных данных.
Проблемы:
- Ошибки синтаксиса при переходе на другую базу данных.
- SQL-инъекции при неправильном конструировании запроса.
Как создать собственный компонент с наследованием от стандартного?
Создание компонента 2.0 позволяет расширять функционал ядра без изменения его файлов. Достаточно скопировать шаблон и добавить свою логику в class.php.
// в /local/components/mycompany/mycomponent/class.php
use Bitrix\Main\Engine\Contract\Controllerable;
class MyComponent extends \CBitrixComponent implements Controllerable
{
public function executeComponent()
{
$this->arResult['CUSTOM_VAR'] = 'Hello from custom component';
$this->includeComponentTemplate();
}
public function configureActions()
{
return [];
}
}
После создания компонент вызывается как $APPLICATION->IncludeComponent('mycompany:mycomponent', '', []).
Ошибки:
- Неправильное указание пространства имен или наследования.
- Забыт метод includeComponentTemplate().
Как добавить логику при сохранении элемента через обработчик события?
Событийная модель Битрикса позволяет выполнить код до или после операции. Пример обработчика OnBeforeIBlockElementAdd для валидации.
// регистрация в init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'iblock',
'OnBeforeIBlockElementAdd',
'myValidateElement'
);
function myValidateElement(&$arFields)
{
if (empty($arFields['NAME'])) {
global $APPLICATION;
$APPLICATION->throwException('Имя элемента обязательно');
return false;
}
}
Обработчики подходят для логирования, модификации полей или проверки прав.
Проблемы:
- Имена событий часто содержат опечатки.
- Глобальные переменные доступны, но их лучше избегать.
Расширенные примеры PHP кода в Битрикс
Пример 1: Создание элемента инфоблока с использованием D7 ORM.
use Bitrix\Iblock\Elements\ElementCatalogTable;
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$fields = [
'NAME' => 'Новый товар',
'IBLOCK_ID' => 2,
'ACTIVE' => 'Y',
'PREVIEW_TEXT' => 'Описание товара'
];
$result = ElementCatalogTable::add($fields);
if ($result->isSuccess()) {
$id = $result->getId();
echo "Элемент добавлен с ID: $id";
} else {
print_r($result->getErrorMessages());
}
Элемент добавлен с ID: 123
Пример 2: Работа с кешем в ORM. Принудительное отключение кеша для отдельного запроса.
$elements = ElementCatalogTable::getList([
'select' => ['ID', 'NAME'],
'cache' => ['ttl' => 0], // отключает кеш
])->fetchAll();
При ttl = 0 кеш не используется. Результат пустой массив при отсутствии данных.
Пример 3: Создание агента для ежедневного обновления.
// в файле /local/php_interface/agent.php
function customDailyUpdate() {
$connection = \Bitrix\Main\Application::getConnection();
$connection->queryExecute("UPDATE b_iblock_element SET TIMESTAMP_X = NOW() WHERE 1=1");
return "customDailyUpdate();";
}
// регистрация в админке: Агенты -> добавить с интервалом 86400
Функция возвращает строку для повторного выполнения.
Пример 4: Использование Highload-блоков через D7 ORM.
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\Loader;
Loader::includeModule('highloadblock');
$hlblock = HighloadBlockTable::getById(1)->fetch();
$entity = HighloadBlockTable::compileEntity($hlblock);
$entityDataClass = $entity->getDataClass();
$result = $entityDataClass::getList(['select' => ['*']]);
while ($row = $result->fetch()) {
print_r($row);
}
Массив с данными записи из Highload-блока.