gpt4 book ai didi

playframework - 创建动态html表单

转载 作者:行者123 更新时间:2023-12-01 04:01:55 25 4
gpt4 key购买 nike

尝试学习如何创建动态 html 表单。元素将在数据库中定义。创建页面后, Controller 将处理回发数据以将数据插入数据库。

我正在使用 playframework 1.2.4

将不胜感激任何指南/有用的链接

如果我知道元素是什么,我可以构建页面,并且当我从 Controller 调用 render(param object) 并访问 View 中的对象时,可以从数据库表中提取数据用于选择列表。

到目前为止我的黑客:
创建了一个包含以下列的表

rid
HTMLElementType
ElementName
HTMLElementOptions [if the element type is select]
HTMLDefaultValue [default value for select like 'select a value from below']
HTMLElementEnabled

创建了一个模型
package models;

import play.*;
import play.db.jpa.*;
import play.data.validation.*;

import javax.persistence.*;
import java.util.*;

@javax.persistence.Entity
@Table(name="mytable")
public class DynameForm extends Model{
public String HTMLElementType;
public String ElementName;
public String HTMLElementOptions;
public String HTMLDefaultValue;
public String HTMLElementEnabled;
}

在我看来,我循环检查它是否为 <select>如果是这样,请放入一个空选项。但不确定这是否是正确的方法。此外,在我看来,我还必须检查是否不是,然后我必须输入 <input type=>并构建完整的标签

此外,我将如何对某些必需的字段(例如姓氏/ssn/等)强制执行验证?我可以更改我的表以具有可以帮助我的 IsRequired 列

甚至不确定在回发时捕获数据的正确方法是什么

最佳答案

基本上问题是生成一个html表单。你似乎已经弄清楚了你的模型。你缺少的是一个 View 。我做了一次类似以下的事情,为 simpleDB 模型生成模型。

我提供了一个字段列表,根据字段生成 UI。我只有文本字段,只需要 2 个案例(可见和不可见)字段。您的用例可能需要更多复杂性,因此您可以根据需要进行调整。
dish.fields包含具有相关元数据的字段。任何特殊的事情,如需要验证或 isRequired,您都必须向 View 提供该信息,以便它可以以适当的方式呈现该字段。

对其建模的最简单方法是从 HTML 表单开始,然后开始一次将其概括为一个字段。

  #{list items:dish.fields, as:'f'}
#{field 'f'}
#{if f.display }
<div class="control-group">
<label class="control-label"> &{f.name} </label>
<div class="controls">
<input type="text" class="input-xlarge" placeholder="&{f.name}" name="${dish.getFieldId(f)}" value="${dish.getValue(f)}" ></input>
</div>
</div>
#{/if}
#{else}
<input type="hidden" class="input-xlarge" placeholder="&{f.name}" name="${dish.getFieldId(f)}" value="${dish.getValue(f)}" ></input>
#{/else}
#{/field}

#{/list}
#{else}
No fields
#{/else}

我必须定义自己的领域,但你应该能够理解。

对于不同的用例,您可能必须有一堆不同的输入类型,所以从简单开始,然后再进行概括。您也可以查看 CRUD 模块实现。

我的 DisplayAttribute类(字段的元数据)如下所示。您可以将其用作起点。
public class DisplayAttribute {
public Boolean display = Boolean.TRUE;
public String type = "";
public String name;

public DisplayAttribute(String name){
this.name = name;
this.display = Boolean.TRUE;
}

public DisplayAttribute(String name, Boolean display){
this.name = name;
this.display = display;
}
... overridden equals and hash
}

编辑
字段如何渲染?
Controller 将元数据( DisplayAttribute)传递给 View ,在这种情况下,元数据只包含字段的名称以及它是否可显示。

型号

这里模型包含要呈现的字段,但您可以轻松地从数据库中检索这些字段。我的模型是通用的,因为我意识到我一遍又一遍地为多个模型做同样的事情。

我实现了自己的接口(interface),它给了我 getFields方法。我还维护了两个映射,因此给定一个属性,我可以得到它的 DisplayAttribute,给定一个 DisplayAttribute,我可以得到它的名称。我在需要时从 View 中调用此模型的方法。
    public class GenericSimpleDBModel implements SimpleDBModel {

public static AmazonSimpleDB sdb = null;
private static final String bracketRemovalPattern = "(^.*?\\[|\\]\\s*$)";
private Map<DisplayAttribute, Set<String>> data = new TreeMap<DisplayAttribute, Set<String>>(new UuidComparator());
private Map<String, DisplayAttribute> attributeCache = new HashMap<String, DisplayAttribute>();
protected final String DOMAIN_NAME;

public GenericSimpleDBModel() {
initialize(getFields());
this.DOMAIN_NAME = "dishes";
}

protected void initialize(String[] fields) {
data = new TreeMap<DisplayAttribute, Set<String>>(new UuidComparator());
attributeCache = new HashMap<String, DisplayAttribute>();
for (String f : fields) {
// if (f.equals(getUUIDField()) || f.equals(getIntegrityField())) {
if (f.endsWith("uuid") || f.endsWith("integrity")) {
setValue(f, "", Boolean.FALSE);
} else {
setValue(f, "", Boolean.TRUE);
}
}
}
protected void initialize(Set<DisplayAttribute> fields) {
data = new TreeMap<DisplayAttribute, Set<String>>(new UuidComparator());
attributeCache = new HashMap<String, DisplayAttribute>();
for (DisplayAttribute atr : fields) {
setValue(atr.name, "");
}
}
... more methods
}

关于playframework - 创建动态html表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12983992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com