提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
OFbiz中使用groovy在数据库中创建条目。之所以选择Groovy,是因为ofbiz自带的minilang应用面太窄,只能应用在ofbiz中,而java每次修改都要重新重启项目编译。groovy修改不用重启项目,而且引用面较广。
一、创建屏幕
创建一个Screen,包含提交的form表单
<screen name="CreateSecManageMessage">
<section>
<actions>
<set field="headerItem" value="填写安全信息"/><!-- this highlights the selected menu-item with name "main" -->
</actions>
<widgets>
<decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
<decorator-section name="body">
<screenlet title="添加信息">
<include-form name="createSecManaMess" location="component://securitymanage/widget/SecurityManageForms.xml"/>
</screenlet>
</decorator-section>
</decorator-screen>
</widgets>
</section>
</screen>
二、创建Form
在相应文件内创建form
<form name="createSecManaMess" type="single" target="addSecManaMess">
<!-- 创建添加项 -->
<!-- <auto-fields-service service-name="createSecurityManageTest"/> -->
<field name="typeId" title="${uiLabelMap.SecManaMessTypeId}"><text/></field>
<field name="typeId" title="类型编号"><text/></field>
<field name="typeName" title="类别参数名称"><text/></field>
<field name="data" title="参数数据"><text/></field>
<field name="UpdateDate" title="更新时间"><text/></field>
<field name="CreateUser" title="创建人"><text/></field>
<field name="CreateDate" title="创建时间"><text/></field>
<field name="AuditUser" title="审核人"><text/></field>
<field name="AuditStatus" title="审核状态"><text/></field>
<field name="InvalidStatus" title="失效状态"><text/></field>
<field name="InvalidUser" title="失效人"><text/></field>
<field name="InvalidTime" title="失效时间"><text/></field>
<field name="Note" title="备注"><text/></field>
<field name="submitButton" title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field>
</form>
如果想在数据库创建条目,最好所有条目都列举出来,如果不想用户看到,或者采取默认值,可以使用下面方式:
<!--hiden表示隐藏,用户看不到,value赋予数据项默认值 -->
<field name="create_user" title="${uiLabelMap.create_user}"><hidden value = "admin"/></field>
注释掉的<auto-fields-service service-name="createSecurityManageTest"/>
表示不用我们一个一个写下面的数据项,自动生成,并调用服务createSecurityManageTest。
Form的类型有single,list,muti等。
target表示提交表单后跳转的目的地,根据controller.xml文件查询。
所以在controller.xml文件中设定
<request-map uri="addSecManaMess">
<security https="true" auth="true"/>
<event type="service" invoke="createSecurityManageTest"/>
<response name="success" type="view" value="findSecManageMessage"/>
</request-map>
addSecManaMess请求经服务器处理,需要调用createSecurityManageTest服务(创建数据库条目的主角)。
三、配置服务
该服务在servicedef文件夹下的services.xml中先定义。
<service name="createSecurityManageTest" default-entity-name="TblSecManageData" engine="groovy" location="component://securitymanage/script/org/ofbiz/securitymanage/SecurityManage.groovy" invoke="createSecurityManageTest" auth="true">
<description>创建一个添加数据的测试服务</description>
<auto-attributes include="pk" mode="IN" optional="true"/>
<auto-attributes include="nonpk" mode="IN" optional="true"/>
</service>
default-entity-name:表示使用的数据库表。
location和 invoke:表示groovy文件在哪,以及groovy文件中哪个函数。
auth:表示是否要求用户登陆才能操作。
关于auto-attributes
说明:
因为创建表单是自动填充条目,pk表示主键,nonpk非主键,
mode:表示是输入还是输出,IN表示参数只输入,OUT表示参数只输出,INOUT表示参数即作为参数传到服务中,又作为返回值返回。
其实pk一般不作为输入参数,因为主键一般在服务中创建,不用传参。
optional表示选项是否可选,true表示可选,false表示不可选,也就是必须填。
举一反三:
服务中传入传出参数,怎么使用?如下
<attribute name="userLoginId" type="String" mode="IN" optional="true"/>
<attribute name="userLoginName" type="String" mode="OUT" optional="true"/>
创建数据记录的groovy文件
import org.ofbiz.entity.GenericEntityException;
def createSecurityManageTest() {
result = [:];
try{
ofbizDemo = delegator.makeValue("TblSecManageData");
// Auto generating next sequence of ofbizDemoId primary key
ofbizDemo.setNextSeqId();
// Setting up all non primary key field values from context map
ofbizDemo.setNonPKFields(context);
// Creating record in database for OfbizDemo entity for prepared value
ofbizDemo = delegator.create(ofbizDemo);
//result.secManageSeqId = ofbizDemo.secManageSeqId;
} catch(GenericEntityException e) {
}
return result;
}
groovy文件中有一句注释result.secManageSeqId = ofbizDemo.secManageSeqId;
它的作用是返回值,它什么时候需要写呢?当在services.xml文件中含有<auto-attributes include="pk" mode="OUT" optional="false"/>
时,表示主键需要作为返回值返回,并且必须返回,因为optional为true。