Битриксоид из Колхоза

Изучаем #Битрикс, находим ошибки, обслуживаем проекты, пишем модули, разрабатываем компоненты.

Ютуб: shorturl.at/himBM
Модуль-ускоритель: shorturl.at/lsyTW
Модуль комментариев: shorturl.at/ACDT2
Сайт разработчика: https://burlaka.studio

View in Telegram

Recent Posts

Code Folding

Заглянул в чат к ДжаваскриптНиндзе, зацепился глазом за «code folding». Пошёл почитать и вот те на — как раз то, чего мне не хватало, когда я перешёл с Notepad++ 🍼 на ПХПШторм 🚀 (на плюсах можно выделить кусок текста и свернуть через Hide Lines).

Итак, чтобы включить механизм, идём в настройки PhpStorm (^+Alt+S), ищем Code Folding и активируем Custom folding regions. Далее в любом файле размечаем области и получаем возможность их сворачивать/разворачивать.

#добавитьпорядка#ide
Ребята!

Кто не читал — окунитесь:
https://t.me/mentor_warrior

Оник делится опытом и мыслями.

#лайкканалу
php-код и поля почтового события в шаблоне темы оформления почтового шаблона

Есть почтовые событие, есть почтовые шаблоны к ним.

В почтовом шаблоне есть тема оформления (шаблон сайта со специальным параметром mail в описании - тыц).

Может случиться так, что нам понадобится специальный вид письма в зависимости от значения полей почтового события. Например, рендерить разные шапки или футеры или публиковать/скрывать некоторые части шаблона. В зависимости от заполненных полей формы или группы пользователя или ещё 100+ вариантов на любой вкус. Да тот же Уважаемый/ая/ое с розовым цветом и бантиками на фоне...

Можно было бы ловить OnBeforeMailSend, но хотелось бы более удобно: в редакторе, с if-ами и кусками html.

Так как тема оформления — это шаблон сайта и состоит он из header.php, footer.php с php-кодом внутри, мы можем пользоваться стандартным пхп-шным подходом, а значения полей приходят в $arParams (плюс ключи
SITE_NAME, SERVER_NAME, DEFAULT_EMAIL_FROM, LANGUAGE_ID, SITE_ID, SITE_DIR).

Выполняет и тело страницы (текст почтового шаблона) и header.php и footer.php (то есть — где ставить брейкпоинт, чтобы поймать при дебаге =):
BitrixMainMailEventMessageThemeCompiler::executePhp


#письманалюбойвкус#почта#отладка
Синхронизироваться.

Народ, давайте поговорим про синхронизацию файлов между устройствами.

Есть: ноут, ПК1, ПК2. Мне нужно синхронизировать между ними файлы проектов, с которыми я работаю.

Чтобы я поработал на ноуте, перешёл на ПК1 (не в одной локальной сети) и там все актуальные изменения заехали через интернет за нсекунд/нминут.

И чтобы можно было просто указать папку на своём компе и она начала синхронизироваться с облаком приложения. И в обратную сторону чтобы также удобно было.

Накидайте плиз того, чем пользовались вы.

#ашосгитомнесложилосьто#пипецужепятница
Ребята!
В пхпшторме есть лайв-темплейтс.
Заходим, создаём в группе PHP макрос.

У меня: «если набрать prr и нажать Tab, вместо prr вставится print_r строка, которая выведет информацию о переменной, имя которой находится в буфере обмена».

То есть нужно мне воткнуть print_r для переменной $variable — я копирую имя переменной в буфер обмена, иду в нужное место, пишу prr и нажимаю Tab (или Enter, чтобы Copilot не подставлял свою шнягу). И в этот момент срабатывает макрос и я получаю print_r нужной переменной.

И хватит мусорить в init.php

А, и ещё: выделение и копирование я делаю полностью мышью.
У меня A4Tech X7 и с помощью X7 Oscar я перенастроил кнопки на ней на Ctrl+C и Ctrl+V.
И я теперь могу одной только мышью выделить текст, скопировать текст и вставить его в нужное место.

...а ещё на мыши есть кнопка "Навигационный бэк" — это если перешли по Ctrl+Click на методе или переменной и нужно вернуться назад. Или если вы в браузере перешли по ссылке и нужно вернуться назад.

