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