ファイルrenderEditor.templateにパラメーターを送信する必要があります(「grailsinstall-templates」のインストール後)が、方法がわかりません。誰か助けてもらえますか?ありがとう。
2 に答える
で使用可能なバインディング変数は、 DefaultGrailsTemplateGeneratorrenderEditor.template
で修正されています
def binding = [pluginManager: pluginManager,
property: property,
domainClass: domainClass,
cp: cp,
domainInstance:getPropertyName(domainClass)]
domainClass
でありGrailsDomainClass
、スキャフォールディングテンプレートで呼び出しに渡されたものproperty
であり、対応するである。それらの1つから必要なものを抽出できる場合があります。GrailsDomainClassProperty
renderEditor(p)
cp
ConstrainedProperty
同じ問題でグーグル経由でここに来た他の人々のために(私がしたように)
Ian Robertsが提案したのと同じようにこれを行うことができましたが、TemplateGeneratorの新しい実装を作成する必要はありません。必要なのは、org.codehaus.groovy.grails.commons.GrailsDomainClassPropertyのプロキシ実装を作成することだけです。
_form.gspの内部で、データを追加して新しいプロパティを作成しました。
p = new HgfGrailsDomainClassProperty(p, prefix, domainClass)
if (display) { %>
<hgf:ifAllowedOnField action="show" field="${p.name}">
<hgf:ifReasonToShow reasonElement="${p.name}" bean="\${${propertyName}}">
<div class="fieldcontain \${hasErrors(bean: ${propertyName}, field: '${prefix}${p.name}', 'error')} ${required ? 'required' : ''} ${(cp?.metaConstraints?.hiddenField)?'hiddenProperty':''}">
<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)}
...
実装は次のようになります。
package sk.hoppo.hgf;
import org.codehaus.groovy.grails.commons.GrailsDomainClass
import org.codehaus.groovy.grails.commons.GrailsDomainClassProperty
public class HgfGrailsDomainClassProperty implements GrailsDomainClassProperty {
private final String domainSuffix = "Instance";
private GrailsDomainClassProperty property;
String prefix;
String domainInstance;
public HgfGrailsDomainClassProperty(GrailsDomainClassProperty property, String prefix, GrailsDomainClass parentDomainClass) {
super();
this.property = property;
this.prefix = prefix;
domainInstance = getPropertyName(parentDomainClass);
}
private String getPropertyName(GrailsDomainClass domainClass) {
return "${domainClass.propertyName}${domainSuffix}";
}
@Override
public int getFetchMode() {
return property.getFetchMode();
}
@Override
public String getName() {
return property.getName();
}
...
renderEditor.template内では、送信データにアクセスするだけです。
sb << '<hgf:securedField'
sb << ' name="' << property.prefix << property.name << '"'
sb << ' field="' << property.prefix << property.name << '"'
ところで。これで、カスタムrenderEditorで正しく動作するようにコンポジション(埋め込み)を作成しました