U9客开插件
注意事项:
开发UI插件时确保不要开启热插件,即..\Portal\bin\environment.xml中属性uipluging必须设置为false(设置为true页面开发的dll拷贝不需要重启IIS)
如何客开UI插件:
PluginTool工具做UI插件时很多页面找不到webpart,特别是弹窗找不到webpart,做插件最后的方式是用如下方法做插件,不用这个工具,因为这个工具能做的东西非常有限
1、先找webpart:
先打开U9要做UI插件的页面,找到页面的uri或者formid,如下图所示:

可以从如下界面找到URI(单点登录时也要获取这个URI)

如果是弹窗页面,需要找FormID,如下图:

找到URI或者FormID后,就可以在classview(数据字典)中找到webpart,如下图:

写配置文件
UI插件的.config配置文件必须以WebPartExtend_命名(建议从如下解决方案中用解决方案中的那个配置文件),节点一般是:
<!–销售订单–>
<ExtendedPart parentPartFullName=”UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart” extendedPartFullName=”UFIDA.U9.Cust.U9Demo.PlugUI.SO”
extendedPartAssemblyName=”UFIDA.U9.Cust.U9Demo.PlugUI.dll” />
其中parentPartFullName是上一步我们找出的webpart,名字必须要完全对,extendedPartFullName是自己VS客开的这个类库的命名空间+自己的这个类名,如图:

extendedPartAssemblyName为自己VS客开的这个解决方案的程序集名称,如图:

