我正在处理我的脚手架模板,更具体地说是create.gsp文件。我想获得我班上定义的属性。我在网上看到了许多关于如何做到这一点的帖子,但它们似乎都没有用。
尝试以下(grails templates - scaffolding controller):
<%
domainClass.properties.each {
println " ${it.type} ${it.name}"
}
%>
使用generate-all时出现以下错误:
Error occurred running Grails CLI: No such property: domainClass for class: groovy.lang.Binding
也试过这种方法:
<% import grails.persistence.Event %>
<%
excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated'
persistentPropNames = domainClass.persistentProperties*.name
props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) && (domainClass.constrainedProperties[it.name] ? domainClass.constrainedProperties[it.name].display : true) }
Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[]))
for (p in props) { %>
<g:message code="${domainClass.propertyName}.${prefix}${p.name}.label" default="${p.naturalName}" />
<% } %>
使用generate-all时出现以下错误:
Error occurred running Grails CLI: Failed to parse template script (your template may contain an error or be trying to use expressions not currently supported): startup failed:
GStringTemplateScript4.groovy: 2: Unknown type: IMPORT at line: 2 column: 54. File: GStringTemplateScript4.groovy @ line 2, column 54.
turn { out -> out << """"""; import gra
我是否遗漏了某些内容,或者Grails 3的方法有何不同?
使用Grails版本3.0.11
我感谢任何帮助!
答案 0 :(得分:1)
我使用grails 3.2.4版本,脚手架插件使用字段插件。在build.gradle文件中添加插件,如下所示。
dependencies {
...
compile "org.grails.plugins:scaffolding"
...
}
使用命令
安装模板grails install-form-fields-templates
在文件src / main / templates / scaffolding
中创建以下文件我已将所有视图自定义为twitter boostrap。要渲染字段,它使用字段插件。在index.gsm视图中,我想自定义表格渲染,用我的自定义代码替换g:table标记。
这是表格渲染的生成部分。
<f:table collection="\${${propertyName}List}" />
这是我的自定义代码,基于previos grails版本的previos脚手架代码,适合在grails 3.2.4版本上运行。
<table class="table table-striped">
<thead>
<tr>
<%
def grailsApplication = grails.util.Holders.grailsApplication
domainObjetc = grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz.newInstance()
domainClass= grailsApplication.getDomainClass(domainObjetc.class.name)
excludedProps = grails.persistence.Event.allEvents.toList() << 'id' << 'version'
allowedNames = domainClass.persistentProperties*.name << 'dateCreated' << 'lastUpdated'
props = domainClass.properties.findAll { allowedNames.contains(it.name) && !excludedProps.contains(it.name) && it.type != null && !Collection.isAssignableFrom(it.type) }
comparator = new org.grails.validation.DomainClassPropertyComparator(domainClass)
Collections.sort(props, comparator)
props.eachWithIndex { p, i ->
if (i < 6) {
if (p.isAssociation()) {
%><th class="header"><g:message code="${domainClass.propertyName}.${p.name}.label" default="${p.naturalName}" /></th><%
} else {
%><g:sortableColumn property="${p.name}" title="\${message(code: '${domainClass.propertyName}.${p.name}.label', default: '${p.naturalName}')}" /><%
}
}
}%>
<th></th>
</tr>
</thead>
<tbody>
<g:each in="\${${propertyName}List}" var="${propertyName}">
<tr>
<% props.eachWithIndex { p, i ->
if (i < 6) {
if (p.type == Boolean || p.type == boolean) { %>
<td><g:formatBoolean boolean="\${${propertyName}.${p.name}}" /></td>
<% } else if (p.type == Date || p.type == java.sql.Date || p.type == java.sql.Time || p.type == Calendar) { %>
<td><g:formatDate date="\${${propertyName}.${p.name}}" /></td>
<% } else { %>
<td>\${fieldValue(bean: ${propertyName}, field: "${p.name}")}</td>
<% } } } %>
<td class="link">
<div class="btn-group btn-group-xs">
<g:link action="show" id="\${${propertyName}.id}" class="btn btn-primary btn-sm" role="button">
<span class="glyphicon glyphicon-eye-open"></span>
<g:message code="default.button.show.label" default="Show" />
</g:link>
<g:link action="edit" id="\${${propertyName}.id}" class="btn btn-primary btn-sm" role="button">
<span class="glyphicon glyphicon-pencil"></span>
<g:message code="default.button.edit.label" default="Edit" />
</g:link>
</div>
</td>
</tr>
</g:each>
</tbody>
</table>
grails 3中的scaffolding插件,使用GStringTemplateEngine呈现视图,模板中不允许导入,跳过使用它们并使用完整的包位置,例如在模板内的Holders类中检索grailsApplication你必须使用grails.util.Holders.grailsApplication访问它们。
需要实现对属性的排序,在上面的代码中被注释为TODO任务。
<强>更新强> 可以使用DomainClassPropertyComparator类完成排序属性,使用grails 3.1
进行测试我希望对你有用。
答案 1 :(得分:0)
在 Grails 4 中,就我而言,Grails 4.0.10 要获取域列表,程序必须更改为:
MappingContext mappingContext = grailsApplication.getMappingContext()
def entities = mappingContext.getPersistentEntities()
并具体获取实体:
def entity = mappingContext.getPersistentEntity(fullEntityName)
获取实体的持久属性:
def persistentProperties = entity.getPersistentProperties()
并获得排除的属性:
def excludedProps = Event.allEvents.toList() << 'id' << 'version'
需要导入的库如下:
import grails.artefact.DomainClass
import grails.core.GrailsApplication
import grails.persistence.Event
import org.grails.datastore.mapping.model.MappingContext
因此我们可以遵循之前帖子中建议的相同逻辑!