私は足場テンプレートをリファクタリングしていますが、この問題で壁にぶつかりました:
テンプレート _FORM.GSP からサービス (いくつかのセキュリティ ロジック) を呼び出そうとしましたが、出力部分ではなくコード部分で
私はここで提案されたことを読んで試しました: How do I call a Grails service from a gsp?
- taglib を使用しようとしましたが、grails に関する私の知識が十分でない可能性があります。
- import と def を _FORM.GSP ファイルの先頭に追加しようとしました (サービスの grailsApplication とアプリケーションのインスタンス化の両方が、欠落しているプロパティ アプリケーションまたは欠落しているプロパティ grailsApplication でクラッシュしていました)。
- コードから taglib をメソッド isAllowedToEdit として直接呼び出すことも、g.isAllowedToEdit として呼び出すことも試みましたが、どちらも未知のメソッド resp でクラッシュします。「そのようなプロパティはありません 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 を割り当てる方法があれば - あなたの提案を試してみます