0

我正在为 CRM 2011 进行自定义。我创建了一个自定义实体(它基于活动,因此也是一种活动类型),创建了与帐户的关系,并在帐户表单上创建了一个指向 Web 资源的自定义导航链接这将为自定义显示提供动力(这只是一个带有 JavaScript 的 html 页面)。

使用 Web 资源而不是标准关系链接,因为它正在执行列表和预览显示,而不仅仅是开箱即用功能提供的列表视图。

我想要做的是在帐户表单上显示活动选项卡(活动功能区选项卡),每当按下自定义导航链接并且用户进入该部分时,它的显示方式与单击活动导航链接时显示的方式相同. 我似乎找不到太多关于标签显示规则的信息,因为我认为这是应该完成的地方(如果可能的话)。

此外,如果有一种 JavaScript 方法(尽管我还没有找到),那么它也可以。

4

1 回答 1

2

我们有一个解决方案。

免责声明不推荐(或支持)此解决方案,因为它是史诗般的完整破解,但它为我们解决了问题。这是一个临时的功能,因为我们构建了一个更适合客户的自定义解决方案,所以它不会继续向前发展,这就是黑客对我们有用的原因。此外,脚本可以写得更好,我们只是想把它拿出来。

注意:此解决方案将使用一些外部库,例如 JQuery 和 CRM FetchKit

1) 为自定义对象和账户添加关系 我们有一个自定义实体,我们创建了一个从 Account 实体到我们的自定义实体的 1:N 关系。这使我们能够做的是在帐户表单上创建一个导航链接,该链接指向我们自定义实体的关联视图。一旦链接进入,我们将保存并发布更改。

2) 获取创建的新导航链接的 id 上面的链接现在应该在表单上,​​所以在保存和发布之后,我们转到实时视图并使用 IE 开发人员工具获取链接的 id,因为我们需要捕获onclick 并稍后用它做一些事情。

3) 装饰创建的导航链接的 onclick 我们有 id 所以我们想用一些额外的功能来装饰 onclick。我们创建了 2 个新的网络资源:

  • "YourCustomEntity" _init : Javascript Web 资源:这将用于在帐户表单的 onload 中获取我们创建的链接并更改 onclick 以执行一些其他操作
  • YourCustomEntity _page : HTML Page Web Resource:根据原始问题,我们还有一个显示预览窗格的附加要求,这就是我们不能使用标准网格的原因

“YourCustomEntity”_init 的代码非常基本,没有任何对象缓存或类似的东西,它只是为了解决我们的问题而编写的。我在代码中添加了注释。Entity 也是一个通用名称,这是我们自定义类型的名称。我们将原始关联视图设置为隐藏而不是显示:无,因为我们仍然需要它在后台加载,因为这是功能区更新和加载的地方,所以肯定有一些脚本正在执行此操作,希望我们知道所以我们可以使用它:)

