Битриксоид из Колхоза
744 subscribers
297 photos
9 videos
5 files
98 links
Изучаем #Битрикс, находим ошибки, обслуживаем проекты, пишем модули, разрабатываем компоненты.

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

#phpstorm #мелочи
Следующая часть в плейлисте про ORM.

ORM-07 / Связывание OneToOne
Учимся связывать сущности - джойнить (join) таблицы самым простым способом: OneToOne.

00:06 - Вводная. Пример для связывания сущностей (referenceField)
02:24 - Таблица с элементами (b_iblock_element), какой класс обслуживает эту таблицу. Просмотр таблиц в Битриксе и подсвечивания связанных полей
06:26 - Делаем выборку элементов через ORM, D7 Query
11:11 - Что такое картинка для анонса, в какой таблице хранятся изображения (b_file)
18:42 - Добавление в запрос RuntimeField. Способ №1
23:26 - Алиасы полей в выборке
26:44 - ExpressionField, mysql-функция CONCAT - собираем путь к картинке из "запчастей", полученных в запросе
29:02 - Добавление в запрос RuntimeField. Способ №2. Обучение сущности новому полю: метод addField
33:09 - Кеширование скомпилированного объекта сущности
37:54 - Получение объекта из результата и работа с ним напрямую.

#битрикс #orm #пиздецкакмывседолгождалипродолжения
Иногда какой-то компонент вызывается в какой-то хитрой последовательности (например, вложен в шаблон новости), кешируется, но при изменении элемента инфоблока (новости) не сбрасывается, поскольку событие срабатывает только для тегов инфоблока, где произошли изменения.

...а сбрасывать целым ворохом весь соседний кеш из-за одного компонента как-то не очень хочется.

Сбрасываем кеш компонента из php-строки:
\CBitrixComponent::clearComponentCache('bitrix:form.result.new', 's1');

#битрикс #кеш #компоненты
Вообщем
Не подскажите
Кешь
Заного
Изминилось

💊

#поорать #полегчало
Первый выпуск инстаграм-попурри.

Инстапурри-1

00:01 - Убейся об стену грёбаный инстаграм
00:17 - Нет связи в лесу
01:15 - Помыл машину
04:20 - На рынке
04:31 - Карантинно-масочное с воспоминаниями о Сицилии
05:10 - Масочное будущее
06:57 - Чат для разработчиков на Битриксе
07:58 - Чат для разработчиков на Битрикс24
08:51 - Неочевидные причины происходящего
09:54 - Сем и восем
11:13 - Долина возможностей
11:42 - А вы знаете какой сегоlня день ваще?
12:28 - Гребенщиков про Битриксоида из Колхоза

#инстапурри #непробитрикс
Кто решит завязаться с ручной генерацией
«подписанных урлов» в ЯндексОблаке, а потом докопает до инструкции самого Амазона по этому вопросу
...тому я прям не завидую

#яндексоблакососёт #горбатыеинструкции #ноуменяполучилось #апричёмтутбитриксваще
Следующая часть в плейлисте про ORM.

ORM-07 / Связывание OneToMany
Учимся связывать сущности способом OneToMany.

00:06 - Вводная. Пример для связывания сущностей (referenceField)
03:00 - Свойство элемента типа справочник (привязка к хайлоадблокам) и значение поля UF_XML_ID
05:10 - Модуль хайлоадблоков и компиляция сущности. Таблица хранения записей хайлоадблоков
07:50 - Вручную собираем сущность хайлоадблока (Entity::compileEntity) по названию таблицы и нужным нам в выборке полям
09:30 - Компилируем сущность для выборки элементов инфоблока (по apiCode). Смотрим как хранится свойство элемента инфоблока и как выглядит для него скомпилированная сущность
13:51 - Связываем две сущности (join таблиц)
16:20 - Четвёртый параметр в конструкторе референсного (Reference) поля
19:00 - Две новости: одна плохая, друга хорошая
20:45 - Через поле сущности для элементов вытягиваем скомпилированную (refEntity) сущность для свойства элемента
28:09 - Связь OneToMany
32:19 - Создаём принимающий референс в сущности, которую привязываем к основной
33:23 - Создаём OneToMany у основной сущности
36:35 - Работа с коллекциями объектов
40:01 - Добиваем третью цепочку (джойним таблицу) к нашей сводной таблице
44:11 - Primary of table not found (когда в выборку для сджойненной таблицы не попал primary key)
47:01 - Пробуем то же с множественным свойством

