1

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

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

我已经阅读并尝试了这里的建议:如何从 gsp 调用 Grails 服务?

  1. 我尝试使用 taglib,但我对 grails 的了解可能不够广泛
  2. 我尝试将 import 和 def 添加到 _FORM.GSP 文件的开头(grailsApplication 和服务的应用程序实例化都在缺少属性应用程序和缺少属性 grailsApplication 时崩溃)
  3. 我什至尝试从代码中直接调用 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 - 我会尝试你的建议

4

2 回答 2

1

似乎模板 _form.gsp 与标准 gsp 视图有不同的规则

生成的 _form.gsp 与其他 gsps 的工作方式相同,但其中的模板scr/templates/scaffolding/不同。像您正在做的自定义模板有点棘手。请记住,您正在编写的逻辑是针对 Grails 如何生成视图(gsp)。这意味着您告诉 Grails 在内存或文件中生成视图之前检查一些逻辑。对于运行时的动态(内存中)脚手架,您可能能够在某种程度上实现这一点,但对于静态脚手架肯定不行。这是因为 Grails 不知道currentUser何时生成模板。

如果您生成视图然后自定义它们而不是修改它们的模板,您的问题会简单得多。然后您可以注入您的服务并进行其他检查。但是,正如您还提到的,这些逻辑在此处的标记库中会更好。

此外,由于您提到了安全性,因此呈现不可编辑的字段并不能保证无法编辑您的字段。我建议将检查逻辑放在您的控制器中,例如在 SAVE 或 UPDATE 操作中,以防止任何未经授权的用户编辑字段。

于 2013-06-17T16:36:16.903 回答
0

你试过这个吗?

    <%@ page import="com.myproject.MyService" %>
<%
    def myService = grailsApplication.classLoader.loadClass('com.myproject.MyService').newInstance()
%>

这肯定会奏效。

通过这个链接:点击这里

于 2013-06-17T06:27:33.890 回答