header

content

Ошибки Битрикс на php8 (частные случаи)
Ошибки Битрикс на php8 (частные случаи)
[Error] Call to undefined function each() (0) /***/bitrix/modules/statistic/classes/general/statistic.php:782

При обновлении не обновился системный модуль "statistic".

В указанном файле 782-ю строку:

list(,$value) = each($arrADV);

заменить на:

$value = reset($arrADV);

************************************************************************************************************************************************


Добавить номер страницы в заголовки страниц при постраничной навигации (другой вариант)
Добавить номер страницы в заголовки страниц при постраничной навигации (другой вариант)
Данные - из настроек физических разделов и страниц или прописать прямым текстом в component_epilog.php. Компонент "Список новостей". 

Если значения get-параметра PAGEN_1 не совпадают с нумерацией страниц в меню постраничной навигации
В шаблоне компонента в файле result_modifier.php получаем данные по навигации из общего массива данных.
Вычисляем порядковый номер страницы.
Пишем его в один из элементов массива, передаваемых в component_epilog.php.
В component_epilog.php формируем шаблон для заголовков страниц.

Если в PAGEN_1 и в меню постраничной навигации одно и то же число
Работаем сразу с component_epilog.php и формируем шаблон для заголовков страниц, используя PAGEN_1
result_modifier.php
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

if(isset($_GET['PAGEN_1']) && $_GET['PAGEN_1']){
    $arNav = $arResult['NAV_RESULT'];
    $arNav = get_object_vars($arNav);
    $nav_count = (int)$arNav['NavPageCount'];
    $nav_page = (int)$arNav['NavPageNomer'];
    $current_page = $nav_count - $nav_page +1;
// допишем свои данные в $arResult['NAV_CACHED_DATA']
    $arResult['NAV_CACHED_DATA']['current_page'] = $current_page;
}
?>


component_epilog.php
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
global $APPLICATION;

if(isset($_GET['PAGEN_1']) && $_GET['PAGEN_1']){

    $current_page = $_GET['PAGEN_1'];

    if(isset($arResult['NAV_CACHED_DATA']['current_page']) && $arResult['NAV_CACHED_DATA']['current_page']){
        $current_page = $arResult['NAV_CACHED_DATA']['current_page'];
    }

$APPLICATION->SetPageProperty("title", 'Тайтл страницы - Страница ' . $current_page);
$APPLICATION->SetPageProperty("description", 'Описание страницы - Страница ' . $current_page);
}
?>
Добавить номер страницы в заголовки страниц при постраничной навигации (для разделов инфоблока)
Добавить номер страницы в заголовки страниц при постраничной навигации (для разделов инфоблока)
Данные - из настроек раздела (вкладка "SEO")
Компонент "Список новостей". В шаблоне создать (если отсутствует) файл result_modifier.php.
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

if(isset($_GET['PAGEN_1']) && $_GET['PAGEN_1']){

    $arNav = $arResult['NAV_RESULT'];
    $arNav = get_object_vars($arNav);
    $nav_count = (int)$arNav['NavPageCount'];
    $nav_page = (int)$arNav['NavPageNomer'];
    $current_page = $nav_count - $nav_page +1;

    $meta_title = $arResult['IPROPERTY_VALUES']['SECTION_META_TITLE'];
    $arResult['IPROPERTY_VALUES']['SECTION_META_TITLE'] = $meta_title . ' - Страница ' . $current_page;
    $meta_description = $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION'];
    $arResult['IPROPERTY_VALUES']['SECTION_META_DESCRIPTION'] = $meta_description . ' - Страница ' . $current_page;
    //$page_title = $arResult['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'];
    //$arResult['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'] = $page_title . ' - Страница ' . $current_page;
}

?>
Ошибки Битрикс на php8
Ошибки Битрикс на php8
1. [Ux11] Ошибка описания модуля "название.модуля".
Не установлено соединение с сервером обновлений. [Ux11] Ошибка описания модуля "название.модуля"

При возникновении данной ошибки нужно либо обновить модуль до последней версии, либо в файле /bitrix/modules/название.модуля/install/index.php заменить название функции function название_модуля() на function __construct() После этого ошибка должна уйти

2. call_user_func_array(): Argument #1 ($function) must be a valid callback, non-static method НазваниеМодуля::МетодКласса() cannot be called statically (0)

Необходимо найти код данного модуля по следующему пути (/bitrix/modules/название.модуля), определиться с классом в котором возникает данная ошибка и к данному классу приписать служебное слово static, примерно так:

static function МетодКласса()

3. Argument #1 ($value) must be of type Countable|array, null given (0)

Данная ошибка характерна, например, для функций count(), sort(), ksort() и подобных.

В битриксе можно часто встретить подобный код, которым разработчики проверяли наличие элементов в массиве и, в зависимости от результата, выполняли какое либо действие:

