单击自定义导航链接时显示“活动”选项卡

时间:2012-12-12 10:54:56

标签: dynamics-crm-2011 dynamics-crm

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我们有一个解决方案。

免责声明不建议(或支持)此解决方案,因为它是一个完整的史诗比例,但它解决了我们的问题。这是一个临时的功能,因为我们构建了一个更适合客户端的自定义解决方案,所以它不会向前移动,这就是黑客为我们工作的原因。另外,脚本可以写得更好,我们只是想把它拿出来。

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

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

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

3)完成创建导航链接的onclick 我们有这样的ID,我们想用一些额外的功能来装饰onclick。我们创建了2个新的Web资源:

  • “YourCustomEntity” _init:Javascript网络资源:这将用于帐户表单的上传,以获取我们创建的链接并更改onclick以执行其他操作
  • YourCustomEntity _page:HTML页面网页资源:根据原始问题,我们还需要显示预览窗格,这就是我们无法使用标准网格的原因

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

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 不会在这里显示所有代码,但我们在此链接上建立了我们的代码:

Preview Form Link 我们通过以下方式对其进行了更改:

  • 只有视图名称是硬编码,其余的是通过代码(下面的代码)
  • 获取
  • 我们不使用第二个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>

LoadPreview代码

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

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);                        

                });
            }
        }