我可以在Grails 1中执行此操作:动态创建数据输入表单

时间:2009-06-14 03:34:59

标签: grails

我正在考虑将Grails用于我当前的项目。我有几个要求,我希望我能用Grails做。

首先,我有以下数据库表:

TagType
---------
tag_type_id
tag_type


Sample Data: TagType
--------------------
1,title
2,author

根据这些数据,我需要生成一个这样的数据输入表单 将其数据保存到另一个表格。

平铺_ _ _ _ _ _ _ _ _ _
作者_ _ _ _ _ _ _ _ _ _

保存取消

我能用Grails做到吗?你能指出我正确的方向吗?

谢谢!

更多细节

我正在建立一个支持OIA-PMH的数字图书馆系统,这是一种共享文档元数据的标准。该标准规定每个元素都是可选的和可重复的。为了支持这一要求,我有以下数据库设计。

我需要主要根据内容生成用户GUI(数据输入表单) TagType表(见上文)。然后将表单中的数据保存到 标签(如果标签是新的)和Item_Tags表。

Items
---------
item_id
last_update

Tags
--------
tag_id
tag_type_id
tag

TagType
---------
tag_type_id
tag_type

Item_tags
---------
item_id
tag_id

Sample Data: Items
------------------
1,2009-06-15

Sample Data: TagType
--------------------
1,title
2,author

Sample Data: Tags
------------------

1,1,The Definitive Guide to Grails
2,2,Graeme Rocher
3,2, Jeff Brown

Sample Data: Item_tags
-----------------------
1,1
1,2
1,3

2 个答案:

答案 0 :(得分:0)

我不完全确定你在这里要求“将数据保存到另一张桌子”,但这里有一些想法。

对于您拥有的表,您需要的域类如下:

class Tag {    字符串类型

}

创建脚手架时,将自动为您生成

ID字段。

如果问题不充分,请在问题中添加更多信息。

答案 1 :(得分:0)

真的喜欢grails。几周前,当我第一次开始玩它时,我没有意识到它是一种完整的语言。事实上,它不止于此。它是一个完整的Web堆栈,包含Web服务器和数据库。无论如何,对我的问题的简短回答是肯定的。当然,你甚至可以说是的!这是我创建的taglib的代码:

import org.maflt.flashlit.pojo.Item
import org.maflt.flashlit.pojo.ItemTag
import org.maflt.flashlit.pojo.Metacollection
import org.maflt.flashlit.pojo.SetTagtype
import org.maflt.flashlit.pojo.Tag
import org.maflt.flashlit.pojo.Tagtype

/**
* @return Input form fields for all fields in the given Collection's Metadataset. Does not return ItemTags where TagType is not in the Metadataset.
*  
* In Hibernate, the
*
*    "from ItemTag b, Tag a where b.tag= a"
*
* query is a cross-join. The result of this query is a list of Object arrays where the first item is an ItemTag instance and the second is a Tag instance.
*
* You have to use e.g.
*
*    (ItemTag) theTags2[0][0]
*
* to access the first ItemTag instance.
* (http://stackoverflow.com/questions/1093918/findall-not-returning-correct-object-type)
**/
class AutoFormTagLib {

    def autoForm = {attrs, body ->
        //def masterList    = Class.forName(params.attrs.masterClass,false,Thread.currentThread().contextClassLoader).get(params.attrs.masterId)
        def theItem     = Item.get(attrs.itemId)
        def theCollection   = Metacollection.get(attrs.collectionId)
        def masterList  = theCollection.metadataSet.setTagtypes
        def theParams   = null
        def theTags     = null
        def itemTag     = null
        def tag         = null
        masterList.each {

            theParams   = [attrs.itemId.toLong(),it.tagtype.id]
            theTags     = ItemTag.findAll("from ItemTag d, Item c, Tag b, Tagtype a where d.item = c and d.tag = b and b.tagtype = a and c.id=? and a.id=?",theParams)

            for (int i=0;i<it.maxEntries;i++) {                 
                out << "<tr>\n"
                out << "    <td>${it.tagtype.tagtype}</td>\n"
                out << "    <td>\n"
                if (theTags[i]) {
                    itemTag     = (ItemTag) theTags[i][0]
                    //item  = (Item)    theTags[i][1]
                    tag     = (Tag) theTags[i][2] 
                    //itemTag   = (Tagtype) theTags[i][3]
                    out << "    <input name='${it.tagtype.tagtype}_${i}_${itemTag.id}' value='${tag.tag}' />\n";
                }
                else
                    out << "       <input name='${it.tagtype.tagtype}_${i}' />\n";
                out << "    </td>\n"
                out << "</tr>\n"
            }
        }

    }
}