2012-04-01 11 views
0

私は非常に単純なCMS機能をgrailsアプリケーション内に構築しようとしています。 基本的に私はここで何をしようとしているのはgspを文字列に入れて、この文字列からgspを構築したいのです。grailsアプリケーション内のCMS

動作しますが、結果のページはメインレイアウトでは装飾されていません。 さらに、他のいくつかの試みでは、makeメソッドに渡されたモデルが無視されていることに気付きました。

私はgrails 2.0.1を使用しています。あなたは、本質的に単なる文字列でレンダリング呼び出しているので、動作しません

おかげ

class HomeController { 

    def groovyPagesTemplateEngine 

    def cms() { 
     def page = """<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<meta name="layout" content="main"/> 
<title>CMS page using your application's main layout</title> 
</head> 
<body> 
CMS page using your application's "main" layout. 
</body> 
</html>""" 

     StringWriter sw = new StringWriter() 
     PrintWriter pw = new PrintWriter(sw) 

     groovyPagesTemplateEngine.createTemplate(page, "somepage.gsp").make([nome: "ciao"]).writeTo(pw) 
     render sw 
    } 
+0

本当に試してみませんか?あなたはWeceemを見たことがありますか?http://www.weceem.org/ これはGrailsと本当にうまく統合されています... –

+0

あなたは正しいです。私はそれをチェックアウトしましたが、私がここで達成したいのは、この実験がうまくいくことでした。一方で、私は今までたくさんの良いことを聞いたように私はweemを試してみます – Luca

答えて

1

sitemeshフィルタが呼び出されるとレイアウトが適用されます。これを動作させるには、あなたの文字列に適用されるsitemeshデコレータを取得する必要があります。

すなわち、

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<meta name="layout" content="${layout}"/> 
${head} 
</head> 
<body> 
${body} 
</body> 
</html> 

Mytemplate.gsp

、その後、あなただけ呼び出すことができます。

我々は同様の機能を構築した

、我々が行ったすべては、関連するページ・フラグメントを送信することでした。

render(template: 'MyTemplate', model:[ layout: 'layout', head: '...', body: '...' ]) 

これはあなたがやろうとしているのと同じ効果を持ちますが、 sitemeshのディクショナリ(およびプラグインが正しく統合されている可能性があります)。

+0

あなたのポイントを得る。しかし、あなたの例では、あなたのテンプレートはファイルシステム上にあるので、renderを呼び出すことができます。レンダリング(と実際にはsitemeshフィルタ)を文字列内のテンプレート(実際にはデータベースから来て)に呼び出して装飾する方法はありますか? – Luca

+0

詳細を分かりやすくするために、私はgspをデータベースに保存したいので、レイアウトデコレーションでレンダリングしたいと思います。これまでのところ、これはもう不可能なようです... – Luca

+0

おそらくできます。 applyLayoutタグ(http://grails.org/doc/1.1/ref/Tags/applyLayout.html#)のコードを見てください。デコレータへの追加の呼び出しがあることがわかります。しかし、あなたのデコレータチェーンはgspに設定されていません。レンダリングを(傍受者またはフィルタを介して)フィルタチェーンの下に移動するか、またはサイトメッシュフィルタの機能を複製する必要があります。私の解決策は、このための簡単な回避策を提供します。 –

関連する問題