function previewEntityInit(){
    //Catch any navigation link click, we need this because we need to hide our 
    //grid when we are not on the custom entity page
    $('.ms-crm-Nav-Subarea-Link, .ms-crm-FormSelector-SubItem').click(function () {

    //Get the id of the link clicked and the frame injected object
    var id = $(this).attr('id'),
        cFrame = $('#entity_frame_preview');

    //if the frame has already been injected
    if(cFrame.length !== 0) {
        //If we are not in the correct section 
        //(i.e. activities nav link was clicked) hide it 
        if (id !== 'nav_new_account_new_entity') {
            cFrame.attr('style', 'display:none;');
        }
        else{
            //The correct link was clicked, so show it
            cFrame.attr('style', 'display:block; width:100%; height:100%;');
            $('#new_account_new_entityFrame').attr('style', 'visibility: hidden;');
        }
    }
    else{
       //This is the first time the correct link has been clicked
       //So we hide the default associated view and inject our
       //own iframe point to the YourCustomEntity_page embedded resource we created
       var src = Xrm.Page.context.getServerUrl();
        if (id === 'nav_new_account_new_entity') {
           $('#new_account_new_entityFrame').attr('style', 'visibility: hidden;');

          $('<iframe />', {
                id: 'entity_frame_preview',
                src: src + '/WebResources/new_entity_page',
                width: '100%',
                height: '100%'
            }).prependTo('#tdAreas');
        }
    }
});

YourCustomEntity_page 不会在此处显示所有代码,但我们基于此链接:

预览表单链接 我们通过以下方式对其进行了更改:

  • 只有视图名称是硬编码,其余通过代码获取(代码如下)
  • 我们不使用第二个 iframe 选项,而是使用一个简单的 HTML 部分来加载它(下面的代码和我们的加载函数)

没有硬编码值

var server = Xrm.Page.context.getServerUrl();             
var orgName = "";

// grid related settings
var entityId = window.parent.Xrm.Page.data.entity.getId();
var entityType = "1";
var areaView = "new_account_new_entity"; 
var internalGridElement = "crmGrid_new_account_new_entity";
var timeoutKey = null;

用于预览的 HTML

<div id="previewForm" style="display: none;">
    <ol>
        <li><span class="lbl">Account:</span><span id="lblAccount"></span></li>
        <li><span class="lbl">Created:</span><span id="lblDate"></span></li>
        <li><span class="lbl">Regarding:</span><span id="lblRegarding"></span></li>
        <li><span class="lbl">Owner:</span><span id="lblOwner"></span></li>
    </ol>
    <div id="subject">
       <span class="lbl">Subject:</span><span id="lblSubject" class="value"></span>
    </div>
    <div>
       <span id="lblMsg"></span>
    </div>
</div>

加载预览代码

这使用了一个名为 CRMFetchKit 的外部库。该代码实际上执行了三个 fetch 调用,这并不理想,它应该是一个(使用连接,google it :)),但这不起作用并且正在拖动,所以我们决定只使用三个,因为整个部分将很快就会被托管解决方案取代。

function LoadPreviewPane(entity) {
            if (entity != null) {
                $('#previewForm').show();

                var fetchxml = ['<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">',
                                '  <entity name="new_entity">',
                                        '<attribute name="subject" />',
                                        '<attribute name="description" />',
                                        '<attribute name="createdon" />',
                                        '<attribute name="new_account" />',
                                        '<attribute name="ownerid" />',
                                '    <filter type="and">',
                                '      <condition attribute="activityid" operator="eq" value="' + entity.Id + '" />',
                                '    </filter>',
                                '  </entity>',
                                '</fetch>'].join('');

                CrmFetchKit.Fetch(fetchxml).then(function (results) {

                    var account = window.parent.Xrm.Page.getAttribute("name").getValue(),
                        subject = results[0].getValue('subject'),
                        desc = results[0].getValue('description'),
                        created = new Date(results[0].getValue('createdon')),
                        theDate = created.getDate() + "/" + (created.getMonth() + 1) + "/" + created.getFullYear(),
                        owner = '',
                        regarding = '';

                    var fetchxml2 = ['<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">',
                                '  <entity name="systemuser">',
                                        '<attribute name="fullname" />',
                                '    <filter type="and">',
                                '      <condition attribute="systemuserid" operator="eq" value="' + results[0].getValue('ownerid') + '" />',
                                '    </filter>',
                                '  </entity>',
                                '</fetch>'].join('');

                    CrmFetchKit.Fetch(fetchxml2).then(function (users) {
                        owner = users[0].getValue('fullname');
                        $('#lblOwner').html(owner);
                    });

                    var fetchxml3 = ['<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">',
                    '  <entity name="account">',
                    '<attribute name="name" />',
                    '    <filter type="and">',
                    '      <condition attribute="accountid" operator="eq" value="' + results[0].getValue('new_accountname') + '" />',
                    '    </filter>',
                    '  </entity>',
                    '</fetch>'].join('');

                    CrmFetchKit.Fetch(fetchxml3).then(function (regardings) {
                        regarding = regardings[0].getValue('name');
                        $('#lblRegarding').html(regarding);
                    });

                    $('#lblAccount').html(account);
                    $('#lblSubject').html(subject);
                    $('#lblMsg').html(nl2br(desc));
                    $('#lblDate').html(theDate);                        

                });
            }
        }
于 2012-12-18T12:20:18.190 回答