GRAILS:我可以从_FORM.GSP模板调用服务逻辑吗?

时间:2013-06-17 06:00:34

标签: templates grails service view

我正在重构脚手架模板,我遇到了这个问题:

我试图从模板_FORM.GSP调用服务(一些安全逻辑) - 但是在代码部分,而不是在输出部分

我已阅读并尝试了此处的建议:How do I call a Grails service from a gsp?

  1. 我尝试过使用taglib,但我对grails的了解可能不够广泛
  2. 我尝试将import和def添加到_FORM.GSP文件的开头(grailsApplication和应用程序实例化服务都在丢失的属性应用程序上崩溃了。缺少属性grailsApplication)
  3. 我甚至试图直接从代码中调用taglib作为方法isAllowedToEdit以及g.isAllowedToEdit同时在未知方法resp上崩溃。 “没有这样的财产g”
  4. 似乎模板_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 - 我会尝试你的建议

2 个答案:

答案 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