header

content

Вкладка Modes (Place Actors) в UE5
Вкладка Modes (Place Actors) в UE5 Вкладка Modes (Place Actors) в UE5

Вызов окна Place Actors через пункт меню Window
Modes (UE4) -> Place Actors (UE5)
Trigger Volume (UE4) -> Trigger Box (UE5)
Ошибки Битрикс на 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);

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


Скрытие части текста фоновым градиентом
Скрытие части текста фоновым градиентом

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

.div_text{position:relative;height:150px;width:100%;overflow:hidden;}
.div_text:after{position:absolute;height:120px;left:0;right:0;bottom:0;width:100%;z-index:2;content:'';background-image: linear-gradient(transparent, white);}
Убрать эмодзи из текста
php (php)
Убрать эмодзи из текста
$text = preg_replace('~[\x{10000}-\x{10FFFF}]~u', '', $text);
Добавить номер страницы в заголовки страниц при постраничной навигации (другой вариант)
Добавить номер страницы в заголовки страниц при постраничной навигации (другой вариант)
Данные - из настроек физических разделов и страниц или прописать прямым текстом в 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;
}

?>
Перевести текст в транслит
php (php)
Перевести текст в транслит
$text = 'бла-бла-бла :)';

$tr = array(
        "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
        "Е"=>"E","Ё"=>"YO","Ж"=>"J","З"=>"Z","И"=>"I",
        "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
        "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
        "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"C","Ч"=>"CH",
        "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
        "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
    );
$text_tmp = strtr($text,$tr); // в транслит
$text_tmp = preg_replace('/[^A-Za-z0-9_\-]/', '', $text_tmp); // удаляем мусор
$text = strtolower(trim($text_tmp, '-')); // преобразуем в нижний регистр

echo $text;
Обрезать строку по словам
php (php)
Обрезать строку по словам
/**
* Обрезает строку до определённого количества символов не разбивая слова.
* Поддерживает многобайтовые кодировки.
* @param string $str строка
* @param int $length длина, до скольки символов обрезать
* @param string $postfix постфикс, который добавляется к строке
* @param string $encoding кодировка, по-умолчанию 'UTF-8'
* @return string обрезанная строка
*/
function mbCutString($str, $length, $postfix='...', $encoding='UTF-8')
{
    if (mb_strlen($str, $encoding) <= $length) {
        return $str;
    }
  
    $tmp = mb_substr($str, 0, $length, $encoding);
    return mb_substr($tmp, 0, mb_strripos($tmp, ' ', 0, $encoding), $encoding) . $postfix;
}
Сделать первую букву заглавной
php (php)
Сделать первую букву заглавной
function upFirstLetter($str, $encoding = 'UTF-8')
{
    return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding)
    . mb_substr($str, 1, null, $encoding);
}

echo upFirstLetter('дом'); // выведет "Дом"
console.log и php
php (php)
console.log и php
function debug_to_console($data) {
    $output = $data;
    if (is_array($output))
        $output = implode(',', $output);
    echo "<script>console.log('Debug Objects: " . $output . "' );</script>";
}
Оставить только цифры
php (php)
Оставить только цифры
$str = '{"10":"OK"}';
$strWithoutChars = preg_replace('/[^0-9]/', '', $str);
echo $strWithoutChars;
Убрать двойные пробелы
php (php)
Убрать двойные пробелы
$text = preg_replace('/[^\S\r\n]+/', ' ', $text);
Убрать нули в начале числа
php (php)
Убрать нули в начале числа
$y = '000000011';
echo (int)$y;

или

$y = '000000011';
print ltrim($y,'0');
Ошибки Битрикс на 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;}