Ошибка в Системе обновлений после обновления 1С-Битрикс до 23.650.100

При обновлений 1С-Битрикс до >=23.650.100 и PHP >=8.1, может получить ошибку на странице Система обновлений:

Fatal error: Access level to Bitrix\Main\DB\MysqlConnection::getErrorMessage() must be public (as in class Bitrix\Main\DB\Connection) in /home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php on line 161

[ErrorException] E_COMPILE_ERROR
Access level to Bitrix\Main\DB\MysqlConnection::getErrorMessage() must be public (as in class Bitrix\Main\DB\Connection) (0)
/home/bitrix/www/bitrix/modules/main/lib/db/mysqlconnection.php:161

Конечно, нужно обязательно проверить верно ли подключен Composer к системе в соответствии с документацией Composer и Bitrix Framework. Даже несмотря на корректность подключения, ошибка всё равно сохранится.

Не смотря на то, что уже с версий Битрикса работающих c PHP 7, используется драйвер Mysqli, ошибка в неиспользуемом Mysql драйвере, тем самым решение: удалить или переименовать файл /bitrix/modules/main/lib/db/mysqlconnection.php

Работа с SSH в Windows 11 и Windows Terminal

Комплексная заметка по работе с SSH в Windows 11 через  Windows Terminal.

1. Управление профилями Windows Terminal - settings.json

Через файл настроек settings.json гораздо удобнее производитель управление профилями, в частности ssh подключениями.

1.1 Чтобы быстро найти и открыть файл settings.json нужно запустить Windows Terminal открыть параметры или нажать комбинацию клавиш Ctrl + / и нажать на кнопку Открытие файла JSON.

(Если файл настроек Windows Terminal — settings.json файл не открылся, нужно назначить программу по умолчанию для открытия json файлов.)

Открыв settings.json можно найти список профилей в массиве list записи с ключом profiles:

Чтобы добавить новый профиль, в  массив list необходимо добавить новую запись с содержанием:

{
    "name": "Test VPS",
    "tabTitle": "Test VPS",
    "commandline": "ssh -i ~/.ssh/superkey vpsuser@124.124.124.124"
}

Я использую параметры -i ~/.ssh/superkey в commandline для явного указания ssh ключа.

В итоге:

Ссылка на официальную документацию — General profile settings in Windows Terminal

2. Копирование ssh ключа на удалённый сервер

cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys && echo "Key copied"'

А лучше с помощью данной команды:

Цитата Авторизация по ключу SSH:

Если такой способ по какой-либо причине для вас не работает, вы можете скопировать ключ по ssh вручную. Мы создадим каталог ~/.ssh, а затем поместим наш ключ в файл authorized_keys с помощью символа >>, это позволит не перезаписывать существующие ключи:

 cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Конечно можно заморочиться с добавлением эмуляции команды ssh-copy-id, но лично мне кажется что это лишнее — ssh-copy-id для Windows.

Возвращение поиска по умолчанию от Яндекса в Mozilla Firefox

14.03.2023 Mozilla убрала тихим сапом вариант Яндекс из выбора поисковой системы поумолчанию.

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

 

https://yandex.ru/search/smart/?text=%s

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

 

UPD:

Для десктопной версии браузера Firefox поисковую систему яндекс можно вернуть перейдя на сайт yandex.ru в адресной строке нажать правой кнопкой и выбрать Добавить «Яндекс».

