PHP код для Битрикс от основ до продвинутых техник

Раздел: Веб-разработка -> CMS

Основное решение: использование 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-блока.

PHP код для Битрикс - comments

En
битрикс php код (php)