我正在重构脚手架模板,我遇到了这个问题:
我试图从模板_FORM.GSP调用服务(一些安全逻辑) - 但是在代码部分,而不是在输出部分
我已阅读并尝试了此处的建议:How do I call a Grails service from a gsp?
似乎模板_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 - 我会尝试你的建议
答案 0 :(得分:1)
似乎模板_form.gsp与标准gsp视图具有不同的规则
生成的_form.gsp与其他gsps的工作方式相同,但scr/templates/scaffolding/
内的模板不同。像你一样自定义模板有点棘手。请记住,您正在编写的逻辑是Grails关于如何生成视图(gsp)的。这意味着你告诉Grails在内存或文件中生成视图之前检查一些逻辑。你可能能够在运行时为动态(内存)脚手架做一些扩展,但肯定不能用于静态脚手架。那是因为Grails
生成模板时不知道currentUser
。
如果您生成视图然后自定义视图而不是修改模板,那么您的问题会更加简单。然后您可以注入您的服务并进行其他检查。但是,正如您还提到的那样,在标记库here中,这些逻辑会更好。
此外,由于您提到了安全性,因此渲染字段不可编辑并不能保证无法编辑字段。我建议将检查逻辑放在控制器中,例如在SAVE或UPDATE操作中,以防止任何未经授权的用户编辑字段。
答案 1 :(得分:0)
你试过这个吗?
<%@ page import="com.myproject.MyService" %>
<%
def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>
这肯定会有用。
点击此链接:click here