#битрикс #orm #onetomany
Пример работы с условиями в ORM (а-то что-то примеров по ConditionTree не густо).

...ну и отдельно показываю как дотянуться через скомпилированную сущность элементов до символьных кодов (xml_id) значений свойств типа список и использовать их в фильтре.

...ну и негатив там (в позитивном смысле)

#битрикс #orm #filter #query #condition #фильтр #свойства #enum
В CIBlockElement::GetList -е можно сортировать по последовательности ID.
...а значит в тех компонентах, которые унаследованы от \Bitrix\Iblock\Component\ElementList можно пробрасывать массив ID-шек для сортировки*.

Помним, что и в выборке (языком GetList-а: в фильтре) должны присутствовать коды из сортировки (сортировка должна включать в себя выборку; не наоборот ...и выборка может быть значительно меньше чем последовательность в сортировке).

*) когда-то news.list переедет-таки на class.php и там тоже станет это возможным.
#битрикс #сортировка #id #getlist
Множественные поля хайлоадблоков и ORM #Битрикс

Рассматриваем проблему множественных свойств, чьи значения хранятся в отдельной таблице (без праймари ключа), в выборке приходят либо со значением "Array" либо только первое из значений. Применяем болевой приём с типом поля Array.

00:06 - Вводная
01:17 - Множественные свойства в хайлоадблоке и выборка через ORM
04:00 - При fetchObject: "Array" в значениях основного поля в выборке и только первое значение из всех значений в результате
06:50 - uts- и utm-таблицы
10:35 - Строим референс между таблицей хайлоадблока и таблицей со значениями множественного свойства
15:53 - В выборку всё-равно попадает только одно из всех свойств
19:45 - Первый ответ на вопрос, почему так происходит: в таблице со значениями свойств нет primary-ключа, а только код элемента хайлоадблока (одинаковый у всех записей)
21:42 - Заходим с другой стороны: расковыриваем проблему с "Array" в результатах выборки
28:21 - Объяснение проблемы с "Array". Ковыряем с xdebug
30:44 - Принуждаем ORM к нужному нам типу с массивом, чтобы сериализованная строка прожила массивом и попала в выборку
33:57 - Реализация типа поля Array
35:12 - Разные варианты обработки строки: через сериализацию и через json.

#битрикс #orm #compileentity #join
Второй выпуск инстаграм-попурри.
Инстапурри-2

https://youtu.be/ySyGbbxdjY8?t=1

00:01 - Супер настоящий 100% шоколад дома за 10 баксов за кило. Какао тёртое
01:55 - Сила маленьких шажочков. Бери только то, что можешь унести. Развивайся с той скоростью, которая тебе удобна или которую можешь себе позволить. Главное — не стоять на месте
07:07 - Новое Вакомовское перо, заказ через Амазон
11:43 - Как по пробке определить вкус вина
16:17 - Философствия о найме персонала на черешне
17:38 - Имеешь носки, - не можешь надеть
18:31 - Шум океана с неподвижным солнцем. Оркестр белого шума
20:30 - Маки. Самые красивые цветы
21:48 - Берлин, напоминание о Сицилии

#инстапурри #непробитрикс
Ситуация: работаем через экшен компонента (или модуля) и решаем подключить другой компонент, обернуть ответ в буфер и потом его вернуть в результате.

При вызове компонента подключаются стили, скрипты (как файлом, так и <script>-вкрапления) и нам нужно их корректно пробросить на фронт.

Пространство стилей и скриптов при выполнении экшена компонентов чистое от примесей ядра, потому смело используем накопленные буферы ассетсов.

...а на фронте обрабатываем его старой и в меру доброй processRequestData, которая умеет из html добыть нужные подключения и проинициализировать/подключить их.

#битрикс #экшен #ассетсы #феншуемпочтинепахнетночтоподелать
ORM-10 / Основы встроенного кеширования в ORM.

