• Скрыть блок в Bitrix?

    Мало данных но я попробую. В компонент, который отображает этот блок, нужно передавать в качестве параметра, значение поля пользователя.
    Тогда вы будете иметь 3 раздельных кэша компонента - для неавторизованных пользователей (значения нет), для пользователя со значением 1 и отдельно для пользователя со значением 2.
    Таким образов в шаблоне компонента вы можете использовать простой if, проверяя ключ $arParams в который передаете значение пользовательского поля.
    Это самый простой способ в лоб.
    Ответ написан
  • Как правильно защитить форму от спама?

    Убрать форму из страницы. Генерировать ее js'ом только когда пользователь ткнул в кнопку.
    Ответ написан
  • Почему не работает urlrewrite на втором домене?

    Suntechnic
    @Suntechnic Автор вопроса
    Сам спросил - сам отвечаю:

    Алиасы для сайта в настройках апач следует прописать не только в /etc/httpd/bx-scale/conf/ext_site.my.conf, но и в /etc/httpd/bx/conf/bx_ext_site.my.conf
    Ответ написан
    Комментировать
  • Как получить выбранную систему доставки из заказа?

    Suntechnic
    @Suntechnic Автор вопроса
    Эх... как обычно. Сам спросил - сам отвечаю:
    Я не верно понимал как службы доставки назначаются заказу. Точнее я думал что заказу так или иначе назначается какая-то одна конкретная служба. Однако это не так - к заказу добавляются отгрузки. Причем их может быть сколько угодно. Отгрузкам уже соответствую службы доставки.

    Т.е. если мы хотим понять есть ли у заказа наша служба доставки, мы должны проверить есть ли у заказа хотя бы одна отгрузка основанная на нашей службе:
    foreach($order->getShipmentCollection() as $shipment) { // перебираем отгрузки
                $delivery = $shipment->getDelivery(); // получаем систему доставки
                if (get_class($delivery) == 'Класс\Хендлера') { // эта наша система?
                    // тут какой-то код, который нам нужно выполнить если есть наша СД
                }
            }
    Ответ написан
    Комментировать
  • Умный фильтр не работает в корне каталога с ЧПУ, как можно исправить?

    Умный фильтр работает только в разделе каталога.
    Есть вроде параметр SHOW_ALL_WO_SECTION или как-то так, но с ЧПУ это не работает.
    Ответ написан
  • Как работает резервное копирование в Битрикс24?

    Ну там же есть сноска.

    Пункт "с агентами на cron" означает что РК будет выполнятся на агентах если они перенесены на крон. Никаких отдельных скриптов в крон добавлять не нужно. Достаточно выполнить эту инструкцию: https://dev.1c-bitrix.ru/learning/course/?COURSE_I...

    Третий пункт означает что вы сами настроите запуск /bitrix/modules/main/tools/backup.php. Каким образом это уже ваше дело.
    Ответ написан
    4 комментария
  • Как использовать ajax интерфейс модуля, для не авторизованного пользователя?

    Suntechnic
    @Suntechnic Автор вопроса
    Сам спросил - сам отвечаю:

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

    На практике достаточно удалить дефолтный фильтра авторизации из для экшена который должен работать для неавторизованных пользователей. Сделать это можно в например в методе init вашего контроллера:

    protected function init()
    	{
            parent::init();
            
            $this->setActionConfig('apply',[
                '-prefilters' => [
                        '\Bitrix\Main\Engine\ActionFilter\Authentication'
                    ]
                ]);
    		
    	}
    
        
        public function applyAction()
        {

    Здесь мы говорим что из префильтров контроллера apply нужно удалить \Bitrix\Main\Engine\ActionFilter\Authentication
    Ответ написан
    1 комментарий
  • Как востановить БД из сырых файлов таблиц?

    Suntechnic
    @Suntechnic Автор вопроса
    Сам спросил - сам отвечаю:
    Понадобятся не только файлы БД но и файлы ib_logfile0 и ib_logfile1.
    Вообще если есть папка всей БД, то самый простой путь, по которому я и пошел:
    1 Создать отдельный сервер mysql/mariadb
    2 Остановить сервер
    3 Заменить папку сервера на ту что есть у вас (у меня это была /var/lib/mysql, содержимое которой я заменил на содержимое /var/lib/mariadb-10.3)
    4 Исправить права рекурсивно на папку.
    5 Запустить сервер баз данных
    6 Слить нужную базу чере mysqldump

    Радоваться.
    Ответ написан
    Комментировать
  • Почему могут быть медленными файловые операции PHP?

    Suntechnic
    @Suntechnic Автор вопроса
    Сам спросил, сам отвечаю:

    На результат теста сильно влияет вложенность документрут сайта, так как при open системный вызов lstat вызывается рекурсивно для всего пути, если файл не существует. Подробнее: https://www.linux.org.ru/forum/web-development/164...

    Таким образом нет смысла опираться на данные этого теста, так как сайт редко создает несуществующие файлы, разве что при создании файлов кэша. Операция include, не подвержена этой проблеме и вложенность не имеет никакого значения при ней. Так что нет смысла переносить документрут повыше в дереве файловой системы.
    Ответ написан
    Комментировать
  • Битрикс АПИ. Как вывести по одному элементу из разных разделов инфоблока?

    Забудьте про группировки.

    Вероятнее всего простой перебор разделов и GetList для каждого будет намного быстрее любой попытки сконструировать общий запрос.
    Решение не элегантное, не красивое, но быстрое, понятно и рабочее - просто перебирайте разделы и делайте GetList для каждого с лимитом 1 и сортировкой по ID - это будут очень простые и быстрые запросы.

    Мне кажется всегда стоит помнить, что ваш код должен работать, а не висеть в рамке на стене галереи искусств.
    Ответ написан
    4 комментария
  • Как найти, где переопределяются метатеги на детальной странице товара битрикс?

    Скорее всего в компоненте детального вида, либо в его шаблоне в component_epilog.php
    Ответ написан
    Комментировать
  • Как избежать спагетти-кода в result_modifier?

    Нет необходимости делать в виде модуля нечто под отдельный проект.
    Я делаю так (и не редко встречают похожий подход):
    В /local/php_interface/lib размещаю классы реализующие некоторую функциональность конкретного проекта, и подключаю его с помощью автозагрузки composer:
    60fb43892d58e809635873.png
    Тут можно разместить и классы реализующие модуль и просто обычные хелперы - не вижу ничего плохого в процедурном подходе, если все идеи реализованы в виде простых, коротких и минимально функциональных чистых статических методах.
    Ответ написан
    2 комментария
  • Как получить доступ к репозиториям подмодулей?

    Suntechnic
    @Suntechnic Автор вопроса
    Частично ответ такой:

    Создаем отдельные ssh ключи для каждого репозитория и обавляем их как ключи для деплоя.
    Создаем файл .ssh/config вида:
    Host github.com-repo-1
            Hostname github.com
            IdentityFile=/home/bitrix/.ssh/id_rsa-repo-1
    Host github.com-repo-2
            Hostname github.com
            IdentityFile=/home/bitrix/.ssh/id_rsa-repo-2
    Host github.com-repo-3
            Hostname github.com
            IdentityFile=/home/bitrix/.ssh/id_rsa-repo-3


    Далее клонируем репозиторий используя ключ развертывания:
    git clone git@github.com-repo-1:Author/repo.git .

    Далее изменяем локально URL доступа к репам подмодулей:
    git config submodule.local/sources.url git@github.com-repo-2:Author/repo2.git

    и тогда уже делаем:
    git submodule init
     git submodule update


    Однако почему Permission denied для публичного резпозитория, и зачем ему ключ деплоя и что делать если публичная репа будет не моя, я так и не понял :(
    Ответ написан
  • Как проверить заходили ли уже с данного устройства?

    cookie и это единственный вариант (можно сессии, потому что сессии это тоже куки).
    cookie придуманы именно для этих целей и если пользователь их удалил, значит он не хочет чтобы вы знали, что он посещал ваш сайт. Это его право - уважайте его.
    Ответ написан
    Комментировать
  • Как изменить значение Активность с помощью API?

    Тут всего два варианта:
    1 Неверное условие и $enum_fields['XML_ID'] никогда не равно 'true' (было бы странно если бы было равно).
    2 Условие верное и товар с XML_ID== 'true' есть, но на событии АфтеАпдейт, стоит обработчик который меняет значение на N, деактивируя товар.
    Ответ написан
    Комментировать
  • Как писать api на битриксе для работы с node.js фронтендом\мобильным api?

    Ну наверное можно предложить 2 подхода:

    1 Юзать новый ajax компонентов, т.е. писать свои компоненты, в которых реализовывать бизнес-логику и использовать встроенный механизм для обращения к ним с фронта. Вот статья кратенькая: https://verstaem.com/ajax/new-bitrix-ajax/

    2 Тупо, в лоб писать скрипты api. Просто скрипты которые просто используют внутренний API проекта, а уже всю логику реализовывать в этом внутреннем API.
    Сами скрипты получаются примерно такие, какие-то:
    <?
    require('.prolog.php');
    // добавляем в избранное
    	$favorites = \Model\Favorites::getInstance();
    if ($_REQUEST['add']) {
    	
    	$favorites->add2Fav(intval($_REQUEST['add']));
    } elseif ($_REQUEST['remove']) {
    	$favorites->remove2Fav(intval($_REQUEST['remove']));
    } elseif (strlen(trim($_REQUEST['note'])) && $_REQUEST['fav']) {
    	$favorites->note2Fav(intval($_REQUEST['fav']),trim($_REQUEST['note']));
    }
    
    $arResult['appdata']['user'] = \Model\User::getInstance()->getData();
    
    require('.epilog.php');


    Первый подход стильный, модный, молодежный, но и во втором нет ничего криминального, как мне кажется.

    В конце концов хочу получить 2 репы, которые ничего друг о друге не знают и общаются через api, сгенерированное тем же Swagger

    Классно когда на такие штуки есть бюджет.
    Ответ написан
    Комментировать
  • Присвоить div'у класс если открыта главная страница Bitrix?

    Ужасный способ - никогда так не делайте.
    Таким подходом вы превращаете систему управления контентом в систему управления страницами.

    Какая разница по какому URL открыта ваша страница? Страница должна открываться корректно в независимости от url.

    Если ваши div внутри этой страницы - просто пропишите им классы.

    Если ваши div внутри какого-то компонента который вызывается из скрипта страницы и из других мест - просто добавьте в компонента параметр в котором передавайте дополнительный класс.

    Если ваши div лежат за пределами скрипта страницы (я так подозреваю что это скорее всего ваш случай) используйте отложенные функции:

    <div id="one" class="someClass <?=$APPLICATION->ShowProperty('color_class')?>">


    И в странице:
    <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    $APPLICATION->SetPageProperty('color_class', 'green');
    ?>
    Ответ написан
    Комментировать
  • Композитный сайт и $frame->beginStub()?

    Вангую что проблема вовсе не в композите, а в js слушателях которые традиционно навешиваются по событию готовности страницы.
    В итоге у вас сначала грузится статическая часть кэшированная композитом, потом срабатывают скрипты. Потом подргужается блок с кнопкой. Но так как скрипты уже отработали когда кнопки не было, то и никакой слушатель за нее не зацепился. А когда кнопка появилась в странице, поезд со слушателями уже давно ушел.

    js не должен полагаться на готовность DOM который не создается им самим, как за многие годы многих приучил делать jQuery.
    Если события назначаются элементам DOM это должен делать тот кто создают html. Если, в данном случае, html создается на сервере с помощью PHP, то и события пусть назначаются на сервере прямо в этом html.
    Ответ написан
    2 комментария
  • Как переместить значения из result modifier?

    Список новостей разместил в result modifier

    Так делать нельзя - в result modifier не должно быть никакого вывода, так как в случае отображения из кэша он не выполняется.

    подскажите как мне вывести массив новостей со свойствами в разметку компонента Элементы раздела?

    Переместить список новостей в template.php, в нужное место в разметке.
    Ответ написан
    Комментировать
  • Как связать приложение в битрикс через push and pull?

    Вот как у меня:

    Пользователь подписыается на события связанные с объектом $dctList['UUID']:
    \CPullWatch::Add($UserID, $dctList['UUID']);

    Отправляем уведомление всем пользователям при событии связанным с объектом с индентификатором $list_uuid
    \CPullWatch::AddToStack($list_uuid,
    				Array(
    					'module_id' => 'list',
    					'command' => 'exchange',
    					'params' => [
    							'provocative' => $dctData['head']['UID'],
    							'list_uuid'=> $list_uuid
    						]
    				)
    			);


    загрузка модуля:
    BX.loadScript('/bitrix/js/pull/protobuf/protobuf.js', ()=>{
    					BX.loadScript('/bitrix/js/pull/protobuf/model.js', ()=>{
    							BX.loadScript('/bitrix/js/rest/client/rest.client.js', ()=>{
    									BX.loadScript('/bitrix/js/pull/client/pull.client.js',()=>{APP.bitrixreinit._pullinit()});
    								});
    						});
    				});


    Подписка на события в методе _pullinit:
    // подписываемся на события P&P
    		BX.addCustomEvent("onPullEvent", function(module_id,command,params) {
    			
    			if (APP.getConfigParam('uid') == params.provocative) {
    				//if ('production' != APP.getConfigParam('mode')) console.log('собственное событие пропущено');
    				return;
    			}
    			if ('exchange' == command) {
    				APP.exchange({basis: 'pull', context: params});
    			}
    		});
    
    		BX.addCustomEvent("onPullStatus", function(status) {
    			if ('online' != APP.$store.state.status.push_and_pull
    					&& 'online' == status) {
    				// не онлайн сменился на онлайн
    				//let last_sync_time = APP.$store.state.db.sync.last.time.client || 0
    				//let now_time = Date.now()/1000
    				//if (now_time - last_sync_time < 30) {
    				//	
    				//} else {
    				//	
    				//}
    				APP.exchange({basis: 'reconnect'});
    			}
    			APP.$store.commit("updateStatus",{key:'push_and_pull',data:status})
    		});
    		
    		BX.PULL.start();
    Ответ написан
    Комментировать