Playframework 创建动态html表单

Playframework 创建动态html表单,playframework,playframework-2.0,Playframework,Playframework 2.0,尝试学习如何创建动态html表单。这些元素将在数据库中定义。创建页面后,控制器将处理回发数据,以将数据插入数据库 我正在使用playframework 1.2.4 如果您有任何指导/有用的链接,我们将不胜感激 如果我知道元素是什么,并且当我从控制器调用render(param object)并访问视图中的对象时,我可以从数据库表中为select list提取数据,那么我就可以构建页面 到目前为止,我的黑客: 创建了一个包含以下列的表 rid HTMLElementType ElementName

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

我正在使用playframework 1.2.4

如果您有任何指导/有用的链接,我们将不胜感激

如果我知道元素是什么,并且当我从控制器调用render(param object)并访问视图中的对象时,我可以从数据库表中为select list提取数据,那么我就可以构建页面

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

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;
}
在我看来,我循环检查它是否是
,如果是,则输入一个空选项。但不确定这样做是否正确。此外,在我看来,我还必须检查它是否正确,然后我必须输入
并构建完整的标记

此外,我如何对某些必填字段(例如姓氏/ssn/等)实施验证?我可以改变我的表格,要求有一列可以帮助我


甚至不确定在回发时捕获数据的正确方法基本上问题是生成html表单。你似乎已经弄明白了你的模型。您缺少的是一个视图。我做了如下一次,为simpleDB模型生成了一个模型

我提供了一个字段列表,UI是基于这些字段生成的。我只有文本字段,只需要两个case(可见和不可见)字段。您的用例可能需要更多的复杂性,因此您可以根据需要进行调整

dish.fields
包含具有相关元数据的字段。任何特殊情况,例如,需要验证或需要,都必须向视图提供该信息,以便视图能够以适当的方式渲染字段

最简单的建模方法是从一个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}
编辑 如何渲染字段? 控制器将元数据(
DisplayAttribute
)传递给视图,在这种情况下,元数据只包含字段的名称以及它是否可显示

型号

在这里,模型包含要渲染的字段,但您可以同样轻松地从数据库中检索这些字段。我的模型是通用的,因为我意识到我对多个模型反复做同样的事情

我实现了自己的接口,该接口为我提供了
getFields
方法。我还维护了两个映射,这样给定一个属性,我就可以得到它的DisplayAttribute,给定一个DisplayAttribute,我就可以得到它的名称。需要时,我从视图调用此模型的方法

    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
}
public类GenericSimpleDBModel实现SimpleDBModel{
公共静态amazonsimpledbsdb=null;
私有静态最终字符串bracketRemovalPattern=“(^.*?\\[\124;\\]\\ s*$)”;
私有映射数据=新树映射(新UUIDComarator());
私有映射attributeCache=newhashmap();
受保护的最终字符串域名;
公共泛型impledBModel(){
初始化(getFields());
这个域名是“菜品”;
}
受保护的void初始化(字符串[]字段){
数据=新树映射(新UUIDComarator());
attributeCache=新HashMap();
for(字符串f:字段){
//if(f.equals(getUUIDField())| | f.equals(getIntegrityField()){
if(f.endsWith(“uuid”)| f.endsWith(“完整性”)){
设置值(f,“,布尔值.FALSE);
}否则{
设置值(f,“,布尔值.TRUE);
}
}
}
受保护的无效初始化(设置字段){
数据=新树映射(新UUIDComarator());
attributeCache=新HashMap();
用于(显示属性atr:字段){
设置值(atr.name,“”);
}
}
…更多方法
}

你的问题有点太笼统了,很难就这样的问题给你任何答案@Seb Cesbron:如果它与playframework无关,而是与jsp/java有关,会有帮助吗?这些表单之后会提交到哪里?我不确定你如何处理提交动态表单的问题,因为你不知道自己将成为什么样的人toring。关于验证,您可以使用jquery定义验证器,并将类定义为DynameForm的一部分。@seePatCode:用户数据只经过验证,如果用户有效,则暂时将其定向到站点。我想我会处理接下来的数据存储问题。帖子将在默认控制器中捕获,然后在根据模型验证。你能解释一下如何在视图中没有html表单的情况下渲染它吗???@R.A我已经尝试了更多的解释,如果还有疑问,请告诉我。我已经尝试了更多的解释。首先我真的感谢你。我试着理解你的代码。但是我不能。后来我发现并确认你的代码是groovy,用于play framework 1。无论如何,我使用的是版本2。我需要使用JAVA或SCALA。如果您能帮助我使用JAVA或SCALA??如果我能阅读一些使用动态html表单的教程,我将不胜感激。根据问题的标记方式,我用1.2语法回答。如果您需要它用于2.x,如果您理解当然,你应该能够移植这个例子。我会看看我是否能在2.x中创建一个例子。我在新版本中没有涉猎太多,所以没有承诺。我会重新标记这个问题
    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
}