Это просто ппц как экономит ресурсы. Вообще. Не только программистам.

Так, что... ребята! Оптимизируемся!

#заебалимусоритьвинитпхп#оптимизируемся#используеммакросы
Ребята!
В пхпшторме есть лайв-темплейтс.
Заходим, создаём в группе PHP макрос.

У меня: «если набрать prr и нажать Tab, вместо prr вставится print_r строка, которая выведет информацию о переменной, имя которой находится в буфере обмена».

То есть нужно мне воткнуть print_r для переменной $variable — я копирую имя переменной в буфер обмена, иду в нужное место, пишу prr и нажимаю Tab (или Enter, чтобы Copilot не подставлял свою шнягу). И в этот момент срабатывает макрос и я получаю print_r нужной переменной.

И хватит мусорить в init.php

А, и ещё: выделение и копирование я делаю полностью мышью.
У меня A4Tech X7 и с помощью X7 Oscar я перенастроил кнопки на ней на Ctrl+C и Ctrl+V.
И я теперь могу одной только мышью выделить текст, скопировать текст и вставить его в нужное место.

...а ещё на мыши есть кнопка "Навигационный бэк" — это если перешли по Ctrl+Click на методе или переменной и нужно вернуться назад. Или если вы в браузере перешли по ссылке и нужно вернуться назад.

Это просто ппц как экономит ресурсы. Вообще. Не только программистам.

Так, что... ребята! Оптимизируемся!

#заебалимусоритьвинитпхп#оптимизируемся#используеммакросы
Быстрая проверка, этот ли случай у тебя (с большой вложенностью компонентов):

$$('[id^="bx_incl_area_"]').forEach((el) => {
let id = el.id.replace('bx_incl_area_', '');
let levels = id.split('_');
console.log('%o : %o', levels.length, levels);
});

#проверка#нетратьвремязря
Иногда бывает так, что в режиме редактирования никак не можешь добраться до параметров компонента. Наводишь, а параметры компонента не появляются. Хотя на админ-панели вверху все компоненты есть в списке. Иногда помогает, если вызов компонента обернёшь в div.…
Иногда бывает так, что в режиме редактирования никак не можешь добраться до параметров компонента. Наводишь, а параметры компонента не появляются. Хотя на админ-панели вверху все компоненты есть в списке. Иногда помогает, если вызов компонента обернёшь в div.…
Иногда бывает так, что в режиме редактирования никак не можешь добраться до параметров компонента. Наводишь, а параметры компонента не появляются. Хотя на админ-панели вверху все компоненты есть в списке. Иногда помогает, если вызов компонента обернёшь в div. Иногда нужно поправить вёрстку. Сегодня я расковырял другой случай.

Приметы моей ситуации: если глянуть на список админ-обёрток для каждого компонента, они будут с одинаковой нумерацией.

ТЛ;ДР: из-за большой вложенности компонентов система нумерации Битрикса путается и даёт сбой.
В моём случае вложенность четвёртого уровня вызывала это. Уменьшать вложенность или править ядро 🤓.

Нырнём вглубь.

Как формируются админ-обёртки

Нумерация слоёв управляется методами
CEditArea::IncludeStringBefore
CEditArea::IncludeStringAfter

За то, какой уровень мы сейчас наращиваем, отвечает бегунок $this->includeLevel. Цепочка номеров (можно представить как горизонтальный барабан из дисков с цифрами): переменная $this->includeAreaIndex. При наращивании уровней вложенности компонента бегунок смещается вправо по барабану, при уменьшении смещается влево.

Если у нас публикуется первый компонент, бегунок смещается на первый диск барабана (элемент массива) и крутит его на одно деление с каждым новым компонентом. Соответственно компоненты "в корне" будут с номерами: 1, 2, 3, ...

Каждая вложенность компонента наращивает хвост к текущему уровню и формирует цепочку счётчиков. Если у нас например четвёртый компонент на странице (номер 4), вложенный в него компонент получит код 4_1 (при вложенности бегунок смещается вправо, становится на второй диск барабана (элемент массива) и начинает крутить его). Три компонента в компоненте с номером 4 получат номера: 4_1, 4_2, 4_3 (бегунок на втором диске, крутит его).

