我正在重构脚手架模板,但遇到了这个问题:
我试图从模板 _FORM.GSP 调用服务(一些安全逻辑) - 但在代码部分,而不是在输出部分
我已经阅读并尝试了这里的建议:如何从 gsp 调用 Grails 服务?
- 我尝试使用 taglib,但我对 grails 的了解可能不够广泛
- 我尝试将 import 和 def 添加到 _FORM.GSP 文件的开头(grailsApplication 和服务的应用程序实例化都在缺少属性应用程序和缺少属性 grailsApplication 时崩溃)
- 我什至尝试从代码中直接调用 taglib 作为方法 isAllowedToEdit 和 g.isAllowedToEdit 都在未知方法上崩溃。“没有这样的属性 g”
似乎模板 _form.gsp 与标准 gsp 视图有不同的规则
我想做这样的事情:
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)
}
/* trying to do this part */
// I want to assign value to cp.editable - so later I can render read-only fields in renderEdit
if (!mySecurityService.canEdit(springSecurityService.currentUser, owningClass.getClass(), actionName, p.name)) {
cp.editable = false
}
/* trying to do this part */
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>
<% } } %>
如果有任何方法可以分配 cp.editable - 我会尝试你的建议