Grails Field插件:选择一对多关系的标签

时间:2013-12-18 08:35:15

标签: grails

我正在使用Grails 2.2.3和Fields插件1.3。 我想自定义字段以使用select标签管理一对多关系。

views/_fields/oneToMany/_input.gsp我有:

<g:select name="${property}.id" from="${type.list()}" optionKey="id" value="${value}" class="form-control one-to-many" noSelection="['null': "${label}"]" />

但是type是一个集合,因此我无法使用list函数。

如何检索目标域类?

4 个答案:

答案 0 :(得分:5)

只要您使用Map声明关系,例如:

static hasMany = [ books: Book ]

您可以获取引用域的列表,这是 bean hasMany属性中的键,因此from属性应更改为

from="${bean.hasMany[property].list()}"

或者,您可以将列表传递给_input.gsp模板,前缀为input-变量名称,例如

<f:field property="books" input-domainList="${bookInstaceList}" />

_input.gsp模板中,您可以按如下方式使用变量:

from="${domainList}"

或混合两种方法:

from"${domainList ?: bean.hasMany[property].list()}"

答案 1 :(得分:2)

我找到了解决问题的方法,此代码可以一对多和一对一正常工作

<div class="input-group">
  <g:select name="${persistentProperty.toString().contains('one-to-many')?property:property+'.id'}" value="${value?.id}" required="${required}"
    noSelection="${['null':'Escriba...']}" class="select2 col-md-6"
    multiple="${persistentProperty.toString().contains('one-to-many')?true:false}" from="${grailsApplication.getDomainClass(persistentProperty.properties['associatedEntity'].toString()).clazz.list()}"
    optionKey="id"></g:select>
</div>

此解决方案可能会有所帮助。我在Fields Plugin的文档中发现,persistentProperty是类类型DomainProperty,但是它们的方法无效,并且我发现正确的类是org.grails.datastore.mapping.model.MappingFactory

答案 2 :(得分:0)

您可以在Set上使用.toArray()方法而不是.list()。

麦酒

答案 3 :(得分:0)

您可以使用以下代码来识别您的收藏元素

def className = bean.hasMany[property].properties.typeName

查看我的&#34; views / _fields / oneToMany / _input.gsp&#34;实现:

<%@ page defaultCodec="html" %>
<%
    def className = bean.hasMany[property].properties.typeName
    def simpleName = Class.forName(className).simpleName
    def beanSimpleName = bean.class.simpleName
    def createUri = "/${simpleName.toLowerCase()}/create?${beanSimpleName.toLowerCase()}.id=${bean.id}"
%>

<a id="add${simpleName}" name="add${simpleName}" href="${createLink(uri: "${createUri}")}">
        Add ${simpleName}
</a>
<ul>
    <g:each var="item" in="${value}">
        <li>
            <a href="${createLink(uri: "/${simpleName.toLowerCase()}/show/${item.id}")}">${item}</a>
        </li>
    </g:each>
</ul>