📄 modelform.java
字号:
// does not exist, add to List and Map
this.fieldList.add(modelFormField);
this.fieldMap.put(modelFormField.getName(), modelFormField);
return modelFormField;
}
}
}
public void addAltTarget(AltTarget altTarget) {
altTargets.add(altTarget);
}
public void addAutoFieldsFromService(AutoFieldsService autoFieldsService, LocalDispatcher dispatcher) {
autoFieldsServices.add(autoFieldsService);
// read service def and auto-create fields
ModelService modelService = null;
try {
modelService = dispatcher.getDispatchContext().getModelService(autoFieldsService.serviceName);
} catch (GenericServiceException e) {
String errmsg = "Error finding Service with name " + autoFieldsService.serviceName + " for auto-fields-service in a form widget";
Debug.logError(e, errmsg, module);
throw new IllegalArgumentException(errmsg);
}
List modelParams = modelService.getInModelParamList();
Iterator modelParamIter = modelParams.iterator();
while (modelParamIter.hasNext()) {
ModelParam modelParam = (ModelParam) modelParamIter.next();
// skip auto params that the service engine populates...
if ("userLogin".equals(modelParam.name) || "locale".equals(modelParam.name)) {
continue;
}
if (modelParam.formDisplay) {
if (UtilValidate.isNotEmpty(modelParam.entityName) && UtilValidate.isNotEmpty(modelParam.fieldName)) {
ModelEntity modelEntity = delegator.getModelEntity(modelParam.entityName);
if (modelEntity != null) {
ModelField modelField = modelEntity.getField(modelParam.fieldName);
if (modelField != null) {
// okay, populate using the entity field info...
ModelFormField modelFormField = this.addFieldFromEntityField(modelEntity, modelField, autoFieldsService.defaultFieldType);
if (UtilValidate.isNotEmpty(autoFieldsService.mapName)) {
modelFormField.setMapName(autoFieldsService.mapName);
}
// continue to skip creating based on service param
continue;
}
}
}
ModelFormField modelFormField = this.addFieldFromServiceParam(modelService, modelParam, autoFieldsService.defaultFieldType);
if (UtilValidate.isNotEmpty(autoFieldsService.mapName)) {
modelFormField.setMapName(autoFieldsService.mapName);
}
}
}
}
public ModelFormField addFieldFromServiceParam(ModelService modelService, ModelParam modelParam, String defaultFieldType) {
// create field def from service param def
ModelFormField newFormField = new ModelFormField(this);
newFormField.setName(modelParam.name);
newFormField.setServiceName(modelService.name);
newFormField.setAttributeName(modelParam.name);
newFormField.setTitle(modelParam.formLabel);
newFormField.induceFieldInfoFromServiceParam(modelService, modelParam, defaultFieldType);
return this.addUpdateField(newFormField);
}
public void addAutoFieldsFromEntity(AutoFieldsEntity autoFieldsEntity, GenericDelegator delegator) {
autoFieldsEntities.add(autoFieldsEntity);
// read entity def and auto-create fields
ModelEntity modelEntity = delegator.getModelEntity(autoFieldsEntity.entityName);
if (modelEntity == null) {
throw new IllegalArgumentException("Error finding Entity with name " + autoFieldsEntity.entityName + " for auto-fields-entity in a form widget");
}
Iterator modelFieldIter = modelEntity.getFieldsIterator();
while (modelFieldIter.hasNext()) {
ModelField modelField = (ModelField) modelFieldIter.next();
if (modelField.getIsAutoCreatedInternal()) {
// don't ever auto-add these, should only be added if explicitly referenced
continue;
}
ModelFormField modelFormField = this.addFieldFromEntityField(modelEntity, modelField, autoFieldsEntity.defaultFieldType);
if (UtilValidate.isNotEmpty(autoFieldsEntity.mapName)) {
modelFormField.setMapName(autoFieldsEntity.mapName);
}
}
}
public ModelFormField addFieldFromEntityField(ModelEntity modelEntity, ModelField modelField, String defaultFieldType) {
// create field def from entity field def
ModelFormField newFormField = new ModelFormField(this);
newFormField.setName(modelField.getName());
newFormField.setEntityName(modelEntity.getEntityName());
newFormField.setFieldName(modelField.getName());
newFormField.induceFieldInfoFromEntityField(modelEntity, modelField, defaultFieldType);
return this.addUpdateField(newFormField);
}
/**
* Renders this form to a String, i.e. in a text format, as defined with the
* FormStringRenderer implementation.
*
* @param buffer The StringBuffer that the form text will be written to
* @param context Map containing the form context; the following are
* reserved words in this context: parameters (Map), isError (Boolean),
* itemIndex (Integer, for lists only, otherwise null), bshInterpreter,
* formName (String, optional alternate name for form, defaults to the
* value of the name attribute)
* @param formStringRenderer An implementation of the FormStringRenderer
* interface that is responsible for the actual text generation for
* different form elements; implementing you own makes it possible to
* use the same form definitions for many types of form UIs
*/
public void renderFormString(StringBuffer buffer, Map context, FormStringRenderer formStringRenderer) {
// if this is a list form, don't useRequestParameters
if ("list".equals(this.type) || "multi".equals(this.type)) {
context.put("useRequestParameters", Boolean.FALSE);
}
// find the highest position number to get the max positions used
int positions = 1;
Iterator fieldIter = this.fieldList.iterator();
while (fieldIter.hasNext()) {
ModelFormField modelFormField = (ModelFormField) fieldIter.next();
int curPos = modelFormField.getPosition();
if (curPos > positions) {
positions = curPos;
}
}
if ("single".equals(this.type)) {
this.renderSingleFormString(buffer, context, formStringRenderer, positions);
} else if ("list".equals(this.type)) {
this.renderListFormString(buffer, context, formStringRenderer, positions);
} else if ("multi".equals(this.type)) {
this.renderMultiFormString(buffer, context, formStringRenderer, positions);
} else if ("upload".equals(this.type)) {
this.renderSingleFormString(buffer, context, formStringRenderer, positions);
} else {
throw new IllegalArgumentException("The type " + this.getType() + " is not supported for form with name " + this.getName());
}
}
public void renderSingleFormString(StringBuffer buffer, Map context, FormStringRenderer formStringRenderer, int positions) {
Iterator fieldIter = null;
Set alreadyRendered = new TreeSet();
// render form open
formStringRenderer.renderFormOpen(buffer, context, this);
// render all hidden & ignored fields
this.renderHiddenIgnoredFields(buffer, context, formStringRenderer, alreadyRendered);
// render formatting wrapper open
formStringRenderer.renderFormatSingleWrapperOpen(buffer, context, this);
// render each field row, except hidden & ignored rows
fieldIter = this.fieldList.iterator();
ModelFormField lastFormField = null;
ModelFormField currentFormField = null;
ModelFormField nextFormField = null;
if (fieldIter.hasNext()) {
currentFormField = (ModelFormField) fieldIter.next();
}
if (fieldIter.hasNext()) {
nextFormField = (ModelFormField) fieldIter.next();
}
boolean isFirstPass = true;
while (currentFormField != null) {
// do the check/get next stuff at the beginning so we can still use the continue stuff easily
// don't do it on the first pass though...
if (isFirstPass) {
isFirstPass = false;
} else {
if (fieldIter.hasNext()) {
// at least two loops left
lastFormField = currentFormField;
currentFormField = nextFormField;
nextFormField = (ModelFormField) fieldIter.next();
} else if (nextFormField != null) {
// okay, just one loop left
lastFormField = currentFormField;
currentFormField = nextFormField;
nextFormField = null;
} else {
// at the end...
lastFormField = currentFormField;
currentFormField = null;
// nextFormField is already null
break;
}
}
ModelFormField.FieldInfo fieldInfo = currentFormField.getFieldInfo();
if (fieldInfo.getFieldType() == ModelFormField.FieldInfo.HIDDEN || fieldInfo.getFieldType() == ModelFormField.FieldInfo.IGNORED) {
continue;
}
if (alreadyRendered.contains(currentFormField.getName())) {
continue;
}
//Debug.logInfo("In single form evaluating use-when for field " + currentFormField.getName() + ": " + currentFormField.getUseWhen(), module);
if (!currentFormField.shouldUse(context)) {
continue;
}
alreadyRendered.add(currentFormField.getName());
boolean stayingOnRow = false;
if (lastFormField != null) {
if (lastFormField.getPosition() >= currentFormField.getPosition()) {
// moving to next row
stayingOnRow = false;
} else {
// staying on same row
stayingOnRow = true;
}
}
int positionSpan = 1;
Integer nextPositionInRow = null;
if (nextFormField != null) {
if (nextFormField.getPosition() > currentFormField.getPosition()) {
positionSpan = nextFormField.getPosition() - currentFormField.getPosition() - 1;
nextPositionInRow = new Integer(nextFormField.getPosition());
} else {
positionSpan = positions - currentFormField.getPosition();
if (!stayingOnRow && nextFormField.getPosition() > 1) {
// TODO: here is a weird case where it is setup such
//that the first position(s) in the row are skipped
// not sure what to do about this right now...
}
}
}
if (stayingOnRow) {
// no spacer cell, might add later though...
//formStringRenderer.renderFormatFieldRowSpacerCell(buffer, context, currentFormField);
} else {
if (lastFormField != null) {
// render row formatting close
formStringRenderer.renderFormatFieldRowClose(buffer, context, this);
}
// render row formatting open
formStringRenderer.renderFormatFieldRowOpen(buffer, context, this);
}
// render title formatting open
formStringRenderer.renderFormatFieldRowTitleCellOpen(buffer, context, currentFormField);
// render title (unless this is a submit or a reset field)
if (fieldInfo.getFieldType() != ModelFormField.FieldInfo.SUBMIT && fieldInfo.getFieldType() != ModelFormField.FieldInfo.RESET) {
formStringRenderer.renderFieldTitle(buffer, context, currentFormField);
} else {
formStringRenderer.renderFormatEmptySpace(buffer, context, this);
}
// render title formatting close
formStringRenderer.renderFormatFieldRowTitleCellClose(buffer, context, currentFormField);
// render separator
formStringRenderer.renderFormatFieldRowSpacerCell(buffer, context, currentFormField);
// render widget formatting open
formStringRenderer.renderFormatFieldRowWidgetCellOpen(buffer, context, currentFormField, positions, positionSpan, nextPositionInRow);
// render widget
currentFormField.renderFieldString(buffer, context, formStringRenderer);
// render widget formatting close
formStringRenderer.renderFormatFieldRowWidgetCellClose(buffer, context, currentFormField, positions, positionSpan, nextPositionInRow);
}
// always render row formatting close after the end
formStringRenderer.renderFormatFieldRowClose(buffer, context, this);
// render formatting wrapper close
formStringRenderer.renderFormatSingleWrapperClose(buffer, context, this);
// render form close
formStringRenderer.renderFormClose(buffer, context, this);
}
public void renderListFormString(StringBuffer buffer, Map context, FormStringRenderer formStringRenderer, int positions) {
// render list/tabular type forms
// render formatting wrapper open
formStringRenderer.renderFormatListWrapperOpen(buffer, context, this);
// ===== render header row =====
this.renderHeaderRow(buffer, context, formStringRenderer);
// ===== render the item rows =====
this.renderItemRows(buffer, context, formStringRenderer, true);
// render formatting wrapper close
formStringRenderer.renderFormatListWrapperClose(buffer, context, this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -