Имеем инфоблок, в котором есть связанные с другими инфоблоками свойства.
Если в связанном инфоблоке заполнен Символьный код API, при компиляции сущности
Если Символьный код API не указан, референса у поля не будет🧼
#orm #референсы #цепочкасостоитиззвеньев
Если в связанном инфоблоке заполнен Символьный код API, при компиляции сущности
\Bitrix\Iblock\IblockTable::compileEntity($iblockApiCode);...поле, представляющее свойство, будет иметь поле
ELEMENT (через который по цепочке можно получить поля связанного элемента, например: MY_PROP.ELEMENT.PREVIEW_PICTURE)Если Символьный код API не указан, референса у поля не будет
#orm #референсы #цепочкасостоитиззвеньев
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤1🤔1
Битриксоид из Колхоза
Бывает так, что ты в режиме редактирования хочешь добраться до какого-то компонента через настройки, но из-за специфики вёрстки (или других причин), при наведении мышью на блок с областью, которая содержит компонент,.. страница только дёргается, увеличивается…
Иногда бывает так, что в режиме редактирования никак не можешь добраться до параметров компонента. Наводишь, а параметры компонента не появляются. Хотя на админ-панели вверху все компоненты есть в списке. Иногда помогает, если вызов компонента обернёшь в div. Иногда нужно поправить вёрстку. Сегодня я расковырял другой случай.
Приметы моей ситуации: если глянуть на список админ-обёрток для каждого компонента, они будут с одинаковой нумерацией.
ТЛ;ДР: из-за большой вложенности компонентов система нумерации Битрикса путается и даёт сбой.
В моём случае вложенность четвёртого уровня вызывала это. Уменьшать вложенность или править ядро🤓 .
Нырнём вглубь.
Как формируются админ-обёртки
Нумерация слоёв управляется методами
Если у нас публикуется первый компонент, бегунок смещается на первый диск барабана (элемент массива) и крутит его на одно деление с каждым новым компонентом. Соответственно компоненты "в корне" будут с номерами: 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.
Если представить это в виде массива:
Размещается следующий компонент (! или старт рабочей области шаблона сайта).
Метод
В виде массива:
было:
Публикуется компонент на этом уровне. Срабатывает вложенность, бегунок смещается вправо на второй диск (в разрезе массива, принимает позицию 1), в массив дописывается единица на первую позицию. И вот что происходит:
Ожидаем:
Публикуется следующий компонент. Бегунок диску с номером "1" накручивает счётчик. и вот что получается:
В результате разные компоненты получают одинаковые номера и джиэс сходит с ума (на самом деле инициализируя только один компонент из всего списка).
В моём случае я добавил в ядро функцию-сортировщик, чтобы массив на сборку номера уходил с ключами в правильном порядке:
Приметы моей ситуации: если глянуть на список админ-обёрток для каждого компонента, они будут с одинаковой нумерацией.
ТЛ;ДР: из-за большой вложенности компонентов система нумерации Битрикса путается и даёт сбой.
В моём случае вложенность четвёртого уровня вызывала это. Уменьшать вложенность или править ядро
Нырнём вглубь.
Как формируются админ-обёртки
Нумерация слоёв управляется методами
\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
]
[Так как бегунок на первом уровне (цепочка строится от начала барабана до бегунка), компонент (или старт рабочей области шаблона сайта) получает номер "5".
0 => 5
2 => 1
3 => 1
]
Публикуется компонент на этом уровне. Срабатывает вложенность, бегунок смещается вправо на второй диск (в разрезе массива, принимает позицию 1), в массив дописывается единица на первую позицию. И вот что происходит:
Ожидаем:
[...в реальности (особенность пхп):
0 => 5
1 => 1
2 => 1
3 => 1
]
[Компонент получает номер 5_1, что соответствует ожиданиям, хотя массив уже имеет неверную структуру.
0 => 5
2 => 1
3 => 1
1 => 1 <----- !!!
]
Публикуется следующий компонент. Бегунок диску с номером "1" накручивает счётчик. и вот что получается:
[... но номер строится путём отрезания (
0 => 5
2 => 1
3 => 1
1 => 2 <----- !!!
]
array_slice) от массива первых двух номеров. И второй компонент вместо ожидаемого 5_2 получает снова номер 5_1. И так далее.В результате разные компоненты получают одинаковые номера и джиэс сходит с ума (на самом деле инициализируя только один компонент из всего списка).
В моём случае я добавил в ядро функцию-сортировщик, чтобы массив на сборку номера уходил с ключами в правильном порядке:
[#битрикс #крутибарабанправильно #компоненты #режимправки
0 => 5
1 => 2 <--
2 => 1
3 => 1
]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2🥰1
Битриксоид из Колхоза
Иногда бывает так, что в режиме редактирования никак не можешь добраться до параметров компонента. Наводишь, а параметры компонента не появляются. Хотя на админ-панели вверху все компоненты есть в списке. Иногда помогает, если вызов компонента обернёшь в div.…
Быстрая проверка, этот ли случай у тебя (с большой вложенностью компонентов):
$$('[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);
});
#проверка #нетратьвремязря👍6
Ребята!
В пхпшторме есть лайв-темплейтс.
Заходим, создаём в группе PHP макрос.
У меня: «если набрать prr и нажать Tab, вместо prr вставится 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 на методе или переменной и нужно вернуться назад. Или если вы в браузере перешли по ссылке и нужно вернуться назад.
Это просто ппц как экономит ресурсы. Вообще. Не только программистам.
Так, что... ребята! Оптимизируемся!
#заебалимусоритьвинитпхп #оптимизируемся #используеммакросы
👍18❤1😁1
Синхронизироваться.
Народ, давайте поговорим про синхронизацию файлов между устройствами.
Есть: ноут, ПК1, ПК2. Мне нужно синхронизировать между ними файлы проектов, с которыми я работаю.
Чтобы я поработал на ноуте, перешёл на ПК1 (не в одной локальной сети) и там все актуальные изменения заехали через интернет за нсекунд/нминут.
И чтобы можно было просто указать папку на своём компе и она начала синхронизироваться с облаком приложения. И в обратную сторону чтобы также удобно было.
Накидайте плиз того, чем пользовались вы.
#ашосгитомнесложилосьто #пипецужепятница
Народ, давайте поговорим про синхронизацию файлов между устройствами.
Есть: ноут, ПК1, ПК2. Мне нужно синхронизировать между ними файлы проектов, с которыми я работаю.
Чтобы я поработал на ноуте, перешёл на ПК1 (не в одной локальной сети) и там все актуальные изменения заехали через интернет за нсекунд/нминут.
И чтобы можно было просто указать папку на своём компе и она начала синхронизироваться с облаком приложения. И в обратную сторону чтобы также удобно было.
Накидайте плиз того, чем пользовались вы.
#ашосгитомнесложилосьто #пипецужепятница
php-код и поля почтового события в шаблоне темы оформления почтового шаблона
Есть почтовые событие, есть почтовые шаблоны к ним.
В почтовом шаблоне есть тема оформления (шаблон сайта со специальным параметром mail в описании - тыц).
Может случиться так, что нам понадобится специальный вид письма в зависимости от значения полей почтового события. Например, рендерить разные шапки или футеры или публиковать/скрывать некоторые части шаблона. В зависимости от заполненных полей формы или группы пользователя или ещё 100+ вариантов на любой вкус. Да тот же Уважаемый/ая/ое с розовым цветом и бантиками на фоне...
Можно было бы ловить
Так как тема оформления — это шаблон сайта и состоит он из header.php, footer.php с php-кодом внутри, мы можем пользоваться стандартным пхп-шным подходом, а значения полей приходят в $arParams (плюс ключи
SITE_NAME, SERVER_NAME, DEFAULT_EMAIL_FROM, LANGUAGE_ID, SITE_ID, SITE_DIR).
Выполняет и тело страницы (текст почтового шаблона) и header.php и footer.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 (то есть — где ставить брейкпоинт, чтобы поймать при дебаге =):
\Bitrix\Main\Mail\EventMessageThemeCompiler::executePhp
#письманалюбойвкус #почта #отладка
👍9🔥2👏1
Ребята!
Кто не читал — окунитесь:
https://t.me/mentor_warrior
Оник делится опытом и мыслями.
#лайкканалу
Кто не читал — окунитесь:
https://t.me/mentor_warrior
Оник делится опытом и мыслями.
#лайкканалу
Telegram
рукоВоITель
Заметки IT-руководителя. Как специалиста, как человека.
❤4
Code Folding
Заглянул в чат к ДжаваскриптНиндзе, зацепился глазом за «code folding». Пошёл почитать и вот те на — как раз то, чего мне не хватало, когда я перешёл с Notepad++ 🍼 на ПХПШторм 🚀 (на плюсах можно выделить кусок текста и свернуть через Hide Lines).
Итак, чтобы включить механизм, идём в настройки PhpStorm (
#добавитьпорядка #ide
Заглянул в чат к ДжаваскриптНиндзе, зацепился глазом за «code folding». Пошёл почитать и вот те на — как раз то, чего мне не хватало, когда я перешёл с Notepad++ 🍼 на ПХПШторм 🚀 (на плюсах можно выделить кусок текста и свернуть через Hide Lines).
Итак, чтобы включить механизм, идём в настройки PhpStorm (
^+Alt+S), ищем Code Folding и активируем Custom folding regions. Далее в любом файле размечаем области и получаем возможность их сворачивать/разворачивать.#добавитьпорядка #ide
🔥24👍7🤡1😐1
Всем известно ©, что в работе с Битриксом чем угодно не обойтись без эмоций.
А эмоции хорошо выражаются смайлами, но не всегда доступный арсенал точно выражает сиюминутное состояние.
Гугл запилил (хз когда, нашёл вот-вот, когда с дочерью играли в их змейку) скрещиватель смайлов.
#скрестиих
А эмоции хорошо выражаются смайлами, но не всегда доступный арсенал точно выражает сиюминутное состояние.
Гугл запилил (хз когда, нашёл вот-вот, когда с дочерью играли в их змейку) скрещиватель смайлов.
#скрестиих
😁21👍11🔥4
Битриксоид из Колхоза
Ситуация: пишем код и хотим по мере написания понимать, насколько всё оптимально у нас происходит. Перед выполнением запросов ставим нужный флажок в нужное положение и тогда по выполнению кода получаем статистическую выжимку по запросам конкретного куска…
Дополнение к данному сообщению (в процитированном).
Не все запросы идут через
#запросы #статистика #sql
Не все запросы идут через
$DB. Для отслеживания запросов в другой плоскости, работаем с треккером текущего коннекта.$application = \Bitrix\Main\HttpApplication::getInstance();
$qConnection = $application->getConnection();
// Переключаем флаг треккера на сбор статистики
$qConnection->startTracker();
// ... Вызов компонентов, методов ...
$queries = $qConnection->getTracker()->getQueries();
$shortInfo = array_reduce(
$queries,
static function ($carry, \Bitrix\Main\Diag\SqlTrackerQuery $qt) {
$carry[] = $qt->getSql() . ' : ' . $qt->getTime();
return $carry;
}, []);
// Останавливаем сбор статистики
$qConnection->stopTracker();
#запросы #статистика #sql
👍13💯2
За что я отдельно люблю нейросети.
Они позволяют минимальными усилиями добиться результата там, где у меня нет экспертизы (но есть бурление идей).
Отредактировать фото, сгенерировать фото, создать видео-короткометражку с участием любимой игрушки младшей дочери — это развилось уже до такого уровня, что мне от момента, когда возникла идея и до результата нужно от всего нескольких минут до всего нескольких часов (в случае с мини-мультиками). И это на расслабоне и на кайфе. Без мучительного поиска инструментов и сложного стека. В основном, с лингвистическими затратами (мат от непослушных нейронок — это тоже лингвистика, теперь она органическая часть процесса =). Вот ещё год назад — не. А сейчас, где-то с лета, с НаноБананами и Вео-со-встроенной-озвучкой — прям вау и много сердечек (таких, которые девчата составляют скрещением кончиков большого и указательного пальцев) ❤️❤️❤️❤️❤️
P.S.: ...и да, заглянул во внутренности сайта и увидел все письма, которые вы написали и которые не отправлялись мне из-за не настроенного крона с крон_ивентс. Сколько же там паутины было🤪 . Когда много работы, перестаёшь следить, прибираться и проветривать 🪓
#нейронки #душевное
Они позволяют минимальными усилиями добиться результата там, где у меня нет экспертизы (но есть бурление идей).
Отредактировать фото, сгенерировать фото, создать видео-короткометражку с участием любимой игрушки младшей дочери — это развилось уже до такого уровня, что мне от момента, когда возникла идея и до результата нужно от всего нескольких минут до всего нескольких часов (в случае с мини-мультиками). И это на расслабоне и на кайфе. Без мучительного поиска инструментов и сложного стека. В основном, с лингвистическими затратами (мат от непослушных нейронок — это тоже лингвистика, теперь она органическая часть процесса =). Вот ещё год назад — не. А сейчас, где-то с лета, с НаноБананами и Вео-со-встроенной-озвучкой — прям вау и много сердечек (таких, которые девчата составляют скрещением кончиков большого и указательного пальцев) ❤️❤️❤️❤️❤️
P.S.: ...и да, заглянул во внутренности сайта и увидел все письма, которые вы написали и которые не отправлялись мне из-за не настроенного крона с крон_ивентс. Сколько же там паутины было
#нейронки #душевное
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥2❤1