原创地址:http://www.cnblogs.com/jfzhu/archive/2012/09/29/2707943.html
转载请注明出处
在前面的两篇文章中,我分别介绍了如何自定义Ribbon按钮并向其传递参数以及Ribbon按钮与其背后JScript的工作原理。在这篇文章中,我结合前面介绍到的知识,再为大家演示一下如何在表单中传递自定义的参数。
我们还是以扩展Connect按钮为例子,这一节我们安排”To Interest Partner”这个子选项多做一些事情。如果你点击”Connect To Another”,CRM会为你打开一个Connection的创建表单,我们也为”Connect To Investment Partner”做同样的事情,也打开一个Connection的表单,但是我们要向Connection表单中传递一个自定义的参数。
也许有人会问,为什么要向表单传递自定义参数。一个简单的例子,比如你向Connection表单传递一个Connection Role的参数,这样在Connection表单的OnLoad事件中,你就可以读取这个参数,并将表单上的Connection Role直接添好,而不需要用户在手动选择。
下面我们还将修改account的Ribbon定义,至于如何修改Ribbon定义,可以参见我前边的文章如何自定义Ribbon按钮并向其传递参数或者SDK。改动后的ribbon定义如下,注意我在command的定义中,增加了两个参数 <StringParameter Value="account" />和<StringParameter Value="Investment Partner" />。它们分别表示account 连接到另一个Entity的类型是account,Connection Role是Investement Partner。
<RibbonDiffXml> <CustomActions> <CustomAction Id="mycompany.account.form.ConnectToInvestmentPartner.CustomAction" Location="Mscrm.Form.account.AddConnection.Controls._children" Sequence="42"> <CommandUIDefinition> <Button Id="mycompany.account.form.ConnectToInvestmentPartner.Button" Command="mycompany.account.form.ConnectToInvestmentPartner.Command" LabelText="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipTitle="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipDescription="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.ToolTip" /> </CommandUIDefinition> </CustomAction> <CustomAction Id="mycompany.account.grid.ConnectToInvestmentPartner.CustomAction" Location="Mscrm.HomepageGrid.account.AddConnection.Controls._children" Sequence="46"> <CommandUIDefinition> <Button Id="mycompany.account.homepagegrid.ConnectToInvestmentPartner.Button" Command="mycompany.account.grid.ConnectToInvestmentPartner.Command" LabelText="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipTitle="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipDescription="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.ToolTip" /> </CommandUIDefinition> </CustomAction> <CustomAction Id="mycompany.account.subgrid.ConnectToInvestmentPartner.CustomAction" Location="Mscrm.SubGrid.account.AddConnection.Controls._children" Sequence="21"> <CommandUIDefinition> <Button Id="mycompany.account.subgrid.ConnectToInvestmentPartner.Button" Command="mycompany.account.grid.ConnectToInvestmentPartner.Command" LabelText="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipTitle="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.LabelText" ToolTipDescription="$LocLabels:mycompany.account.form.ConnectToInvestmentPartner.ToolTip" /> </CommandUIDefinition> </CustomAction> </CustomActions> <Templates> <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates> </Templates> <CommandDefinitions> <CommandDefinition Id="mycompany.account.form.ConnectToInvestmentPartner.Command"> <EnableRules> <EnableRule Id="Mscrm.Enabled" /> </EnableRules> <DisplayRules /> <Actions> <JavaScriptFunction Library="$webresource:new_AccountLibrary.js" FunctionName="AccountLibrary.AddConnectionToInvestmentPartner"> <CrmParameter Value="FirstPrimaryItemId" /> <CrmParameter Value="PrimaryEntityTypeCode" /> <CrmParameter Value="PrimaryEntityTypeName" /> <StringParameter Value="account" /> <StringParameter Value="Investment Partner" /> </JavaScriptFunction> </Actions> </CommandDefinition> <CommandDefinition Id="mycompany.account.grid.ConnectToInvestmentPartner.Command"> <EnableRules> <EnableRule Id="Mscrm.Enabled" /> </EnableRules> <DisplayRules /> <Actions> <JavaScriptFunction Library="$webresource:new_AccountLibrary.js" FunctionName="AccountLibrary.AddConnectionToInvestmentPartner"> <CrmParameter Value="FirstSelectedItemId" /> <CrmParameter Value="SelectedEntityTypeCode" /> <CrmParameter Value="SelectedEntityTypeName" /> <StringParameter Value="account" /> <StringParameter Value="Investment Partner" /> </JavaScriptFunction> </Actions> </CommandDefinition> </CommandDefinitions> <RuleDefinitions> <TabDisplayRules /> <DisplayRules /> <EnableRules /> </RuleDefinitions> <LocLabels> <LocLabel Id="mycompany.account.form.ConnectToInvestmentPartner.LabelText"> <Titles> <Title languagecode="1033" description="To Investment Partner" /> <Title languagecode="2052" description="投资伙伴" /> </Titles> </LocLabel> <LocLabel Id="mycompany.account.form.ConnectToInvestmentPartner.ToolTip"> <Titles> <Title languagecode="1033" description="To Investment Partner" /> <Title languagecode="2052" description="投资伙伴" /> </Titles> </LocLabel> </LocLabels> </RibbonDiffXml>
下面我们修改AccountLibrary.js web resource。内容如下。
if (typeof (AccountLibrary) == "undefined") { AccountLibrary = { __namespace: true }; } AccountLibrary = { Name: "AccountLibrary", AddConnectionToInvestmentPartner: function (accountid, objecttypecode, objecttypename, connectoType, connectionRole) { try { var $v_0 = String.format("pId={0}&pType={1}&pConnectToEntity_0={2}&pConnectAsRole_0={3}", CrmEncodeDecode.CrmNameValueEncode(accountid), CrmEncodeDecode.CrmNameValueEncode(objecttypecode.toString()), CrmEncodeDecode.CrmNameValueEncode(connectoType), CrmEncodeDecode.CrmNameValueEncode(connectionRole)); openObj(Mscrm.EntityTypeCode.Connection, "", $v_0, null, Mscrm.NavigationMode.NavigationModeNewWindow, null) } catch (e) { alert(AccountLibrary.Name + " AddConnectionToInvestmentPartner Error: " + e.Message); } } }
因为我们上一节已经学习了系统自带的Connect To Another是如何打开一个Connection创建表单的,我们对其加以修改。注意我们在url中添加了两个自定义参数,pConnectToType和pConnectionRole。保存并publish你的web resource,试着点击一下Connect To Investment Partner,你会发现Connection的创建表单是打开了,但是产生了一个错误:
这个错误就是由我们的自定义参数pConnectToEntity_0和pConnectAsRole_0引起的。CRM是不允许你随便向一个表单传递自定义Querystring的。不过这是可以通过修改entity的xml定义来改变的。我下面给大家演示如何进行这个改动。详情大家也可以参考sdk - Configure a Form to Accept Custom Querystring Parameters这一章节。
在CRM中,还是使用你原来使用的那个Solution,也可以新建一个,把connection entity包含进来,并新创建一个Jscript web resource, 我们命名它为ConnectionLibrary.js。导出solution,修改customizations.xml文件,对connection entity的定义进行修改。有一点需要注意的事比较变态,就是变量命必须包含一个下划线。
再将下面的内容复制到ConnectionLibrary.js web resource中。
if (typeof (ConnectionLibrary) == "undefined") { ConnectionLibrary = { __namespace: true }; } ConnectionLibrary = { Name: "ConnectionLibrary", CONST_PARA_CONNECT_TO_ENTITY: "pConnectToEntity_0", CONST_PARA_CONNECT_AS_ROLE: "pConnectAsRole_0", IsConnectingToParam: function (params) { for (i = 0; i < params.length; i++) { var param = params[i].split("="); if (param[0] == ConnectionLibrary.CONST_PARA_CONNECT_TO_ENTITY) { return true; } } return false; }, GetRoleName: function (params) { for (i = 0; i < params.length; i++) { var param = params[i].split("="); if (param[0] == ConnectionLibrary.CONST_PARA_CONNECT_AS_ROLE) { return param[1]; } } throw "Role Name is not defined."; }, OnLoad: function () { if (Xrm.Page.ui.getFormType() == 1) { var queryString = window.location.search.substring(1); var params = queryString.split("&"); if (ConnectionLibrary.IsConnectingToParam(params)) { var rolename = CrmEncodeDecode.CrmNameValueDecode(ConnectionLibrary.GetRoleName(params)); alert(rolename); } } } }
这段代码中有一点需要注意,我们在上一篇文章中介绍了CrmEncodeDecode.CrmNameValueEncode,有encode自然也要有decode,所以这里我们使用了CrmEncodeDecode.CrmNameValueDecode。
最后,我们来看一下结果: