Блог о 1C-Битрикс, MODX и OpenCart

composer require и ошибка error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

При добавлении любого пакета, командой composer require, композер стал валиться с ошибкой.

Гуглились в основном решения с указанием файлов сертификатов в php.ini в опциях openssl.cafile и curl.cainfo.

Мне помогло простое решение:

Узнать больше

Пишем xml-строку в логи monolog без пробелов между xml-узлами

Если мы хотим записать xml-строку в логи с помощью пакета monolog, то строка запишется в одну строку с пробелами между xml-узлов.

Код решает эту проблему:

dlog(
    sprintf('xml response: "%s"', trim(
        call_user_func(
            function (\SimpleXMLElement $xml) {
                $dom = new \DOMDocument('1.0');
                $dom->preserveWhiteSpace = false;
                $dom->loadXML($xml->asXML());
                return $dom->saveXML();
            },
            $xml
        )
    ))
);

Под катом объяснение и пример.

Узнать больше

OrderHelper — класс-хелпер с аналогами методов классов CSaleOrder и CSaleOrderPropsValue для 1С-Битрикс

Написал класс-хелпер, в котором набор методов-аналогов классов CSaleOrder и CSaleOrderPropsValue с логированием ошибок, успешного сохранения, бэктрейсом. Для логирования используется логгер monolog.

Доступны методы:

\Olegpro\Helpers\OrderHelper::cancelOrder($orderId, string $value, string $comment = '', $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setOrderPropertySingle($orderId, $code, $value, $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setOrderPropertyMultiply($orderId, array $values, $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setOrderField($orderId, $fieldName, $fieldValue, $silenceMode = true): bool
 
\Olegpro\Helpers\OrderHelper::setShipmentField($orderId, string $deliveryCode, string $fieldName, $fieldValue, $orderDeliveryId = null, $silenceMode = true): bool

Все методы подразумевают использование вне цикла сохранения заказа (внутри каждого используется \Bitrix\Sale\Order::save). Это важно учитывать или можно получить циклический вызов обработчиков ядра (но если сильно надо — то можно и обойти).

У всех последним параметром есть $silenceMode = true. Если его передать в false, то будет выкинуто исключение OrderHelperException.

С хелпером OrderHelper этих мамонтов можно забыть:

  • CSaleOrder::PayOrder
  • CSaleOrder::CancelOrder
  • CSaleOrder::StatusOrder
  • CSaleOrderPropsValue::Add
  • CSaleOrderPropsValue::Update
  • CSaleOrder::Update
Узнать больше

1C-Битрикс. Получить список всех родителей элемента инфоблока на новом API D7

Код:

<?php
 
use Bitrix\Iblock\SectionTable;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\Loader;
use Bitrix\Main\SystemException;
 
if (!Loader::includeModule('iblock')) {
    throw new SystemException(
        'Ошибка подключения модуля информационных блоков'
    );
}
 
$elementId = 100;
 
$element = ElementTable::getRow([
    'select' => [
        'IBLOCK_SECTION_ID',
    ],
    'filter' => [
        '=ID' => $elementId,
    ],
]);
 
if ($element !== null) {
 
    $parentSections = [];
 
    $parentSectionIterator = SectionTable::getList([
        'select' => [
            'SECTION_ID' => 'SECTION_SECTION.ID',
            'IBLOCK_SECTION_ID' => 'SECTION_SECTION.IBLOCK_SECTION_ID',
        ],
        'filter' => [
            '=ID' => $element['IBLOCK_SECTION_ID'],
        ],
        'runtime' => [
            'SECTION_SECTION' => [
                'data_type' => '\Bitrix\Iblock\SectionTable',
                'reference' => [
                    '=this.IBLOCK_ID' => 'ref.IBLOCK_ID',
                    '>=this.LEFT_MARGIN' => 'ref.LEFT_MARGIN',
                    '<=this.RIGHT_MARGIN' => 'ref.RIGHT_MARGIN',
                ],
                'join_type' => 'inner'
            ],
        ],
    ]);
 
    while ($parentSection = $parentSectionIterator->fetch()) {
        $parentSections[$parentSection['SECTION_ID']] = $parentSection;
    }
 
    echo '<pre>';print_r($parentSections);echo '</pre>';
 
} else {
    throw new SystemException(
        sprintf('Элемент с ID "%d" не найден', $elementId)
    );
}

Скорее всего ID секции элемента у вас уже есть, но на всякий случай я отталкиваюсь от знания только ID элемента.

Узнать больше

1С-Битрикс. Сбрасываем кеш инфоблоков, если наступило время активации или деактивации скидок каталога

Писал на одном проекте агент, который следит за скидками каталога и если подошло время акции или деактивации скидки, то сбрасывает кеш нужных инфоблоков или же всего сайта.

Решил поделиться, так как этот кейс нередко просят добавить.

Узнать больше

1С-Битрикс. Модифицирование таблицы товаров в форме заказа в админке

Речь пойдёт о новом сконвертированном магазине и новой форме просмотра/редактирования заказа в нём.

Суть задачи в том, что фотографии товаров хранятся не в привычных свойствах битрикса, а в собственном CDN.

Узнать больше