无法仅在实体的一个窗体上显示自定义功能区按钮

Unable to display custom ribbon button only on one form of an entity

本文关键字:窗体 一个 显示 自定义 按钮 功能区 实体      更新时间:2023-09-26

我在CRM 2013中的机会实体上创建了一个功能区按钮,并使用自定义启用规则仅在两个可用表单(admin、sales)中的一个表单上显示该按钮。

我能够在正确的表单(admin)上看到web上的按钮,但它似乎在Outlook客户端上不可见。我使用以下JavaScript来启用/禁用按钮,由于某种原因,当从Outlook调用时,JS总是返回false。

我正在使用SetTimeout,因为Outlook似乎需要时间来获取对象,如果不使用则抛出错误。

是否有更好的方法在一个表单上启用按钮而不是另一个表单?

function EnableRibbonButton()
{
    var client = Xrm.Page.context.client.getClient();
    if(client == "Web")
    {
        var form = Xrm.Page.ui.formSelector;
        if(form != null)
        {
            var formItem = form.getCurrentItem();
            if(formItem != null)
            {
                var formId = formItem.getId();
                if(formId == "ADMINFORMGUID")
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
    else if(client == "Outlook")
    {
        var form = getForms();
        var formItem = getFormItem(form);
        var formId = getFormID(formItem);
        if(formId == "ADMINFORMGUID")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
function getForms()
{
    var form = Xrm.Page.ui.formSelector;
    if(form != null)
    {
        return form;
    }
    else
    {
        window.setTimeout("getForms()", 100);
    }
}
function getFormItem(form)
{
    var formItem = form.getCurrentItem();
    if(formItem != null)
    {
        return formItem;
    }
    else
    {
        window.setTimeout("getFormItem("+form+")", 100);
    }
}
function getFormID(formItem)
{
    var formId = formItem.getId();
    if(formId != null)
    {
        return formId;
    }
    else
    {
        window.setTimeout("getFormID("+formItem+")", 100);
    }
}

setTimeout立即返回(timeoutID),并将在稍后的时间执行第一个参数,因此您需要某种回调机制来继续下一步。

此外,给setTimeout一个字符串作为第一个参数是一种"隐式eval"的形式,这通常是不可取的。

getForm带回调示例:

function getFormSelector(callback) {
    var formSelector = Xrm.Page.ui.formSelector;
    if(typeof callback === 'function') {
        if(!formSelector) {
            window.setTimeout(
                // Create closure for callback function.
                function() {
                    getFormSelector(callback);
                },
                100 // milliseconds
            );
            return;
        }
        callback(formSelector);
        return;
    }
    return formSelector;
}