playframework - 创建动态html表单

标签 playframework playframework-2.0

尝试学习如何创建动态 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/

相关文章:

playframework - 如何在页面模板和主模板之间传递非字符串参数?

twitter-bootstrap - 如何在 playframework 中自定义/主题 Bootstrap 4?

compiler-errors - Play Framework [2.0]-更改模型破坏了我的见解

java - 玩!框架 2.0 : How to display multiple image?

java - 如何使用play框架2绑定(bind)和处理表单中的复选框列表

java - Play Framework 2.0 表单助手 : from select to List<T>

scala - 运行 "clean"所有依赖的 SBT 子项目

java - 我怎么推剧!框架 java 应用程序到 Digital Ocean 液滴中的 Dokku?

playframework - 在 Play Framework 中填充一个 html 下拉列表

postgresql - Ebean 中的 Heroku Postgres bytea