Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Отладка ISV скриптов, которая не ведет к гибели нервной системы
Запись от Артем Enot Грунин размещена 13.04.2010 в 08:29
Теги button, dom, java script, unsupport, маразм
Всякий раз, когда я смотрю очередное видео по системе, или читаю блоги разработчиков, где рассказывается про возможности доработки интерфейса CRM: ISV , мне чудится, что они реально гордятся своей концепцией. Вы представляете, вы можете добавить на экран кнопку?! Да да вы можете в это поверить?! Всего-то и надо выправить какой-то невнятный XML документ, который теперь еще и не в каталоге с системой лежит, а вообще нигде не лежит - его нужно импортировать после всякого изменения! Не удивительно, что у новичков этот момент вызывает массу вопросов. И правда - есть же нормальный графический редактор формы, где можно, в том числе, добавить код обработчиков событий. Почему же все что за ее пределами настраивается столь чудовищно неудобно? А еще - офигеть - вы можете натянуть на форму свой IFrame!!! Чудо, правда? И он не будет уметь ничего, вообще ничего! Он вообще будет для системы совершенно посторонним веб приложением, и в вам нужно будет еще сильно постараться, чтобы его как-то куда-то интегрировать. Про внешний вид я вообще молчу.
И есть же у Microsoft примеры систием, где это реализовано! Я не в коем случае не защищаю то, как это сделано в SharePoint, но там, все же есть хоть какая-то программная модель для интеграции пользовательских веб частей и контролов в системные страницы. А у нас в CRM только JS, команда debugger и увесистый запас терпения. Которого, кстати, не всегда хватает. Очередная разработка заставила меня изобрести для себя способ (модифицировать уже известный) как сэкономить себе нервы и ускорить процесс разработки JS обработчика ISV кнопки.
1. Сохраняем скрипт в файл и кладем его в каталог ISV.
2. По нажатию кнопки:
В результате мы получаем:
1. Код загружаемый через ISV.config пишется только один раз.
2. Основной код можно править и отлаживать без перезагрузок кастомизаций - достаточно отключить кэширование и обновлять окно.
3. Повторные вызовы происходят быстрее (иначе код всякий раз выполняется через window.execScript(...) ).
4. Вы можете сохранить состояние вашего кода между вызовами.
5. Внешние js файлы кэшируются браузером, так что загрузка большого кода не замедляет форму.
Как может выглядеть ваш код:
Эту часть нужно эскейп-кодировать и поместить в ISV XML
Важный момент: идентификатор ISV кнопки генерируется в процессе импорта, поэтому поиск выполняется по заголовку. В данном примере кнопка названа "ISV Test", такое же значение должен иметь атрибут "Title" ISV кнопки.
Функция InitButton принимает с формы все ценное, что может нам пригодиться: ссылки на грид и кнопку. Далее следует реализовать ее в загружаемой библиотеке:
Результат прекрасно работает даже на "тяжелых" скриптах:
И есть же у Microsoft примеры систием, где это реализовано! Я не в коем случае не защищаю то, как это сделано в SharePoint, но там, все же есть хоть какая-то программная модель для интеграции пользовательских веб частей и контролов в системные страницы. А у нас в CRM только JS, команда debugger и увесистый запас терпения. Которого, кстати, не всегда хватает. Очередная разработка заставила меня изобрести для себя способ (модифицировать уже известный) как сэкономить себе нервы и ускорить процесс разработки JS обработчика ISV кнопки.
1. Сохраняем скрипт в файл и кладем его в каталог ISV.
2. По нажатию кнопки:
- Загружаем и исполняем все необходимые библиотеки функций.
- Находим в документе саму кнопку
- Заменяем ее OnClick уже загруженным в память обработчиком.
В результате мы получаем:
1. Код загружаемый через ISV.config пишется только один раз.
2. Основной код можно править и отлаживать без перезагрузок кастомизаций - достаточно отключить кэширование и обновлять окно.
3. Повторные вызовы происходят быстрее (иначе код всякий раз выполняется через window.execScript(...) ).
4. Вы можете сохранить состояние вашего кода между вызовами.
5. Внешние js файлы кэшируются браузером, так что загрузка большого кода не замедляет форму.
Как может выглядеть ваш код:
Эту часть нужно эскейп-кодировать и поместить в ISV XML
Код:
// Библиотеки скриптов var jsPopup = "/_static/_controls/PopupMenu/popupmenu.js"; var jsGrouping = "/ISV/CRMGridGroup/grouping.js"; loadScript(jsPopup); loadScript(jsGrouping); var oThisButtonLabel = "ISV Test"; var oThisButton = null; var oMenuBar = document.all.crmMenuBar; var oMenus = oMenuBar.getElementsByTagName("LI"); for (var i=oMenus.length -1; i > 0; i--) { var oMenuItem = oMenus[i]; if (oMenuItem.title == oThisButtonLabel) { oThisButton = oMenuItem; break; } } var oGrid = document.all["crmGrid"]; InitButton(oThisButton, oGrid); // Run custom code from /grouping.js oThisButton.onclick(); function loadScript(oScriptURL) { var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); xmlHttp.open("GET",oScriptURL,false); xmlHttp.send(); window.execScript(xmlHttp.responseText); }
Функция InitButton принимает с формы все ценное, что может нам пригодиться: ссылки на грид и кнопку. Далее следует реализовать ее в загружаемой библиотеке:
Код:
var _Button = null; var _Grid = null; function InitButton(oButton, oGrid) { _Button = oButton; _Grid = oGrid; oButton.onclick = isvButtonOnClick; } function isvButtonOnClick() { // Code... // debugger; }
Всего комментариев 0