Bitrix+Aspro: ошибка открытия модальных окон на телефонах iphone

Симптомы: на всех устройствах кроме iphone модальные окна открываются корректно, по коду вида:

<a href="#" class="button button-high button-orange" data-event="jqm" data-param-id="22" data-name="zayavka_na_konservi">Заказать</a>

На айфонах же, по нажатию на кнопку, идёт переадресация на страницу обработки формы.

Решение:

А пока костыльное, т.к. причину пока так и не нашел. Исследование привело к general.js ядра bitrix, в котором идёт проверка вида:

if(window.matchMedia('(min-width:992px)').matches){
...
}

И на айфонах она не проходит никогда. Есть подозрение, что проблема в свойствах css. Пока пофиксил просто отключением этой проверки.

Всплывающее окно на Битрикс «Управление сайтом»

Хм..вот плохо иногда быть самоучкой по методу научного тыка. Для некоторых вещей изобретал велосипед при наличии штатного функционала. Ранее всплывающие окна отрисовывал в стиле bootstrap, а оказывется для этого есть штатные вещи. Далее пример окна:

  popup_warning = BX.PopupWindowManager.create("popup-message", BX('element'), {
            content: 'Показания по всем радостям не записаны!',
            width: 300, 
            height: 200,
            zIndex: 100,
            closeIcon: {opacity: 1},
            titleBar: 'Внимание!',
            closeByEsc: true, 
            darkMode: false, 
            autoHide: false, 
            draggable: true, 
            resizable: true, 
            min_height: 100, 
            min_width: 100, 
            lightShadow: true, 
            overlay: {backgroundColor: 'black',opacity: 500}, 
            buttons: [
                new BX.PopupWindowButton({
                    text: 'Понятно', 
                    id: 'ok-btn', 
                    className: 'ui-btn ui-btn-success',
                    events: {
                      click: function() {
                          popup_warning.close()
                      }
                    }
                })
            ],
            events: {
               onPopupShow: function() {                                 
               },
               onPopupClose: function() {
               }
            }
        });

Подсмотрено тут

Устранение ошибок Битрикс после обновления PHP до 8.2

Выпала задача обновить на одном из сайтов PHP с 7.3 до 8.2. на операционной системе RedOS. Далее что делал.

Обновление PHP

dnf install php81-release
dnf clean all
dnf makecache
dnf update php

Обновление БД

alter table b_iblock_element_property modify ID bigint not null auto_increment;

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

После чего лично у меня стала вылезать ошибка вида:

count(): Argument #1 ($value) must be of type Countable|array, null given (0)
/var/www/html/bx-site/bitrix/templates/aspro-allcorp2/components/bitrix/news.detail/services/component_epilog.php:21

На строки в коде вида:

<?if(count($templateData['GALLERY_BIG'])):?>

А всё просто. Если в PHP 7.3 допустимо было так обращаться к переменным не являющимися массивами, то в PHP 8.2, где введено более строгое отношение к типизации, так уже нельзя. Поэтому все подобные конструкции нужно заменить на вида:

<?php
$templateData['GALLERY_BIG'] = (array)$templateData['GALLERY_BIG'];
if(count($templateData['GALLERY_BIG'])):
....
?>

Ну или я просто поискал все подобные конструкции которые встречаются в файле и в шапку добавил:

$templateData['VIDEO'] = (array)$templateData['VIDEO'];
$templateData['VIDEO_IFRAME'] = (array)$templateData['VIDEO_IFRAME'];
$templateData['GALLERY_BIG'] = (array)$templateData['GALLERY_BIG'];
$templateData['LINK_SALE'] = (array)$templateData['LINK_SALE'];
$templateData['LINK_NEWS'] = (array)$templateData['LINK_NEWS'];
$arElement['PROPERTY_LINK_STAFF_VALUE'] = (array)$arElement['PROPERTY_LINK_STAFF_VALUE'];

Сброс пароля Bitrix

Для того чтобы сбросить пароль у известного пользователя и известным ID, достаточно в корне сайта разместить файл:

r.php

<?php
$USER_ID=111;
$pass="123";
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$user = new CUser;
$fields = Array("PASSWORD" => "$pass", "CONFIRM_PASSWORD" => "$pass");
$user->Update($USER_ID, $fields);
if($user->LAST_ERROR) {
echo $user->LAST_ERROR;
} else {
echo "Password successfully changed!";
}
?>

Вместо 111 — вставить ID пользователя из БД. Вместо 123 — свой пароль. Далее открыть этот файл через браузер. После смены пароля естественно файл нужно удалить

Bitrix: Request is not XHR

В одном из проектов, скрипт парсит сайт на bitrix. С какого то момента, при установке параметров таблицы отдаваемой по ajax, стала выводиться ошибка «Request is not XHR». Быстрый гуглинг решения не дал. Стал кропотливо сравнивать заголовки которые отдаются запросом в браузере и заголовки который отдавал в скрипте. Отличие нашлось относительно быстро, страница на сайте добавляла дополнительный заголовок «Bx-ajax:true». В результате модифицировал скрипт следующим образом:

        $custom_header=[];
        $custom_header[]="Access-Control-Allow-Origin: *";
        $custom_header[]="Accept: */*";
        $custom_header[]="Bx-ajax:true";
        $res=$this->request("/bitrix/components/bitrix/main.ui.grid/settings.ajax.php?GRID_ID=".$grid_id."&bxajaxid=".$bxajaxid."&action=setSort",$param,"POST",true,$custom_header);        
        var_dump($res);

Сама функция запроса уже устоялась, и при таскании из скрипта в скрипт у меня выглядит так::

 public function request($query,$param,$type="POST",$headers=false,$custom_header=[],$follow_location=true) {
        $url=$this->url.$query;
        if ($this->debug==true){echo "URL:$url\n";};
        $ch = curl_init($url);        
        curl_setopt($ch, CURLOPT_VERBOSE, $this->debug);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $follow_location); 
        if ($headers==true){
            curl_setopt($ch, CURLOPT_HEADER, 1);
        };
        if ($type=="POST"){
            curl_setopt($ch, CURLOPT_POST, 1);        
            curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
            if ($this->debug==true){
                echo "---------------- POST -------------\n";
                var_dump($param);
                echo "-----------------------------------\n";
            };
        };        
        if (count($custom_header)>0){          
          curl_setopt($ch, CURLOPT_HTTPHEADER, $custom_header);  
          if ($this->debug==true){
            echo "---------------- HEADER -------------\n";            
            var_dump($custom_header);
            echo "-----------------------------------\n";
          };
        };
        if (count($this->cookies)>0){
            $str_cook="";
            foreach ($this->cookies as $key=>$value) {
             $str_cook=$str_cook.$key."=".$value.";";   
            };
            if ($this->debug==true){
                echo "COOKIE:$str_cook\n";  
            };

            curl_setopt($ch, CURLOPT_COOKIE,$str_cook);               
        };
        
        $res=curl_exec($ch);        
          if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
            if ($this->debug==true){
              var_dump($res);
              var_dump($error_msg);
              die();  
            };
          };  
        if ($this->debug==true){
                echo "---------------- РЕЗУЛЬТАТ -------------\n";
                var_dump($res);
                echo "-------------------------- -------------\n";
        };          
        return $res;
    }    
Request is not XHR
1 2 3