Кастомизация
15
Мар
8

Расширенный поиск в iFrame’е на форме

В CRM 4.0 часто приходилось запихивать всякую фигню в iFrame: связанные Представления, Расширенный поиск и т.д. В CRM 2011 ситуация со связанными представлениями значительно улучшилась, а вот Расширенному поиску не повезло. Поэтому будем все тем же не поддерживаемым способом пытаться запихнуть его в iFrame.

Что для этого нужно:

  • Найдите в скуле SavedQueryId дефолтного Представления того объекта, который Вы хотите отобразить результатах работы Расширенного поиска:
    SELECT
        Name,
        SavedQueryId,
        ReturnedTypeCode,
        FetchXml,
        LayoutXml
    FROM
        SavedQuery
    WHERE 
        1=1
        and QueryType=1
        and IsDefault=1
    ORDER BY
        ReturnedTypeCode
    
  • Создайте HTML Веб-ресурс с именем «new_SubGridFetchXml.htm» и таким кодом:
    <HTML>
    <HEAD>
        <TITLE>Расширенный поиск</TITLE>
        <SCRIPT type=text/javascript src="ClientGlobalContext.js.aspx"></SCRIPT>
        <SCRIPT type=text/javascript>
            function submitForm() {
                var form = document.forms[0];
                var context = GetGlobalContext();
                form.action = context.getServerUrl() + '/AdvancedFind/fetchData.aspx';
                form.LayoutXml.value = '<LAYOUTXML>';
                form.FetchXml.value = '<FETCHXML>';
                form.submit();
            }
        </SCRIPT>
        <META charset=utf-8>
    </HEAD>
    <BODY onload=submitForm()>
        <FORM method=post action="">
            <INPUT name=FetchXml type=hidden> 
            <INPUT name=LayoutXml type=hidden> 
            <INPUT name=EntityName value=contact type=hidden> 
            <INPUT name=DefaultAdvFindViewId value=<SavedQueryID> type=hidden> 
            <INPUT name=ViewId value=<SavedQueryID> type=hidden> 
            <INPUT name=ViewType value=4230 type=hidden> 
            <INPUT name=SortCol value=<SortColumnLogicalName>:1; type=hidden> 
            <INPUT name=UIProvider type=hidden>
            <INPUT name=DataProvider type=hidden>
        </FORM>
    </BODY>
    </HTML>
    

    В этот код Вам нужно внести следующие изменения:

    • Вместо <SavedQueryID> подставьте GUID дефолтного представления, найденный на предыдущем шаге;
    • В <SortColumnLogicalName> задайте имя поля, по которому должна производиться сортировка;
    • В <LayoutXml> и <FetchXml> поместите значения аналогичных полей, возвращенных SQL-запросом в первом пункте (но можете их изменить на свое усмотрение). При этом из LayoutXml удалите все поля, кроме основного атрибута.

    В итоге страница должна выглядеть примерно так:

    <HTML>
    <HEAD>
        <TITLE>Расширенный поиск</TITLE>
        <SCRIPT type=text/javascript src="ClientGlobalContext.js.aspx"></SCRIPT>
        <SCRIPT type=text/javascript>
            function submitForm() {
                var form = document.forms[0];
                var context = GetGlobalContext();
                form.action = context.getServerUrl() + '/AdvancedFind/fetchData.aspx';
                form.LayoutXml.value = '<grid name="resultset" object="2" jump="fullname" select="1" icon="1" preview="1"><row name="result" id="contactid"></row></grid>';
                form.FetchXml.value = '<fetch version="1.0" output-format="xml-platform" mapping="logical"><entity name="contact"><attribute name="fullname" /><attribute name="telephone1" /><attribute name="contactid" /><order attribute="fullname" descending="false" /></entity></fetch>';
                form.submit();
            }
        </SCRIPT>
        <META charset=utf-8 />
    </HEAD>
    <BODY onload="submitForm()">
        <FORM method=post action="">
            <INPUT name=FetchXml type=hidden> 
            <INPUT name=LayoutXml type=hidden> 
            <INPUT name=EntityName value=contact type=hidden> 
            <INPUT name=DefaultAdvFindViewId value="00000000-0000-0000-00AA-000000666400" type=hidden> 
            <INPUT name=ViewId value="00000000-0000-0000-00AA-000000666400" type=hidden> 
            <INPUT name=ViewType value=4230 type=hidden> 
            <INPUT name=SortCol value=fullname:1; type=hidden> 
            <INPUT name=UIProvider type=hidden>
            <INPUT name=DataProvider type=hidden>
        </FORM>
    </BODY>
    </HTML>
    
  • Вынесите Веб-ресурс на форму и опубликуйте изменения.



Комментарии (8)
  • Константин 15.03.2012

    Здраствуйте
    А почему в представлении поля отображаются по два раза?
    И как это убрать?

    Спасибо

  • Константин 15.03.2012

    Более точно
    К layout добавляется layout системного представления. 🙂

  • slivka_83 15.03.2012

    Здрасьте 🙂
    Обновил код. Нужно из form.LayoutXml.value удалить все поля кроме основного атрибута.

  • Константин 15.03.2012

    Да, но тогда мы получим layout представления.(что плохо)
    хотелось бы иметь возможность изменения и layout, а не только fetch.

    Если достаточно поменять фетч, есть решения проще.
    http://crmgreenbible.blogspot.com/2011/07/crm-2011-change-subgrid-fetchxml.html
    но оно не позволяет менять layout

  • slivka_83 15.03.2012

    Ну можно сделать так…
    Создать какое-либо предстиавление (или использовать существующее) и деактивировать его.
    В код подставить его GUID. Для этого Представления либо оставьте одно поле и уже коде «дополните» его новыми полями, либо сразу в этом Представлении захардкодьте нужные поля.

  • Константин 15.03.2012

    Спасибо. интересный вариант.

  • Filo 15.03.2012

    Вопрос такой а как в iframe теперь можно управлять полученным расширенным поиском?

    например на форме есть несколько полей (характеристики недвижимости) и хотелось бы чтобы при их заполнении срабатывал расширенный поиск по этим полям по всем объектам недвижимости и выдавал подходящие варианты

  • slivka_83 15.03.2012

    Можно динамически формировать HTML и подставлять его в iFrame.

*

code