На вложенности четвёртого уровня цепочка будет состоять из четырёх звеньев, например: [4, 2, 1, 1] и такой компонент должен получить номер 4_2_1_1.

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

Что мы ожидаем, когда смещаемся с четвёртого уровня на первый? Что цепочка была 4_2_1_1, а стала 4.
Что происходит на самом деле? Цепочка так и остаётся 4_2_1_1.

Если представить это в виде массива:
[
0 => 4
1 => 2
2 => 1
3 => 1
]

Теперь следим за руками.

Размещается следующий компонент (! или старт рабочей области шаблона сайта).

Метод CEditArea::IncludeStringBefore увеличивает счётчик первого диска на барабане: был 4, стал 5 и делает unset второму диску.

В виде массива:

было:
[
0 => 4
1 => 2
2 => 1
3 => 1
]

стало:
[
0 => 5
2 => 1
3 => 1
]

Так как бегунок на первом уровне (цепочка строится от начала барабана до бегунка), компонент (или старт рабочей области шаблона сайта) получает номер "5".

Публикуется компонент на этом уровне. Срабатывает вложенность, бегунок смещается вправо на второй диск (в разрезе массива, принимает позицию 1), в массив дописывается единица на первую позицию. И вот что происходит:

Ожидаем:
[
0 => 5
1 => 1
2 => 1
3 => 1
]

...в реальности (особенность пхп):
[
0 => 5
2 => 1
3 => 1
1 => 1 <----- !!!
]

Компонент получает номер 5_1, что соответствует ожиданиям, хотя массив уже имеет неверную структуру.

Публикуется следующий компонент. Бегунок диску с номером "1" накручивает счётчик. и вот что получается:
[
0 => 5
2 => 1
3 => 1
1 => 2 <----- !!!
]
... но номер строится путём отрезания (array_slice) от массива первых двух номеров. И второй компонент вместо ожидаемого 5_2 получает снова номер 5_1. И так далее.

В результате разные компоненты получают одинаковые номера и джиэс сходит с ума (на самом деле инициализируя только один компонент из всего списка).

В моём случае я добавил в ядро функцию-сортировщик, чтобы массив на сборку номера уходил с ключами в правильном порядке:

[
0 => 5
1 => 2 <--
2 => 1
3 => 1
]

#битрикс#крутибарабанправильно#компоненты#режимправки
Имеем инфоблок, в котором есть связанные с другими инфоблоками свойства.

Если в связанном инфоблоке заполнен Символьный код API, при компиляции сущности
BitrixIblockIblockTable::compileEntity($iblockApiCode);
...поле, представляющее свойство, будет иметь поле ELEMENT (через который по цепочке можно получить поля связанного элемента, например: MY_PROP.ELEMENT.PREVIEW_PICTURE)

Если Символьный код API не указан, референса у поля не будет 🧼

#orm#референсы#цепочкасостоитиззвеньев
Смекалка и сообразительность

#chatgpt#бытьсильнее
Смекалка и сообразительность

#chatgpt#бытьсильнее
Давно не учил никаких клавиатурных сокращений и вот.

^ + Alt + Shift + O
...для отключения подсказок Копайлота.

...и это сладкое ощущение, когда мозг включается, глубоко вдыхает и начинают шуршать шестерёнки. Прям крепатура ))

#пятничное
Давно не учил никаких клавиатурных сокращений и вот.

^ + Alt + Shift + O
...для отключения подсказок Копайлота.

...и это сладкое ощущение, когда мозг включается, глубоко вдыхает и начинают шуршать шестерёнки. Прям крепатура ))

#пятничное
Вот думал: хватит уже жпт-примеров, но тут такой а-ля человеческий диалог, что я прям фшоке.
Вот думал: хватит уже жпт-примеров, но тут такой а-ля человеческий диалог, что я прям фшоке.
Кто как, чем (кем) защищается от вирусов?

Есть кто, чтобы я его запустил на сайт и он там вылечил всё и позакрывал дыры?

#нужендоктор
Кто как, чем (кем) защищается от вирусов?

Есть кто, чтобы я его запустил на сайт и он там вылечил всё и позакрывал дыры?

#нужендоктор
See more posts

View in Telegram