if (count($arResult["ITEMS"]) > 0) {}
или
if (count($arResult["ITEMS"])) {}

Ранее данная конструкция нам возвращала false и в случае если $arResult["ITEMS"] === Array(), и в случае если $arResult["ITEMS"] неопределен. Теперь же возникнет ошибка, если $arResult["ITEMS"] не определен или его значение не может быть "посчитано", например если значение типа Integer

Быстро исправить данную ошибку можно следующим образом:

if (is_countable($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)
Или
if (is_array($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)

Главная суть в том, что переменная, передаваемая в функцию count() должна существовать, быть определена и иметь тип, который может быть "посчитан", например Array

Для быстрого решения этой ошибки в функциях сортировки sort(), ksort() и т.д. можно использовать следующий код:

if (is_array($arResult["ITEMS"])) sort($arResult["ITEMS"]);

А так же возможен вариант явного приведения переменной к необходимому типу:

$arResult["ITEMS"] = (array)$arResult["ITEMS"];
Или
sort((array)$arResult["ITEMS"]);

Но в данном случае нужно понимать, что изначальное значение типа null, boolean, integer будет приведено к типу Array, что не всегда правильно для дальнейшего выполнения кода



Даты в Битриксе
Даты в Битриксе
Форматы дат

для полей: dd.mm.YYYY hh:ii:ss
DATE_ACTIVE_FROM

для свойств: YY-mm-dd hh:ii:ss
PROPERTY_*

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// текущая дата
$date_this = date('d.m.Y');  // дата сегодня
$datetime_this = date('d.m.Y H:i:s'); // дата и время сейчас

$date_next = date('d.m.Y H:i:s', strtotime(date('d.m.Y') . ' +1 day')); // дата на завтра
$datetime_next = date('d.m.Y H:i:s', strtotime(date('d.m.Y') . ' +1 day')); // дата и время на завтра с 0 часов

$date_nextnext = date('d.m.Y H:i:s', strtotime(date('d.m.Y') . ' +2 days')); // дата на послезавтра

$date_next = date('d.m.Y H:i:s', strtotime(date('d.m.Y H:i:s') . ' +1 hour')); // дата и время через час

$date_this_f = date('Y-m-d');  // дата сегодня в формате год-месяц-день
$datetime_this_f = date('Y-m-d H:i:s'); // дата и время сейчас

$year = date('Y'); // год
$month = date('m'); // месяц
$day = date('d'); // день

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ФИЛЬТРЫ

Из полей

из поля даты начала публикации (с 1 числа месяца)
    ">=DATE_ACTIVE_FROM" => '01.' .$month. '.' . $year. ' 00:00:00',

из поля даты начала публикации (за весь текущий день)
    ">=DATE_ACTIVE_FROM" => $date_this.' 00:00:00',
    "<=DATE_ACTIVE_FROM" => $date_this.' 23:59:59',

из поля даты начала публикации (за весь текущий день) или если дата начала уже прошла, а дата окончания еще не наступила (для календаря событий)
       array(
           "LOGIC" => "OR",
           array(">=DATE_ACTIVE_FROM" => $date_this . " 00:00:00", "<=DATE_ACTIVE_FROM" => $date_this . " 23:59:59"),
           array("<=DATE_ACTIVE_FROM" => $date_this . " 23:59:59", ">=DATE_ACTIVE_TO" => $date_this . " 23:59:59"),
       ),

Из свойств

из пользовательского свойства "Дата" с кодом START (с сегодняшнего дня и далее)
    ">=PROPERTY_START" => $year . '-' . $month . '-' . $day . ' 00:00:00',

по дате за месяц
    ">=PROPERTY_START" => $year . '-' . $month . '-01',
    "<=PROPERTY_START" => $year . '-' . $month . '-31',



404
Настройка компонента и страницы 404

Во первых перейдите к настройкам вашего компонента (обычно это bitrix.catalog или bitrix.news), блоке «настройки 404 ошибки» отметьте галочку «Устанавливать статус 404».

Затем в файл /bitrix/php_interface/init.php добавьте следующий код:
    
AddEventHandler("main", "OnEpilog", "error_page");
function error_page()
{
    $page_404 = "/404.php";
    GLOBAL $APPLICATION;
    if(strpos($APPLICATION->GetCurPage(), $page_404) === false && defined("ERROR_404") && ERROR_404 == "Y")
    {
        $APPLICATION->RestartBuffer();
        CHTTP::SetStatus("404 Not Found");
        include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/header.php");
        include($_SERVER["DOCUMENT_ROOT"].$page_404);
        include($_SERVER["DOCUMENT_ROOT"].SITE_TEMPLATE_PATH."/footer.php");
        die();
    }
}

в файле /404.php

$APPLICATION->SetTitle("404 Not Found");
$APPLICATION->SetPageProperty("title", "404 Страница не найдена");
$APPLICATION->SetPageProperty("description", "404 Нет такой страницы :(");


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Текст для разных языковых версий сайта (русский - в корне, английский - в папке /en/)

<? if (substr($APPLICATION->GetCurDir(), 0, 4) == '/en/') { ?>
    <div style="margin:25px 0;">
        404 Page not found
    </div>
    <div>
        The page you requested may have been deleted or moved. <a href="/en/">Go back to the main page?</a>
    </div>
<? } else { ?>
    <div style="margin:25px 0;">
        404 Страница не найдена
    </div>
    <div>
        Возможно запрашиваемая вами страница была удалена или перемещена. <a href="/">Вернуться на главную?</a>
    </div>
<? } ?>


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Для компонента news.list, если в несуществующем разделе вываливается весь список новостей без фильтрации

В настройках выставить параметр «Строгая проверка раздела».
Или в коде вызова компонента:
"STRICT_SECTION_CHECK" => "Y",


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Настройка часового пояса
Настройка часового пояса
В админке: 
Настройка
- Настройки продукта
-- Настройка модулей 
--- Главный модуль
Вкладка "Настройки", секция "Часовые пояса". Выбрать свой часовой пояс, например Pacific/Samoa

Если есть расхождения при редактировании и при отображении на сайте:
в файл /bitrix/php_interface/dbconn.php добавить строку:
date_default_timezone_set('Pacific/Samoa');
часовой пояс указать свой.

Страница с блоком фотографий в fancybox. В шаблон компонента news.detail
Страница с блоком фотографий в fancybox. В шаблон компонента news.detail
Подключить jquery в шаблоне сайта.
Загрузить fancybox из архива на сервер.
В шаблоне компонента news.detail подправить пути до расположения библиотеки fancybox
<?
// локальные настройки
$field_photos_code = 'PHOTOS'; // код пользовательского поля для фотографий (тип "файл" множественное)
$tmb_width = 250;  // ширина превью
$tmb_height = 250; // высота превью
$img_width = 800;  // ширина фото
$img_height = 600; // высота фото
?>

<link rel="stylesheet" type="text/css" href="/fancybox/jquery.fancybox.min.css">
<script src="/fancybox/jquery.fancybox.min.js"></script>
<script src="/fancybox/custom.js"></script>

<? if(isset($arResult["PROPERTIES"][$field_photos_code]["VALUE"]) && $arResult["PROPERTIES"][$field_photos_code]["VALUE"]) { // вывод данных из свойства PHOTOS ?>
    <?
    $arPhotos = array();
    foreach($arResult["PROPERTIES"][$field_photos_code]["VALUE"] as $key=>$value) {
        $arPhotos[$key]['ID'] = $value;
    }

    // если используются описания для изображений - добавляем их в общий массив по ключу
    if(isset($arResult["PROPERTIES"][$field_photos_code]["DESCRIPTION"]) && $arResult["PROPERTIES"][$field_photos_code]["DESCRIPTION"]) {
        foreach($arResult["PROPERTIES"][$field_photos_code]["DESCRIPTION"] as $key=>$value) {
            $arPhotos[$key]['DESCRIPTION'] = $value;
        }
    }
    ?>

    <?
    /* Задаем размеры для миниатюры */
    $arrTmbSizes = array();
    $arrTmbSizes['width'] = $tmb_width;
    $arrTmbSizes['height'] = $tmb_height;

    /* Задаем размеры для фото */
    $arrPictureSizes = array();
    $arrPictureSizes['width'] = $img_width;
    $arrPictureSizes['height'] = $img_height;
    ?>

    <div class="news_item_photos_wrapper">
        <? foreach($arPhotos as $photos_item) { ?>
            <?
            $tmb = CFile::ResizeImageGet($photos_item['ID'], $arrTmbSizes, BX_RESIZE_IMAGE_EXACT );
            $img = CFile::ResizeImageGet($photos_item['ID'], $arrPictureSizes, BX_RESIZE_IMAGE_PROPORTIONAL_ALT );

            if(isset($photos_item['DESCRIPTION']) && $photos_item['DESCRIPTION']) {
                $img_desrciption = $photos_item['DESCRIPTION'];
            } else {
                $img_desrciption = $arResult["NAME"];
            }
            ?>
            <a href="<? echo $img['src']; ?>" data-fancybox="group" data-caption="<? echo $img_desrciption;?>">
                <img src="<? echo $tmb['src']; ?>" alt="<? echo $img_desrciption; ?>" title="<? echo $img_desrciption; ?>">
            </a>
        <? } ?>
    </div>
<? } ?>
.news_item_photos_wrapper{display:flex;flex-wrap:wrap;justify-content:center;}
.news_item_photos_wrapper a{display:block;margin:2px;}