grails - 在Grails中使用DomainClassPropertyComparator

标签 grails grails-plugin grails-domain-class

在我的grails View 中,当我对每个单独的属性使用f:display时,不会选择应用于域类约束的顺序。我听说可以根据域类上的约束使用域类属性比较器对属性显示进行排序。

某些机构可以帮助我如何使用DomainClassPropertyComparator对 View 中的属性进行排序吗?

最佳答案

您可以安装脚手架模板,编辑_form.gsp并将其使用的比较器更改为DomainClassPropertyComparator例如。我的_form.gsp

    <%=packageName%>
<% import grails.persistence.Event %>
<% import org.codehaus.groovy.grails.scaffolding.DomainClassPropertyComparator %>


<%  excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated'
    persistentPropNames = domainClass.persistentProperties*.name
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    if (hasHibernate && org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.getMapping(domainClass)?.identity?.generator == 'assigned') {
        persistentPropNames << domainClass.identifier.name
    }

DomainClassPropertyComparator mattsComparator = new DomainClassPropertyComparator(domainClass)
comparator = mattsComparator

props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) }
    Collections.sort(props, comparator)
    for (p in props) {
        if (p.embedded) {
            def embeddedPropNames = p.component.persistentProperties*.name
            def embeddedProps = p.component.properties.findAll { embeddedPropNames.contains(it.name) && !excludedProps.contains(it.name) }
            Collections.sort(embeddedProps, comparator)
            %><fieldset class="embedded"><legend><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></legend><%
                for (ep in p.component.properties) {
                    renderFieldForProperty(ep, p.component, "${p.name}.")
                }
            %></fieldset><%
        } else {
            renderFieldForProperty(p, domainClass)
        }
    }

private renderFieldForProperty(p, owningClass, prefix = "") {
    boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate')
    boolean display = true
    boolean required = false
    if (hasHibernate) {
        cp = owningClass.constrainedProperties[p.name]
        display = (cp ? cp.display : true)
        required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable && (cp.propertyType != String || !cp.blank) : false)
    }
    if (display) { %>
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''}">
    <label for="${prefix}${p.name}">
        <g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" />
        <% if (required) { %><span class="required-indicator">*</span><% } %>
    </label>
    ${renderEditor(p)}
</div>
<%  }   } %>

关于grails - 在Grails中使用DomainClassPropertyComparator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32494197/

相关文章:

Grails:我可以在应用程序之外存储 GSP 吗?

grails - 配置Activiti BPM?

mysql - 如何在 Grails 应用程序中使用 AngularJs 以及 MySql 数据库

Grails-ElasticSearch 插件 : Conditional Indexing of domain instances

grails - Grails:在Domain类中添加新字段会导致崩溃

grails - 需要有关grails域类设计的帮助

forms - 提交表格时,Grails在 Controller 上给了我404

grails - 如何在Tomcat上访问Grails应用程序

grails - Gradle 在构建 Grails 项目时给出 ClassNotFoundException

java - 如何分解一个庞大的 Grails 应用程序?