Далее в настройках браузера (about:preferences#search) выбрать Яндекс:

Laravel не отображаются загруженные изображения в хранилище

Laravel uploaded images are not displayed in storage

Обычно это происходит при хардкорном переносе локального проекта Laravel на хостинг.

Причина простая, не созданная символьная ссылка на storage в папке public.

Кажется всё просто, нужно только выполнить команду для создания символьной ссылки:

php artisan storage:link

Особенного удручает на хостинга отсутствие командной строки, спасибо за наводку данному туториалу — Перенос проекта Laravel на хостинг с локального сервера OpenServer добавив команду выше в данный роут, запустив в браузере, видим, что всё вроде хорошо выполнилось.

Route::get('/clear', function () {
    Artisan::call('cache:clear');
    Artisan::call('config:cache');
    Artisan::call('view:clear');
    Artisan::call('route:clear');
    Artisan::call('storage:link');

    return "Cache is clear.";
});

А проблема не решилась!

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

Якобы у нас уже создана символьная ссылка для папки storage. А по факту имеем, что в папке public обычная папка с названием storage, ведь как появится символьная ссылка, если проект был полностью разархивирован.

 

Решение:

Удалить папку storage из папки public и запустить команду создания символьной ссылки ещё раз (см. выше).

Как правило символьные ссылки подсвечиваются синим цветом:

Или имеют специальные иконки в файловых менеджерах популярных панелей.

cPanel:

ISPmanager:

Запись из постоянной рубрики — Невнимательность.

IPS4 изменение громкости уведомлений

IPS4 change notification volume.

В IPS4 для проигрывания системных уведомлений используется библиотека howler.js.

Открыть Appearance > Themes > Your skin > Templates > core > global > global > includeJS 

<script type="text/javascript">
    ips.loader.get( ['core/interface/howler/howler.core.min.js'] ).then( function () {
        Howler.volume(0.5);
    });
</script>

Для подбора громкости можно добавить событие на какую-нибудь область или элемент с помощью функции:

    jQuery(document).ready(function ($) {
        $('#ipsLayout_header').click(function () {
            ips.loader.get( ['core/interface/howler/howler.core.min.js'] ).then( function () {

                sound = new Howl({
                    src: ips.getSetting('baseURL') + 'applications/core/interface/sounds/notification.mp3',
                    preload: true
                });

         //console.log( "Audio created with state: " + Howler.state );

                sound.play();
            });
        });
    });

Настройка интерприратора php для PhpStorm под Windows

Обновлено 28.04.2022

Не большая выжимка для настройки интерприратора php для работы в PhpStorm под Windows.

Даже если в php.ini раскомментирована строчка:

extension=pgsql

В PhpStorm может возникнуть ошибка:

Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: C:\php\ext\pdo_mysql (Не найден указанный модуль), C:\php\ext\php_pdo_mysql.dll (Не найден указанный модуль)) in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: C:\php\ext\pdo_mysql (Не найден указанный модуль), C:\php\ext\php_pdo_mysql.dll (Не найден указанный модуль)) in Unknown on line 0

Решение

Для решения данной ошибки, нужно раскомментировать ещё строчку (в php.ini):

;extension_dir = "ext"

Также список всех часто необходимых модулей (по крайней мере для разработки большинства сайтов на Laravel):

;extension=bz2
extension=curl
;extension=ffi
;extension=ftp
extension=fileinfo
extension=gd2
;extension=gettext
;extension=gmp
;extension=intl
;extension=imap
;extension=ldap
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
;extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
extension=pdo_pgsql
;extension=pdo_sqlite
extension=pgsql

А ещё бывает ошибка:

cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for ...

Или вот такая при установке Laravel:

[Composer\Exception\NoSslException]
  The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl ex
  tension, you can disable this error, at your own risk, by setting the 'disable-tls' option to true.

Тогда нужно скачать файл cacert.pem (например в C:\php)

Найти:

;curl.cainfo =

Заменить на (путь на ранее скаченный cacert.pem):

curl.cainfo ="C:\php\cacert.pem"

Работа с базами данных MySQL в ISPManager 5 + Docker

В ISPManager 5 добавлена контейнерная виртуализация Docker для использования альтернативных версий MySQL.

Цитата из документации ISPManager 5:

Все альтернативные MySQL-серверы разворачиваются внутри «контейнеров», которые представляют из себя обособленную среду. Данные каждого контейнера хранятся в отдельной директории /var/lib/имя_сервера. Созданием и работой с контейнерами занимается Docker, в его же репозиториях хранятся и устанавливаемые версии MySQL.

