Кастомизация
22
Мар
7

Переопределение клика на лукапе

Все знают, что по клику на лукапе открывается стандартный диалог. Но не все знают, что это поведение можно изменить. Например, Вы разработали свой собственный диалог выбора значения в лукапе на основе технологии Silverlight, который реализует дополнительные возможности (не доступные в стандартном диалоге). Продемонстрируем на простом примере как это можно сделать:

  • Создайте HTML Веб-ресурс с именем lookup.html и таким кодом:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>Тест лукапа</title>
        <script type="text/javascript">
            function returnResult() {
                var lookupItems = [{ id: "{AB2BAF42-7856-E111-A031-000C29CDB72E}", name: "Blue Company (sample)", type: 1}];
                window.returnValue = lookupItems;
                window.close()
            }
        </script>
    </head>
    <body>
        <input type="button" value="Вернуть значение лукапа" onclick="javascript: returnResult();" />
    </body>
    </html>
    

    Это простая HTML станица, которая содержит одну кнопку, которая в свою очередь вызывает JS функцию, возвращающую в окно, откуда была вызвана текущая страница, объект, подходящий для подстановки в лукап (в данном случае это захардкоденная организация);

  • Создайте JS Веб-ресурс:
    function overrideLookup(lkpName, URL) {
        var element = document.getElementById(lkpName);
        element.onshowdialog = function (event) {
            var result = window.showModalDialog(URL);
            event.oLookupItems = { items: result };
        }
    }
    

    Тут у нас простая функция, принимающая два параметр: имя лукапа (для которого нужно переопределить клик) и URL страницы, которая будет заменять стандартный диалог лукапа. Соответственно, она подменяет вызываемый диалог для лукапа своим и подставляет возвращенное значение в лукап;

  • Для примера я добавил JS Веб-ресурс на форму Интереса и вызвал функцию overrideLookup на онлоаде с такими параметрами: «new_clientid», «/WebResources/new_lookup.html».



Комментарии (7)
  • Руслан 22.03.2012

    У меня возникает проблема, описаная в коментах тут
    http://mscrmtools.blogspot.com/2011/07/crm-2011-overriding-lookup-onclick.html

    и не могу никак ее решить(((

  • slivka_83 22.03.2012

    Сейчас попробовал — у меня та же ошибка. Поставил 8 ролап и перезагрузил сервер — ошибка исчезла.

    З.Ы. Альтернатива: задать «переключатель», который при первом вызове окна будет переводить переключатель в «1» и запускать таймер, который обнулит переключать через секунды 2 🙂
    А код дополнить так чтобы окно открывалось только при значении переключателя = 0 🙂

  • Дмитрий 22.03.2012

    привет,
    уточни пож-та о каком переключателе идет речь
    никак не могу понять

  • slivka_83 22.03.2012

    переключатель — это переменная в коде 🙂
    допустим на онлоаде вы задаете для нее z = 0
    Код решения нужно обновить так, чтобы окно открывалось только когда эта переменная == 0. При этом, при открытии окна нужно переводить эту еременную например, в единицу (1) и запускать таймер и через три секунды сново переводить эту переменную в ноль. Соответственно после первого срабатывания будет открывать окно и переводить переменную в единицу, а второго срабатывания не произойдет, т.к. переменная равна единице.

    а лучше поставьте ролап 🙂

  • Борис 22.03.2012

    Подскажите пожалуйста как подобный подмен бы реализовывался в CRM 4.0 при клике на лукапе, например в продуктах?

    Спасибо.

  • Алексей 22.03.2012

    После установки 12 rollup’а (где появилась возможность использовать альтернативный браузер) начались проблемы. Более не работает скрипт изменяющий свойство «onshowdialog». Вернее свойство «onshowdialog» (в HTML лукапа) вообще нет и при его создании система просто его игнорирует. Вот код, который работает до rollup’а 12 и не работает после его установки:

    var element1 = document.getElementById(«my_lookup_fieldid»);
    element1.onshowdialog = function (event)
    {
    var url = «http://anyaddress.com»;

    var result = window.showModalDialog(url);
    event.oLookupItems = { items: result };
    };

    У кого-нибудь есть другой подход к решению данной задачи?
    Спасибо.

    P.s. браузер тот же — IE 8.

*

code