https://youtu.be/udouzW91vMc

01:06 - Вводная. Про кеширование. Проблема избыточных ключей, попадающих в выборку
05:10 - Идентификатор ключа в кешировании Query-объекта формируется на основе sql-запроса
10:10 - Для кеширования ORM использует управляемый (Managed Cache) кеш. А значит, кеш финализируется (сливается в хранилище) на эпилоге и это нужно учитывать
16:30 - Кеширование с джойнами
18:10 - Чистка кеша
22:30 - Префикс "orm_" к пути (названию таблицы), в котором хранится кеш, для корректной чистки кеша
24:10 - Метод cleanCache у сущности
25:01 - Переименование директорий с суффиксом вида ".~xxxxxx"

#битрикс #orm #кеш #cache
Региональный композитный кеш

Теория

Не редкая ситуация, когда под одним и тем же доменом, на одних и тех же урлах запущена мультирегиональность, которая выражается в смене куки-параметра. Пробросить куки-идентификатор в параметры компонентов не проблема, но что делать с композитным кешем?

Композитный кеш при попытке отобразить результат идёт самым кратчайшим путём. Всё, что он производит — ряд небольших действий, суть которых сводится к составлению урла и Проверке существования релевантного составленному урлу кеш-файла. Ни одно событие не вызывается до этого момента-П и потому вклиниться мы не можем. Кратчайший путь обеспечивает настолько быстрый ответ из кеша, насколько это возможно.

Если мы заглянем в опшинсы, которые носит с собой композитный кеш, мы заметим ряд куки-ключей. Заглянув во внутренности мы обнаружим, что кроме урла есть ещё понятие приватного ключа. Он-то нам и поможет маркировать хит региональным идентификатором.

#композит #региональность
Региональный композитный кеш

Практика

Схема региональной маркировки композитных хитов:

1. Пишем хелпер, наследуясь от абстрактного класса \Bitrix\Main\Composite\Data\CacheProvider, реализуем необходимые методы. Задача провайдера: обеспечить выдачу и хранение приватного ключа, который будет подмешан к урлу.

2. Подписываемся на событие 'main', 'OnGetStaticCacheProvider', которое движок композитного кеша опрашивает для получения пользовательского провайдера. Метод должен вернуть объект провайдера.

3. Там, где мы переключаем регион (смена куки, все дела), дёргаем наш персональный провайдер и продавливаем ему новый приватный ключ. Без этого шага (а смена региона как правило производится через аякс) иначе пнуть провайдер не получится: на аякс-вызовах композитный кеш пропускает ветку, по крайней мере на экшенах компонентов и BX.ajax финализация на эпилоге обрезанная.

#композит #региональность
— Гля-я-я-я-янь!
— Альошенька, шо це?
— Мам! Це моє перше облачне пріложеніє!
— Гм. Кхм. Облачне? Пріложеніє? Для чого це воно?
— Воно створює отчьоти про недостачу на складі, яка формується по заказах, які ще не відвантажені.
— Ох-ох-ох. Отчьот! В зошиті виписав, ось тобі і отчьот. І це ти через це не спиш по ночах!? Відведи корову до череди, снідай та пішли буряки сапати. Облачний ти мій...

#aws #amazon #хмарки
Референсить (джойнить) можно двумя способами:
- (1) прямо в getList через регистрацию рантайм джойнов;
- (2) обучать сущность полям а в getList-е просто их использовать.

Мне очень нравится (и я везде об этом повторяю) второй способ.

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

На скрине:
- скомпилировали сущность;
- добавили референсное поле на эту же сущность;
- chain-им по новому полю сколько-угодно раз.

Код из примера отбирает всех детей на пятом уровне вложенности по заданному корневому (первого уровня) разделу.

К тому же пример довольно выразителен, поскольку мы можем оперировать не просто ID родительских разделов, а любым полем, вплоть до пользовательских.

P.S.: казалось бы: мы могли тот же результат получить через грамотную выборку с лимитом по left_margin/right_margin, но нам пришлось бы указать значения границ корневого элемента, а это дополнительный запрос.

#битрикс #orm #тыгляньчотворит
This media is not supported in your browser
VIEW IN TELEGRAM