1、widget-form.xsd文件中加入以下内容:
<!-- kd-drop-down-list start by ligeng -->
<xs:element name="kd-drop-down-list" substitutionGroup="AllFields">
<xs:complexType>
<xs:attributeGroup ref="attlist.kd-drop-down-list"></xs:attributeGroup>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="attlist.kd-drop-down-list">
<xs:attribute name="sidx" type="xs:string"></xs:attribute>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="tableDir"></xs:enumeration>
<xs:enumeration value="refList"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="refenceValue" type="xs:string"></xs:attribute>
<xs:attribute name="entity" type="xs:string"></xs:attribute>
<xs:attribute name="nameField" type="xs:string"></xs:attribute>
<xs:attribute name="valueField" type="xs:string"></xs:attribute>
<xs:attribute name="sord" type="xs:string"></xs:attribute>
<xs:attribute name="delay" type="xs:integer"></xs:attribute>
<xs:attribute name="height" type="xs:integer"></xs:attribute>
<xs:attribute name="optionLabel" type="xs:string"></xs:attribute>
<xs:attribute name="value" type="xs:string"></xs:attribute>
</xs:attributeGroup>
2、ModelFormField.java中添加以下内容:
/*Kd-Drop-Down-List start*/
public static class KdDropDownListField extends FieldInfo{
protected String sidx;
protected String type;
protected String refenceValue;
protected String entity;
protected String nameField;
protected String valueField;
protected String sord;
protected String delay;
protected String height;
protected String optionLabel;
protected String value;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getRefenceValue() {
return refenceValue;
}
public void setRefenceValue(String refenceValue) {
this.refenceValue = refenceValue;
}
public String getSidx() {
return sidx;
}
public void setSidx(String sidx) {
this.sidx = sidx;
}
public String getEntity() {
return entity;
}
public void setEntity(String entity) {
this.entity = entity;
}
public String getNameField() {
return nameField;
}
public void setNameField(String nameField) {
this.nameField = nameField;
}
public String getValueField() {
return valueField;
}
public void setValueField(String valueField) {
this.valueField = valueField;
}
public String getSord() {
return sord;
}
public void setSord(String sord) {
this.sord = sord;
}
public String getDelay() {
return delay;
}
public void setDelay(String delay) {
this.delay = delay;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getOptionLabel() {
return optionLabel;
}
public void setOptionLabel(String optionLabel) {
this.optionLabel = optionLabel;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
protected KdDropDownListField() {
super();
}
public KdDropDownListField(ModelFormField modelFormField) {
super(FieldInfo.SOURCE_EXPLICIT, FieldInfo.KD_DROP_DOWN_LIST, modelFormField);
}
public KdDropDownListField(int fieldSource, ModelFormField modelFormField) {
super(fieldSource, FieldInfo.KD_DROP_DOWN_LIST, modelFormField);
}
public KdDropDownListField(Element element, ModelFormField modelFormField) {
super(element, modelFormField);
this.type = element.getAttribute("type");
this.refenceValue = element.getAttribute("refenceValue");
this.sidx = element.getAttribute("sidx");
this.entity = element.getAttribute("entity");
this.nameField = element.getAttribute("nameField");
this.valueField = element.getAttribute("valueField");
this.sord = element.getAttribute("sord");
this.delay = element.getAttribute("delay");
this.height = element.getAttribute("height");
this.optionLabel = element.getAttribute("optionLabel");
this.value = element.getAttribute("value");
}
@Override
public void renderFieldString(Appendable writer, Map<String, Object> context,FormStringRenderer formStringRenderer) throws IOException {
formStringRenderer.renderKdDropDownListField(writer, context, this);
}
}
3、ModelFormField.java类的抽象子类FieldInfo中添加静态常量:
public static final int KD_DROP_DOWN_LIST = 26;
并且在FieldInfo的静态属性fieldTypeByName中添加
fieldTypeByName.put("kd-drop-down-list", Integer.valueOf(26));
</pre><p><pre name="code" class="java">else if ("file".equals(subElementName)) this.fieldInfo = new FileField(subElement, this);
else if ("password".equals(subElementName)) this.fieldInfo = new PasswordField(subElement, this);
else if ("image".equals(subElementName)) this.fieldInfo = new ImageField(subElement, this);
else if ("container".equals(subElementName)) this.fieldInfo = new ContainerField(subElement, this);
else if ("on-field-event-update-area".equals(subElementName)) addOnEventUpdateArea(new UpdateArea(subElement));
else if ("kd-date-picker".equals(subElementName)) {
this.fieldInfo = new KdDatePickerField(subElement,this);
}
else if ("kd-datetime-picker".equals(subElementName)) {
this.fieldInfo = new KdDateTimePickerField(subElement,this);
}
else if ("kd-time-picker".equals(subElementName)) {
this.fieldInfo = new KdTimePickerField(subElement,this);
}
else if ("kd-auto-complete".equals(subElementName)) {
this.fieldInfo = new KdAutoCompleteField(subElement,this);
}
else if ("kd-drop-down-list".equals(subElementName)) {
this.fieldInfo = new KdDropDownListField(subElement,this);
}
4、FormStringRenderer.java接口中添加抽象方法:
/** KdDropDownListField*/
public void renderKdDropDownListField(Appendable writer, Map<String, Object> context, ModelFormField.KdDropDownListField kdDropDownListField) throws IOException;
5、MacroFormRenderer.java(实现FormStringRenderer接口)中添加以下内容
/**renderKdDropDownListField */
public void renderKdDropDownListField(Appendable writer, Map<String, Object> context,KdDropDownListField kdDropDownListField)throws IOException {
ModelFormField modelFormField = kdDropDownListField.getModelFormField();
String id = modelFormField.getCurrentContainerId(context);
String name = modelFormField.getName();
String sidx = kdDropDownListField.getSidx();
String entity = kdDropDownListField.getEntity();
String type = kdDropDownListField.getType();
String refenceValue = kdDropDownListField.getRefenceValue();
String nameField = kdDropDownListField.getNameField();
String valueField = kdDropDownListField.getValueField();
String sord = kdDropDownListField.getSord();
String delay = kdDropDownListField.getDelay();
String height = kdDropDownListField.getHeight();
String optionLabel = kdDropDownListField.getOptionLabel();
String value = kdDropDownListField.getValue();
StringWriter sr = new StringWriter();
sr.append("<@kdDropDownList ");
sr.append("id = \"");
sr.append(id);
sr.append("\" name = \"");
sr.append(name);
sr.append("\" entity = \"");
sr.append(entity);
sr.append("\" type =\"");
sr.append(type);
sr.append("\" refenceValue =\"");
sr.append(refenceValue);
sr.append("\" nameField=\"");
sr.append(nameField);
sr.append("\" valueField=\"");
sr.append(valueField);
sr.append("\" delay = \"");
sr.append(delay);
sr.append("\" height = \"");
sr.append(height);
sr.append("\" optionLabel = \"");
sr.append(optionLabel);
sr.append("\" value =\"");
sr.append(value);
sr.append("\" />");
executeMacro(writer, sr.toString());
}
6、htmlFormMacroLibrary.ftl文件中添加以下内容:
<!-- kdDropDownList start by ligeng -->
<#macro kdDropDownList id name entity type refenceValue nameField valueField delay height optionLabel value>
<input id="${id}" name="${name}" />
<script>
var data_${id};
<#if "${type}"=="tableDir">
data_${id} = findTableDirOptions('${entity}','${nameField}','${valueField}');
<#else>
data_${id} = findrefListOptions('${refenceValue}');
</#if>
$("#${id}").kendoDropDownList({
dataTextField: "text",
dataValueField: "value",
dataSource: data_${id},
<#if delay?has_content>delay:"${delay}",</#if>
<#if height?has_content>height:"${height}",</#if>
<#if optionLabel?has_content>
optionLabel:{
text:"${optionLabel}",
value:" "
}
</#if>
<#if value?has_content>value:"${value}",</#if>
});
</script>
</#macro>
<!-- kdDropDownList end by ligeng -->
7、添加数据源
7-1、在tool.js文件中添加两个函数
function findTableDirOptions(entityName,nameField,valueField){
var data;
$.ajax({url:'findTableDirOptions?entityName='+entityName+'&nameField='+nameField+'&valueField='+valueField,async:false, success:function(e){
if (e != null) {
data = e;
}
}});
return $.parseJSON(data);
};
function findRefListEvent(referenceValue){
var data;
$.ajax({url:'findRefListEvent?referenceValue='+referenceValue,async:false, success:function(e){
if (e != null) {
data = e;
}
}});
return $.parseJSON(data);
};
7-2、在common-controller.xml文件中添加一个request
<request-map uri="findTableDirOptions">
<security https="true" auth="true"/>
<event type="java" path="org.ofbiz.common.CommonEvents" invoke="findTableDirEvent"/>
<response name="success" type="none" />
</request-map>
7-3、在CommonEvents文件中添加以下内容:
public static String findTableDirEvent(HttpServletRequest request, HttpServletResponse response){
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
Map<String, Object> result = FastMap.newInstance();
Map<String, Object> context = FastMap.newInstance();
try {
GenericValue userLogin = (GenericValue) context.get("userLogin");
context.put("userLogin", userLogin);
context.put("inputFields", request.getParameter("inputFields"));
context.put("entityName", request.getParameter("entityName"));
context.put("sidx", request.getParameter("sidx"));
context.put("sord", request.getParameter("sord"));
context.put("nameField", request.getParameter("nameField"));
context.put("valueField", request.getParameter("valueField"));
try {
result = dispatcher.runSync("performFindTableDirOptions",context);
} catch (GenericServiceException e) {
e.printStackTrace();
}
String editoptions = (String)result.get("editoptions");
//System.out.println(editoptions);
response.getWriter().write(editoptions);
} catch (IOException e) {
e.printStackTrace();
}
return ModelService.RESPOND_SUCCESS;
}
public static String findRefListEvent(HttpServletRequest request, HttpServletResponse response){
LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
Delegator delegator = (Delegator) request.getAttribute("delegator");
Map<String, Object> result = FastMap.newInstance();
try {
String referenceValue = request.getParameter("referenceValue");
StringBuffer editoptions = new StringBuffer();
try {
DynamicViewEntity dynamicView = new DynamicViewEntity();
dynamicView.addMemberEntity("RF", "MdReference");
dynamicView.addAlias("RF", "mdRefrenceId");
dynamicView.addAlias("RF", "referenceValue");
EntityCondition entityCondition = EntityCondition.makeCondition(EntityFunction.UPPER_FIELD("referenceValue"), EntityOperator.EQUALS, referenceValue) ;
dynamicView.addMemberEntity("REL", "MdReflist");
dynamicView.addAlias("REL", "reflistValue");
dynamicView.addAlias("REL", "reflistName");
List<String> fieldsToSelect = FastList.newInstance();
fieldsToSelect.add("reflistValue");
fieldsToSelect.add("reflistName");
dynamicView.addViewLink("RF", "REL", Boolean.FALSE, ModelKeyMap.makeKeyMapList("mdReferenceId", "mdReferenceId"));
EntityFindOptions findOpts = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, -1, 1000, true);
List<String> orderBy = FastList.newInstance();
TransactionUtil .begin();
EntityListIterator pli = delegator.findListIteratorByCondition(dynamicView, entityCondition, null, fieldsToSelect, orderBy, findOpts);
TransactionUtil .commit();
editoptions.append("[");
int i =0;
GenericValue entity;
while(( entity = pli.next()) != null ){
if(i==0){
editoptions.append("{\"value\":\"");
editoptions.append("");
editoptions.append("\"");
editoptions.append(",");
editoptions.append("\"text\":\"");
editoptions.append(" ");
editoptions.append("\"}");
editoptions.append(",");
}else{
editoptions.append(",");
}
editoptions.append("{\"value\":\"");
editoptions.append(entity.get("reflistValue"));
editoptions.append("\"");
editoptions.append(",");
editoptions.append("\"text\":\"");
editoptions.append(entity.get("reflistName"));
editoptions.append("\"}");
i++;
}
editoptions.append("]");
response.getWriter().write(editoptions.toString());
} catch (GenericEntityException e) {
Debug.logError(e, "Cannot mdRefrence Object", module);
e.printStackTrace();
try {
TransactionUtil .rollback();
} catch (GenericTransactionException e1) {
e1.printStackTrace();
}
}
// try {
// result = dispatcher.runSync("performFindTableDirOptions",context);
// } catch (GenericServiceException e) {
// e.printStackTrace();
// }
// String editoptions = (String)result.get("editoptions");
} catch (IOException e) {
e.printStackTrace();
}
return ModelService.RESPOND_SUCCESS;
}
7-4、(附:数据表)
<entity entity-name="MdReference" package-name="org.ofbiz.demo.projectmgr">
<field name="mdReferenceId" type="id"></field>
<field name="referenceName" type="id"></field>
<field name="referenceValue" type="id"></field>
<field name="description" type="id-vlong"></field>
<prim-key field="mdReferenceId"/>
</entity>
<entity entity-name="MdReflist" package-name="org.ofbiz.md.projectmgr">
<field name="mdReflistId" type="id"></field>
<field name="mdReferenceId" type="id"></field>
<field name="reflistValue" type="id-vlong"></field>
<field name="reflistName" type="id"></field>
<prim-key field="mdReflistId"/>
<relation rel-entity-name="MdReference" type="one" title="FK_Reference_1">
<key-map field-name="mdReferenceId" rel-field-name="mdReferenceId"/>
</relation>
</entity>