Ответы пользователя по тегу 1С-Битрикс
  • Как написать обновление для модуля Битрикс?

    Ge1i0N
    @Ge1i0N
    Если модуль локальный, и обновление через маркет не подходит, то как вариант - написать функцию что заберет и перекинет файлы куда надо и просто вызвать её из php-консоли, через агента или еще как-то в зависимости от сложности обновления.
    Также никто не запрещает вызвать класс инсталлятора модуля и руками заново запустить функцию установки не удаляя его.
    Ответ написан
    Комментировать
  • Как настроить 301 редирект в битрикс 1 с чтобы /index.php перенаправлялось на /?

    Ge1i0N
    @Ge1i0N
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ https://tagil-steel.ru/ [R=301,L]
    Ответ написан
    Комментировать
  • Как в битриксе один элемент расположен в двух разделах без привязки?

    Ge1i0N
    @Ge1i0N
    Переношу из комментариев в ответ:

    В селекторе битрикса иногда есть баг, когда не показано какие пункты выделены, и выделение отображается только при фокусе на элементе.
    Можете через Ctrl кликнуть в какой-нибудь раздел селектора чтобы не слетели старые привязки и перепроверить что там точно нет выделенных разделов.
    Ответ написан
    Комментировать
  • Как заблокировать обновление моего решения, если например: версия PHP ниже?

    Ge1i0N
    @Ge1i0N
    Нужно добавить в updater.php модуля код проверки версии того, что нужно.
    Например, для проверки версии php:
    $isLowPhpVersion = version_compare(phpversion(), '8.0.0', '<');
    if ($isLowPhpVersion) {
        $errorMessage = 'Module require php 8.0 or higher.';
        return false;
    }

    Важно учесть, что updater.php не позволяет работать со строками локализации, текст ошибки нужно спразу писать на том языке, который нужен.

    Также, нужно иметь в виду, что модуль может не только быть обновлен до нужной версии, но сразу скачан последней версии - нужно также вставить проверку при установке модуля, например добавив что-то такое в DoInstall в install.php модуля:
    global $APPLICATION;
    \Bitrix\Main\Localization\Loc::loadMessages(__FILE__);
    
    $isLowPhpVersion = version_compare(phpversion(), '8.0.0', '<');
    if ($isLowPhpVersion) {
        $APPLICATION->ThrowException(\Bitrix\Main\Localization\Loc::getMessage('CHECK_PHP_VERSION_ERROR'));
        return false;
    }
    Ответ написан
    3 комментария
  • Как в Bitrix разместить свой пункт в административном меню не в меню "Сервисы" через файл .left.menu.php?

    Ge1i0N
    @Ge1i0N
    Не нужно трогать файлы ядра.
    Используйте событие OnBuildGlobalMenu и будет вам счастье.
    В своих модулях и того проще, если посмотреть документацию по созданию модулей.
    Ответ написан
    1 комментарий
  • Как начать работать с битрикс в докере?

    Ge1i0N
    @Ge1i0N
    В целом, конечно, лучше разобраться с докером чтобы потом было проще.
    Но если неймётся - на гитхабе есть много готовых сборок.
    Например эта. Можете расковырять чтобы понять как они работают.
    Ответ написан
    Комментировать
  • Как вывести кастомные настройки битрикс Option в админку?

    Ge1i0N
    @Ge1i0N
    Готовое бесплатное решение в маркете - mpm.options
    Ответ написан
    Комментировать
  • Как добавить css-класс ТОЛЬКО в визуальном редакторе Битрикса?

    Ge1i0N
    @Ge1i0N
    Вы можете добавить свои отдельные стили которые будут только в редакторе работать, но не на сайте: официальная инструкция.
    Ответ написан
    Комментировать
  • Как отметить чекбокс у свойства товара в Битрикс если есть картинка?

    Ge1i0N
    @Ge1i0N
    Взять событие OnBeforeIBlockElementUpdate или OnAfterIBlockElementUpdate, повешать на него функцию-обработчик.
    В функции вставить все нужные проверки на то, что обновляется товар из нужного инфоблока и подобные, затем вставить проверку на наличие картинки, где по её результату будет записываться в нужное вам свойство нужное значение.
    Это для новых отредактированных товарах будет работать.
    Чтобы все товары получили нужное значение здесь и сейчас нужно либо написать скрипт, который пробежит по ним и автоматом дернет сохранение чтобы свойство проставилось, либо пройти и что-нибудь изменить в товарах руками в админке.
    Ответ написан
    Комментировать
  • Как правильно сделать триггер в для триггерной рассылки?

    Ge1i0N
    @Ge1i0N
    Есть хорошая статья на эту тему. Немного устарела, но суть осталась прежняя: https://dev.1c-bitrix.ru/community/blogs/silaev/ma...

    Отлаживать очень сложно, так как по времени должен быть запуск

    Если триггер активирован - он создаёт агента.
    Можно либо править время запуска агента, либо вызывать его код запуска руками.

    Ниже привожу обрезанный код работающего триггера с проекта.

    Вешаете на событие обработчик:
    AddEventHandler("sender",  "OnTriggerList",  ["EventListener", "onTriggerList"]);


    Затем вызываете ваш триггер:
    use Bitrix\Main\Event;
    
    class EventListener
    {
     public static function OnTriggerList(Event $event): Event
        {
            Handlers\Sender\MyTrigger::addTriggerInList($event);
    
            return $event;
        }
     }


    Код обработчика примерно такой:
    namespace  Handlers\Sender;
    
    use Bitrix\Main\Event;
    use Bitrix\Main\Loader;
    use Bitrix\Main\Localization\Loc;
    use Bitrix\Main\EventResult;
    use Bitrix\Sender\Trigger\TriggerConnectorClosed;
    
    Loc::loadMessages(__FILE__);
    
    Loader::includeModule('sender');
    
    class MyTrigger extends TriggerConnectorClosed
    {
        public static function addTriggerInList(Event &$event): Event
        {
            $event->addResult(new EventResult(0, [
                'TRIGGER' => [
                    'Handlers\Sender\MyTrigger' 
                ]
            ]));
    
            return $event;
        }
    
        public function getName(): string
        {
            return 'TriggerName';
        }
    
        public function getCode(): string
        {
            return 'my_trigger';
        }
    
        public static function canBeTarget(): bool
        {
            return false;
        }
    
        public function filter(): bool
        {
            $this->recipient = [];
    
            //  Тут какая-то логика на поиск людей по нужным параметрам
    
            $this->recipient[] = [
                 'EMAIL' => $user['EMAIL'],
                 'NAME' => $user['NAME'],
                 'USER_ID' =>  $user['ID'],
            ];
      
            if (!empty($this->recipient)) {
                return true;
            } else {
                return false;
            }
        }
    
        public function getForm(): string
        {
            return ' '; // Тут форма с параметрами которые можно выбирать при создании триггера, если нужно.
        }
    
        public function getRecipient()
        {
            return $this->recipient;
        }
    
        public static function getPersonalizeList(): array
        {
            return [];
        }
    }


    Главное учтите, что если триггер будет запускаться через Cron, а в его коде есть какие-то методы и классы которые подключаются через composer, то путь к автолоадеру должен быть прописан абсолютный, а не через $_SERVER["DOCUMENT_ROOT"] - иначе не будет отрабатывать триггер.
    Ответ написан