Примеры небольших, но часто крайне полезных php сниппетов для Битрикса.
Bitrix CMS:
Набор полезных рецептов для Bitrix
Иногда может потребоваться принудительно обновление данных в фасетном индексе Битрикса, делается это просто:
\Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex(IBLOCK_ID, $id);
Это позволить удобно расположить свой обработчик, например, в файл local/modules/myTools/lib/EventHandlers/Bitrix/Iblock/OnBeforeIBlockElementUpdate.php
<?php namespace myTools\EventHandlers\Bitrix\IBlock; use myTools\Tools\Events\BaseEvent; class OnBeforeIBlockElementUpdate extends BaseEvent { /** * @eventSort 100 */ public static function myEventHandler(&$arFields) { //код первого обработчика if($arFields["IBLOCK_ID"]==1 && is_Array($arFields["PROPERTY_VALUES"])){ \myTools\Catalog::ChangeSection1C($arFields, 1, 60, 5); } ... } /** * @eventSort 200 */ static function ChangeAddPicName(&$arFields) { $arFields = \myTools\Catalog::ChangeAddPicName($arFields); ... } static function osAddIdToQueue(&$arFields){ $sLog = date("Y-m-d H:i:s") . PHP_EOL; $sLog .= 'IBLOCK_ID:' . $arFields["IBLOCK_ID"] . PHP_EOL; $sLog .= 'PRODUCT_ID:' . $arFields["ID"] . PHP_EOL; file_put_contents($_SERVER['DOCUMENT_ROOT']."/local/log/so_OnBeforeIBlockElementUpdate.txt", $sLog, FILE_APPEND); if($arFields["IBLOCK_ID"]==1){ //$e = new \myTools\Opensearch\QueueIndex(); //$e->addIds([$arFields["ID"]]); $result = \myTools\Opensearch\QueueTable::add(['IBID'=>1, 'PRODUCT_ID'=>$arFields["ID"]]); } elseif($arFields["IBLOCK_ID"]==178){ //$e = new \myTools\Opensearch\QueueIndex(); //$e->addIds([$arFields["ID"]]); $result = \myTools\Opensearch\QueueTable::add(['IBID'=>178, 'PRODUCT_ID'=>$arFields["ID"]]); } } }
Как сбросить пароль администратора bitrix
Способ работает, только если есть доступ к файловой системе.
Допустим, что у нас есть раздел Сервис (IBLOCK_ID = 50) и у него несколько подразделов. Один из них, например, акции (SECTION_ID = 44).
Компонент bitrix:news.list не принимает параметр SECTION_ID. Но есть способ решить эту проблему.
В какой-то "прекрасный" момент начали поступать жалобы, что письма с сайта не всем приходят. При более детальном рассмотрении, оказалось, что не приходят только на ящики @gmail.com.
В логах по ним было сообщение: Messages missing a valid messageId header are not 550 5.7.1 accepted., оказалось, что с сайта уходят письма без заголовка Message-ID.
Появилась задача сделать копию сайта без персональных данных клиентов, для передачи ее третьим лицам.
При обновлении Битрикса получил ошибку:
MySQL Query Error: CREATE TABLE b_sale_cashbox_check_correction( ID int(11) unsigned not null auto_increment, CHECK_ID int(11) not null, CORRECTION_TYPE varchar(50) not null, DOCUMENT_NUMBER varchar(35) not null, DOCUMENT_DATE date not null, DESCRIPTION varchar(255) default '', CORRECTION_PAYMENT text default '', CORRECTION_VAT text default '', PRIMARY KEY (ID) ) [[1101] BLOB, TEXT, GEOMETRY or JSON column 'CORRECTION_PAYMENT' can't have a default value]
Решение - нужно создать эту таблицу "руками":
CREATE TABLE b_sale_cashbox_check_correction( ID int(11) unsigned not null auto_increment, CHECK_ID int(11) not null, CORRECTION_TYPE varchar(50) not null, DOCUMENT_NUMBER varchar(35) not null, DOCUMENT_DATE date not null, DESCRIPTION varchar(255) default '', CORRECTION_PAYMENT text, CORRECTION_VAT text, PRIMARY KEY (ID) )
Частая проблема письма с сайта не доходят и не всегда понятно, проблема в сайте, хостинге, промежуточных сервисах или даже конечном ящике получателя. В данной заметке расскажу как можно проверить, что письма ушли из Битрикса.
Отправка писем, попадет в журнал событий Битрикса. Хранятся все события в таблице b_event, посмотреть значения можно через Настройки - Производительность - Таблицы (/bitrix/admin/perfmon_table.php?lang=ru&table_name=b_event)
Для событий отправки писем нужно смотреть на поле SUCCESS_EXEC Возможные статусы:
SUCCESS_EXEC = Y — сообщение отправлено.
SUCCESS_EXEC = N — не обработано событие (а значит не отправлено)
SUCCESS_EXEC = 0 — не найден шаблон (указан не верный шаблон)
SUCCESS_EXEC = F — надо смотреть логи отправки сервера или хостинга.
Основное на что стоит обратить внимание, что SUCCESS_EXEC = N не значит, что письмо вообще не оправлено, это текущий статус, и если отправка настроена на cron (по расписанию) или на хиты, то нужно подождать перед тем, как проверять статус!
Часто бывает нужно вывести в определенном месте содержимое какого-либо файла, require в случаи Битрикса это плохая идея, т.к. такие области нельзя будет редактировать через WYSIWYG-редактор.
Поэтому стоит использовать:
<?$APPLICATION->IncludeFile(SITE_DIR . "include/contacts.php", Array(), Array("MODE"=>"html"));?>