Процесс установки контейнера:

  • Создание директории для контейнера (/var/lib/имя_сервера)
  • Загрузка выбранной версии MySQL из репозитория
  • Выбор свободного порта для проброса из контейнера (первый свободный порт начиная с 3310)
  • Настройка сервера и установка пароля для пользователя root

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

  1. Импорт базы данных для альтернативного сервера в ISPManager 5

    mysql -udb_user -p --host=127.0.0.1 --port=3310 db_name < /var/www/lesovsky/data/backup_07042021.sql

    Для импорта базы данных с отображением прогресса отображения, пользуюсь утилитой pv — Pipe Viewer:
    Тогда команда будет иметь вид:

    pv /var/www/siteuser/data/backup_08042021.sql | mysql -udb_user -p --host=127.0.0.1 --port=3310 db_name
  2. Экспорт базы данных для альтернативного сервера в ISPManager 5

    mysqldump -udb_user -p --host=127.0.0.1 --port=3310 db_name > /var/www/siteuser/data/backup_08042021.sql
  3. Очистка дискового пространства после удаления альтернативного сервера базы данных

    Если было тестирование каких-то серверов БД и последующего их удаления или их обновления, после образуются dangling образы, которые могут занимать несколько гигабайт.
    Проверить наличие dangling образов можно с помощью команды:

    docker image ls -f dangling=true

    А удалить dangling образы:

    docker image rm $(docker image ls -f dangling=true -q)
  4. Очистка дискового пространства после удаления базы данных

    Бывает ситуация, что после удаления базы данных, файлы базы данных могут остаться на диске в папке /var/lib/имя_сервера/имя_бд для которую необходимо просто удалить.
    Для более быстрого поиска занимаемого места можно воспользоваться помощью утилиты ncdu.

    Цитата: 2-й способ. Утилита ncdu — анализ занятого места и его освобождение

    Есть так же и другие способы определить чем занято место на диске, например, очень удобная в плане анализа занятого места — утилита ncdu. Установить ее можно, например, так:

    • Для Debian систем (rpm-пакеты) (в т.ч. Ubuntu) командой apt-get install ncdu
    • Для Red Hat систем (dpkg-пакеты) командой yum install ncdu

    Дальше просто запустите ncdu и подождите, когда она подсчитает занимаемое место. По-умолчанию программа посчитает размеры папкой текущей папки, из которой программа была запущена. Если нужно посчитать какую-то другую папку, просто добавьте к команде путь к папке, например, так: ncdu /var/www. Если нужно посчитать занимаемое место на всем диске, можно использовать ncdu /.

    Программа показывает занимаемое папками место, позволяет заходить в них и сразу видеть сколько подпапки занимают места. Так же в этой утилите можно выполнять различные действия над файлами и папками. Получить справку по клавишам управления можно нажав «?«. Ниже приведу список некоторых из клавиш управления:

    • d — удалить выбранный файл или папку с файлами;
    • n — отсортировать файлы и папки по имени;
    • s — отсортировать файлы и папки по объему занимаемого места;
    • t — показывать сначала папки, затем файлы;
    • g — режим отображения (в процентах, графически, комплексно);
    • a — режим отображения (размер файла, занятое место на жестком диске)
    • e — включить/отключить отображение скрытых файлов;
    • i — показать дополнительную информацию о папке или файле;
    • r — заново пересчитать занимаемое место;
    • q — выйти из программы;

 

The Events Calendar отключение перевода ссылок

Disable Custom URL for The Events Calendar

В плагине The Events Calendar начиная с версии 4.6.10.1 добавили транслит ссылок на страницы списков.

При переключении отображения мероприятий Список, Месяц, День, например на русской локализации сайта, будет следующий вид ссылок — ваш_сайт.ru/мероприятия/список/ и т.д.

Для отключения данной функции, в файл functions.php добавить:

/* Disable Custom URL for The Events Calendar */

add_filter( 'tribe_events_rewrite_base_slugs', 'filter_tribe_events_rewrite_base_slugs' );
function filter_tribe_events_rewrite_base_slugs( $bases ){
    $bases['month'] = array( 'month', $tec->monthSlug );
    $bases['list'] = array( 'list', $tec->listSlug );
    $bases['today'] = array( 'today', $tec->todaySlug );
    $bases['day'] = array( 'day', $tec->daySlug );
    $bases['tag'] = array( 'tag', $tec->tag_slug );
    $bases['tax'] = array( 'category', $tec->category_slug );
    $bases['featured'] = array( 'featured', $tec->featured_slug );
    return $bases;
}

add_filter( 'tribe_events_rewrite_i18n_domains', 'filter_tribe_events_rewrite_i18n_domains' );
function filter_tribe_events_rewrite_i18n_domains( $domains ) {
    unset($domains['the-events-calendar'] );
    return $domains;
}

Зайти в настройки плагина The Events Calendar без изменений каких-то параметров, нажать Сохранить изменения для очистки кеша ссылок rewrite.

bitrix:sale.order.ajax получение данных свойства заказа

Для исполнения какой-то логики или вывода в определенном месте свойств(а) с теми или иными данными, необходимо эти данные получить, но т.к. до сих пор нет нормальной документации по новому bitrix:sale.order.ajax, а смотреть в консоли всегда не очень удобно, собрал список часто используемых функций:

getAltLocation()​
getDescription()​
getGroupId()​
property.getGroupId()==3
getId()​
getName()​
property.getName()==’Юридический адрес’
getParentNode()​
getPersonTypeId()​
getSettings()​
property.getSettings()[‘IS_ZIP’] != ‘Y’
getType()​
getValue()
isDisabled()​
isMultiple()​
isRequired()

Например, вставляем свойства находящиеся в группе Адрес доставки (ID 3) в блок Регион:

				// Вставить выше кода
				// regionContent.appendChild(regionNode);

				var addressItemsContainer = BX.create('DIV', {props: {className: 'bx-soa-address'}}),
					group, property, groupIterator = this.propertyCollection.getGroupIterator(), propsIterator;

				if (!addressItemsContainer)
					addressItemsContainer = this.propsBlockNode.querySelector('.bx-soa-address');

				while (group = groupIterator())
				{
					propsIterator =  group.getIterator();
					while (property = propsIterator())
					{
						if (property.getGroupId()==3) {
							this.getPropertyRowNode(property, addressItemsContainer, false);
							regionNode.appendChild(addressItemsContainer);
						}
					}
				}