按钮操作
1、业务场景(增加按钮)
UI插件开发最常用的场景之一,对标准产品页面需要增加按钮来实现不同业务需要,先对U9标准页面增加按钮的三种方法分别举例说明
(UI插件增加的按钮无法设置权限:一般情况下可以变通方案处理,处理思路:参数设置里面加个参数,录入用户编码或者角色编码(逗号隔开),代码里面取这个值判断UI插件增加的按钮可用或不可用)
案例1:Toolbar上增加按钮(页面最顶层区域)
#region 1.Toobar上添加按钮:页面扩展-加按钮
// (1)、实例化按钮
IUFButton btnPRToPM = new UFWebButtonAdapter();
//(2)、加入功能栏Card中
IUFToolbar toolbar = (IUFToolDescFlexFieldbar)part.GetUFControlByName(part.TopLevelContainer, “Toolbar1”);//可以使用F12在页面上找,一般情况下名字就叫Toolbar1
if (toolbar != null)
{
string guid = “047FC9F5-46C0-449A-83C2-2822BCF24012”;// 在数据库生成下GUID,或者修改下这里的值。SELECT NEWID()
btnPRToPM = UIControlBuilder.BuilderToolbarButton(toolbar, “True”, “btnPRToPM”, “True”, “True”, 70, 28, “7”, “”, true, false,guid, guid, guid);
UIControlBuilder.SetButtonAccessKey(btnPRToPM);
btnPRToPM.Text = “拉单销售订单”;
btnPRToPM.ID = “btnPRToPM”;
btnPRToPM.AutoPostBack = true;
btnPRToPM.UIModel = part.Model.ElementID;
((UFWebToolbarAdapter)toolbar).Items.Add(btnPRToPM as System.Web.UI.WebControls.WebControl);
btnPRToPM.Click += new EventHandler(btnPRToPM_Click);//自己的点击事件
}
案例2:页面最下方按钮区域增加按钮(页面最底层区域)
//2.Card里面增加按钮
//设置按钮在容器中的位置
#region 2.Card里面增加按钮
IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, “Card0”);//一般情况下名称为Card0,具体请使用F12查看
IUFButton btnPRToPM2 = new UFWebButtonAdapter();
btnPRToPM2.Text = “拉单销售订单”;
btnPRToPM2.ID = “btnPRToPM2”;
btnPRToPM2.AutoPostBack = true;
card.Controls.Add(btnPRToPM2);
btnPRToPM2.Click += newEventHandler(BtnPRToPM2_Click);
CommonFunction.Layout(card, btnPRToPM2, 16, 0); //一般为从左往右按钮个数乘以2
CommonFunction类代码如下:
案例3:页面最下方下拉按钮中增加按钮
//3、Card的DropDownButton里面添加按钮
#region Card的DropDownButton里面添加按钮
IUFMenu btnPRToPM1 = newUFWebMenuAdapter();
btnPRToPM1.Text = “拉单销售订单”;
btnPRToPM1.ID = “BtnQurySaleOrder2”;
btnPRToPM1.AutoPostBack = true;
IUFDropDownButton menuButtion = (IUFDropDownButton)CommonFunction.FindControl(part, “Card0”, “DDBtnOperation”);//Card0为操作按钮区域名称,可在浏览器开发工具或F12看到,DDBtnOperation为下拉按钮的名称,使用F12一样可以看到
if (menuButtion != null)
{
//btnPRToPM1.ItemClick += BtnPRToPM1_ItemClick;//注意这里注册的是//ItemClick事件
menuButtion.MenuItems.Add(btnPRToPM1);
}
2、业务场景:点击页面上按钮后写判断逻辑:
点击按钮后执行产品按钮事件前和执行产品按钮事件后都可以做插件,可分别使用BeforeEventProcess和AfterEventProcess事件,可重写这两个事件。
业务场景:用户点击提交后弹窗给用户提示是否提交或取消。
方案:
U9内部没有方法可实现弹窗点击确定后执行一个操作,点击取消后执行另一个操作,
需要UBF开发一个自定义视图页面做弹窗(两个按钮,一个字段作为提示即可),以下是代码示例
public override void BeforeEventProcess(UFSoft.UBF.UI.IView.IPart Part, string eventName, object sender, EventArgs args, out bool executeDefault)
{
UFSoft.UBF.UI.WebControlAdapter.UFWebButton4ToolbarAdapter webButton = sender as UFSoft.UBF.UI.WebControlAdapter.UFWebButton4ToolbarAdapter;//按钮不同区域这个类型可能不一样,调试状态下可以看出sender参数的对象类型
//审核按钮
if (webButton != null && (webButton.Action == “SubmitClick” || webButton.Action == “AppvoveClick”))
{
if (“需要弹窗”)
{
part.ShowAtlasModalDialog(btnPRToPM2, “e37cea28-9138-43a4-bbe7-e747977e3db5”, “已转成功请购单”, “992”, “504”,””, null, true, false, false);//btnPRToPM2按钮是自己增加的自定义按钮,用于回调(弹窗关闭后执行的代码实现)
//BtnCreatPR1为自定义按钮,默认隐藏,弹窗回调使用
//弹窗后需要将指令(点击了确定还是取消)写入到part.CurrentState[“XXX”]中
executeDefault = false;//这里不执行审核后事件动作了
return;
}
}
base.BeforeEventProcess(Part, eventName, sender, args, out executeDefault);
}
void BtnPRToPM2_Click(object sender, EventArgs e)
{
this.part.Model.ClearErrorMessage();
if(“点击了确定继续执行”) //part.CurrentState[“XXX”]中获取标识
_part.BtnApprove_Click(sender, e);
else
return;
}
private UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart part;
IUFDataGrid DataGrid4;
IUFButton btnPRToPM2;
public override void AfterInit(UFSoft.UBF.UI.IView.IPart Part, EventArgs args)
{
//首先调用原来的事件
base.AfterInit(Part, args);
part = Part as UFIDA.U9.SCM.SM.SOUIModel.StandardSOMainUIFormWebPart;
if (part == null)
return;
DataGrid4 = (IUFDataGrid)part.GetUFControlByName(part.TopLevelContainer, “DataGrid4”);
//2.Card里面增加按钮
//设置按钮在容器中的位置
#region 2.Card里面增加按钮
IUFCard card = (IUFCard)part.GetUFControlByName(part.TopLevelContainer, “Card0”);
btnPRToPM2 = new UFWebButtonAdapter();
btnPRToPM2.Text = “拉单销售订单”;
btnPRToPM2.ID = “BtnQurySaleOrder1”;
btnPRToPM2.AutoPostBack = true;
card.Controls.Add(btnPRToPM2);
btnPRToPM2.Click += new EventHandler(BtnPRToPM2_Click);
CommonFunction.Layout(card, btnPRToPM2, 16, 0); //一般为从左往右按钮个数乘以2
}
3、 业务场景:标准查询列表客开如何干预查询结果
public override void AfterLoad(UFSoft.UBF.UI.IView.IPart part, EventArgs args)
{
this.Do_AfterLoad(part, args);;
}
private void Do_AfterLoad(UFSoft.UBF.UI.IView.IPart part, EventArgs args)
{
#region 获取相关强类型数据
_strongPart = part as ItemBListUIModel.ItemBListUIFormWebPart;
if (_strongPart == null)
return;
IUFDataGrid UIGrid = _strongPart.GetUFControlByName(_strongPart.TopLevelContainer, “DataGrid1”) as IUFDataGrid;
//设置分页方式为View分页
((UFWebDataGridAdapter)UIGrid).PagingStrategy = GridPagingStrategy.View;
string oPath = _strongPart.Model.ItemMaster.CurrentFilter.OPath;
UIGrid.UIView.CurrentFilter.OPath = oPath + ” and MainItemCategory=1002212223638106″;
UIGrid.UIView.CurrentFilter.OrderBy = QryService.GetOrderByOpath((BaseWebForm)(_strongPart));
UIGrid.UIView.Clear();
_strongPart.Action.CommonAction.Load(_strongPart.Model.ItemMaster);//根据条件加载所有数据
夜雨聆风
