Добрый день, коллеги! Три месяца как изучаю Битрикс и вот пришла беда откуда не ждали. Появилась задача сделать особое поле для ввода текса в карточке компании, со своей логикой. Первым делом полез читать документацию. Тут нахожу информацию о том, как зарегистрировать пользовательский типа поля. А тут нахожу описание процесса разработки и встройки, а также архив с примером того как это должно быть. Вроде всё красивою и можно жить, но не тут то было...
С регистрацией поля, проблем не возникает, всё работает чётко. Проблемы начинаются, если попробовать этим полем воспользоваться. Как известно, встройка происходит путём внедрения <iframe> в карточку сущности CRM (в нашем случае в карточку компании), этот фрейм выводит содержимое обработчика который мы зарегистрировали. Далее, как показано в примере, мы должны вызвать метод
Код
const placementInfo = BX24.placement.info();
который вернёт нам информацию о месте встройки, в т.ч. и режим в котором это поле открыто.
Код
// Если местом встройки является USERFIELD_TYPE, то в зависимости от того в каком режиме открыта карточка (редактирование или просмотр)
// мы показываем пользователю либо input, либо lable (по аналогии с обычными текстовыми полями в карточках CRM)
if(placementInfo.placement === 'USERFIELD_TYPE'){
if(placementInfo.options.MODE === 'edit'){
...
}
else{
...
}
}
Вместе с информацией о месте встройки мы получаем и информацию о том в каком режиме находится карточка сущности (параметр MODE, который либо view, либо edit);
Если рассматривать стандартные текстовые поля Битрикс24, то когда карточка в режиме просмотра, мы видим label со значением поля. Если мы кликнем на него мышью, то поле переходит в режим редактирования и вместо lable мы видим input с тем же значением. На клик мышки в карточке сущности CRM, реагирует div с классом ui-entity-editor-content-block в котором находится сам элемент, а в случае встройки пользовательского типа поля это ifarme. Так вот этот фрейм перекрывает собой указанный выше div так, что нужно поймать край фрейма, где по ощущениям только линия высотой в 1 пиксель, реагирует на клик. Как следствие перевести поле в режим редактирования невозможно (ну, вернее возможно, поймав нужный пиксел, но в прод такое не отправишь).
Что я пробовал делать? 1. По началу я думал, что в библиотеке BX24 есть некий метод, который переводит карточку из режима просмотра в режим редактирования. Я предполагал, что просто повешу его на событие onclick label'a и будет мне счастье, но перекурив документацию вдоль и поперёк я ничего такого не нашёл.
2. Я пытался менять z-index в контейнерах фрейма, но "всё что произошло во фрейме, остаётся во фрейме ". Через отладчик браузера, я смог добиться правильной позиции элементов по координате z прописав тегу <iframe style="position: relative; z-index: -1;"...> при этом весь фрейм реагирует на клик, но это в отладчике, т.к. доступа к тегу <iframe> из самого фрейму естественно нет, а попытка обратиться к родителю фрейма через window.parent... блокируется правилами CORS со стороны Битрикс.
3. С подачи техподдержки Битрикс24, я забил на параметр MODE и решил написать свой обработчик который внутри фрейма по клику отображал мне вместо label'a input, но это ничего не даёт, т.к. чтобы сохранить введённое значение в input нужно сначала вызвать BX24.placement.call('setValue', ...), а потом нажать кнопку "СОХРАНИТЬ" в карточке, чтобы данные сохранились, а эта кнопка появляется только в том случае, когда форма переведена в режим редактирования, что сделать не получается. Как оказалось в последствии специалист техподдержки неправильно понял мою проблему (или я её неправильно объяснил)
4. От отчаянья я пытался просто поменять значение параметра MODE простым присваиванием значения "edit" и перезагружать фрейм, но это занятие бесполезное, не знаю даже как я до этого дошёл.
Для техподдержки я снял видео с проблемой, чтобы все всё поняли, но процесс общения с ТП уж очень долог и на сегодняшний день у меня попросили показать код и пока тишина.
Что меня смущает? А смущает меня то, что перерыв гугл, ютуб, яндекс и даже vk видео, я не нашёл ни одного упоминания этой проблемы, я даже не нашёл ни одного кейса где встраивался бы свой тип поля для облачного Битрикс24, с использованием режимов редактирования и просмотра (была пара роликов где просто описывался концепт встройки), везде эти задачи решаются для коробки, для которой они решаются другими методами и инструментами недоступными в облаке. Меня так же смущает, что в ТП не сразу поняли проблему и не ткнули носом в какой-нибудь пункт документации или сказали "ой, да мы знаем, разработчики решают". Складывается ощущение, что либо я изобретаю велосипед и моя зада решается как-то по другому, поэтому нет нигде, никакой информации по этому поводу, либо я первый человек на земле, который решил встроить пользовательский тип поля в облачный Битрикс24, с использование обоих режимов.
Я заметил, что даже в Маркете есть решения после установки которых появляются новые поля в карточке с такой же проблемой. Но не может быть, чтобы они давно не обратились в техподдержку и ТП не была в курсе это проблемы.
Задался тем же вопросом, спросил у техподов Б24, ответ был следующий:
Цитата
На текущий момент специально заложено такое поведение пользовательских типов полей: в режиме просмотра карточки всегда отображается сразу сам фрейм приложения. Поле уже готово к взаимодействию, отдельно переходить в режим редактирования не требуется. Приложила пример.
Само взаимодействие пользователя с приложением во фрейме регулируется уже со стороны приложения.
То есть вы можете писать обработки для событий и не привязываться к параметру MODE.
Режим поля никогда не был доступен к изменению, но приходилось проверять и ориентироваться на его состояние - потому режим отмечен в документации. Теперь этого делать не нужно.
Дополнительно прикрепила ваше обращение к заявке для возможности редактировать встроенные поля по клику. Как по заявке будут новости, вам придет автоматическое уведомление в данном тикете и на почту вне зависимости от наличия активных диалогов.