Залил это успешно на сайт. Текст из примера подтянулся, я обрадовался, что всё так просто и решил, как и указано в доке, ajax'ом подтянуть свой компонент. Вот тут-то веселье и началось. Создал вкладку, повесил на неё событие BX.SidePanel.Instance.open, добавил вызов ajax. Зашел в карточку и всё чудом заработало. Обрадовался такому простому решению и, с чувством выполненного долга, закрыл браузер, вырубил комп и пошел домой с работы.
На следующий день, перед тем, как выкатить это дело для внешнего теста, решил еще раз проверить. Зашел в список компаний, открыл карточку ЦРМ, которая, из списка, тоже открывается в sidePanel, нажал на свою вкладку и...увидел голый HTML без стилей и скриптов.
И вот тогда началась моя личная война. Я перепробовал очень много разных подходов. И таймеры вешал, чтобы ждать прогруза, мало ли, там же всё ajax, и события все обрабатывал. И вручную вызывал скрипты на странице, файлики подгружал вне компонента. Ничего.
Потом решил покопаться в функции, bx.ajax.get, которую решил использовать, чтобы не пилить совместимость jquery и BX. Её так расхваливали разработчики, что прям захотелось попробовать.
Описание в документации такое: processData: true|false – нужно ли сразу обрабатывать данные? Думаю, ну выключу, посмотрим, что там происходит. А дальше начал читать описание других параметров и вот что увидел:
. Если параметр processData установлен в true, то обработка будет в зависимости от типа данных:
html: результат будет очищен от js-кода. Код будет выполнен после передачи данных обработчику. Перед передачей будут выполнены все скрипты с атрибутом bxrunfirst, или все скрипты, если параметр scriptsRunFirst установлен в true;
Угадайте, какой по-умолчанию тип данных стоит? Ага, он самый.
"Код будет выполнен после передачи данных обработчику" - где это работает, я не понял, если честно.
После этого я начал тестить функцию (bx.ajax) с processData: false, и сразу заметил, что подгружаются стили, но скрипты всё еще не поддавались.
После дня разбора, я заметил, что ни в одном компоненте в crm, которые я посмотрел, нет script.js, и это навело на мысль, что бьюсь я зря.
Тогда я засунул скрипты из компонента в обработчик "onload" из выше упомянутого примера.
Скрипты начали заводиться, понятное дело, мы ж их уже не загружаем извне.
Но и тут я наткнулся на очень жесткие подводные камни.
Ни к одному нужному мне элементу вне iframe, который загружен в данный момент, у меня не было доступа.
Пришлось искать выход, как управлять iframe извне.
Помогло использование конструкции window.parent. Так мы работаем не с конкретным фреймом, а с окном, в котором он вызван. Доступ к заветным полям был получен и я уже было вздохнул спокойно, !НО!
Мне нужно было не только взаимодействовать с полями в окне, которое я сделал, но и с полями в карточке ЦРМ при закрытии этого окна.
Затык тут почти такой же, да не совсем.
Если у нас открыта карточка в sidePanel и мы открываем своё окно в sidePanel, то при его закрытии, мы попадаем не на предыдущую вкладку, как это логично было бы предположить, а в общее окно. А значит для доступа в айфрейм надо использовать конструкцию:
$('body').find(''iframe").contents().find('наш дом элемент в карточке CRM');
Т.е. для случая открытия карточки CRM в iframe и случая открытия карточки в полном окне, нужно написать отдельный поиск контейнера, в котором лежат нужные нам поля.
Попутно я пытался с тех. поддержкой что-то прояснить, но из этого ничего не получилось. "У нас всё работает".
Прикреплю пару скринов с проблемой загрузки скриптов для ясности, с чего всё это началось.
Евгений Храпов, эм... а зачем Вы пытаетесь эту информацию открыть поверх слайдера? Она же относится напрямую к сущности, и значит она должна быть в табе, а не в слайдере. В таком случае проблем бы не было.
Андрей Николаев, нет, эта не информация для конкретной сущности. Компонент - это настройки отображения полей в зависимости от выбранных значений других полей. Он относится ко всем сущностям ЦРМ и для удобства восприятия, хотелось его выделить в отдельном окне, которое не будет трогать рабочую область карточки. С одной стороны вкусовщина, с другой стороны - стандартный функционал, должен одинаково работать, согласитесь, без костылей и обходов.
В общем помощи не дождешься, даже воспроизводить проблему не стали или не смогли, не знаю. Отправлял им исходники, а они всё одно: Какие у вас браузеры? У вас последние версии браузеров? А какие? Остается уповать на описанный метод: Помещать скрипты компонента в onload