チャンクの中でテンプレート変数、スニペットを使う  【解決済み】

質問全般・改善要望
返信する
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by admsmith777 »

チャンクの中でテンプレート変数を用いることは可能と思いますが、テンプレート変数の値にスニペットを呼ぶ記述をした場合、チャンク中で呼び出したテンプレート変数はスニペットを実行することなく、そのままの状態で表示されてしまいます。

つまり、ドキュメント登録時に指定するテンプレート変数の値に「[!sunippet? &param=`TEST`!]」などとし、テンプレート変数の名前が "templateName" としたとき、チャンク登録時の内容に「[*templateName*]」としても、スニペットが実行されず、「[*templateName*]」が「[!sunippet? &param=`TEST`!]」に置き換わってしまうのです。

何かしらのプラグインなどでスニペットが実行できるようにはできないのでしょうか?

また、ドキュメント、チャンク中で共通の手段でスニペットで作成した動的変数を表示したいと思うのですが、チャンク中にスニペットが利用できない、または上記のことが実現できずに悩んでいます。よい知恵があればお貸しください。

お願いします。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

テスト手順を確認したいのですが、以下の手順で合ってますか?

1. テンプレート変数「templateName」を作り、任意のテンプレートに割り当てる
2. スニペット「sunippet」を作る。return 'OK'; など簡単な内容でかまわない
3. チャンク「chunk」を作り、その中身に「[*templateName*]」と記述する
4. 投稿画面を開き、テンプレート変数の入力フィールド「templateName」内に「[!sunippet? &param=`TEST`!]」と記述する
5. 本文領域内([*content*])にチャンクコール「{{chunk}}」を記述する

上記の手順でよければ、MODX Evo最新の1.0.5J-r7では正しく出力できました。r7はr6以前とは処理の仕組みが異なるので、もしr6以前のバージョンであれば状況が違うかもしれません。
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by admsmith777 »

yama さん、返信ありがとうございます。

具体的な手順ですが、私の説明が足りませんでした。改めてyama さんの手順を引用し、より具体的に補足させていただくと、

あらかじめドキュメントから呼ぶスニペット「sunippet2」を作り「return $modx->getChunk( "chunk" );」という内容で保存します。

1. テンプレート変数「templateName」を作り、任意のテンプレートに割り当てる
2. スニペット「sunippet」を作る。return 'OK'; など簡単な内容でかまわない
3. チャンク「chunk」を作り、その中身に「[*templateName*]」と記述する
4. ドキュメントの投稿画面を開き、テンプレート変数の入力フィールド「templateName」内に「[!sunippet? &param=`TEST`!]」と記述する
5. さらに、本文領域内([*content*])にスニペット「sunippet2」を呼び出すために「[!sunippet2!]」と記述する
6. ドキュメントにアクセスする

本文領域内([*content*]) から直接チャンクを呼ぶのではなく、本文領域内([*content*])で呼ばれたスニペットからgetChunk でチャンクを呼ぶところが説明が足りなかったところです。

ただ、一つ不思議なのは、上記手順のうち、テンプレート変数の入力フィールド「templateName」内に「[[sunippet? &param=`TEST`]]」と記述れば意図した通り動作します。

また、今回このような質問をした背景ですが、
ドキュメントの本文領域内と、チャンクにおいて、共通の記述(テンプレート変数) で動的内容(スニペットの出力) を表示できないかと考えていました。ただ、チャンクについては、スニペットからも呼ばれます。スニペットで動的な値をチャンクに対して出力すればよいのですが、そうなると「共通の記述」で動的内容を出力できません。ですので、「スニペット>チャンク>テンプレート変数>スニペット>出力」みたいな複雑なことをしています。

なお、modx のバージョンは最新の「1.0.5J-r7」を使っています。

お願いします。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

なるほど、そのパターンだと展開できないですね。対応可能だと思うのでしばらくお待ちください
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by admsmith777 »

お返事ありがとうございます。

ということは現段階での仕様上展開できないということなんですね。是非modx の方で対応いただけたらと思います。

お願いします。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

プラグインで対応する場合は添付のコードをプラグイン新規作成画面に貼り付けてOnWebPagePrerenderイベントにフックすればよいかもしれません
(もしよければ本体の修正でも検証協力をいただけると助かります)
添付ファイル
plugin.txt
(714 バイト) ダウンロード数: 401 回
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by admsmith777 »

プラグインを見ました。強制的に[! を[[ に変換してパースし直しているんですね。しかしこれでは本来の[! の意味は無いような気がします。
この件はyama さんの文章によればmodx 本家で対応されていないことのようなので、私もソースを追って修正箇所を探るよう努めます。

お願いします。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

admsmith777 さんが書きました:プラグインを見ました。強制的に[! を[[ に変換してパースし直しているんですね。しかしこれでは本来の[! の意味は無いような気がします。
キャッシュをパースした後なので大丈夫ですよ。念のためお試しを
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

コア修正できました。 /manager/includes/ ディレクトリ内に上書きしていただけますでしょうか
添付ファイル
document.parser.class.inc.zip
(28.2 KiB) ダウンロード数: 397 回
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by admsmith777 »

すいませんが、もしかしたらキャッシュについてすごい誤解していたのかもしれません;

そもそもスニペットのキャッシュが有効になるのは、ドキュメントの本文領域内([*content*]) にスニペットを書いたときで、スニペットから呼ばれたチャンク内のスニペットコールについては[! と書こうが[[ と書こうがキャッシュされない。

まず、私の上記認識はあってるのでしょうか?であれば、先ほどの私の回答はまったくナンセンスですよね^^

お願いします。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

いえ、どこに書いても [[ と書けばキャッシュされますし [! と書けばキャッシュされないことになってます。今回の件は [! の処理が甘く1回しか処理しない実装になっていたため、入れ子になったエレメント内に処理が及ばなかったということになります
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by admsmith777 »

キャッシュの件ですが、そうなんですか?
キャッシュはassets/cache の下に記憶されると思っていますが、試しにチャンク内で [[ と記載してもassets/cache にはキャッシュされませんでした。ということから、ドキュメントの本文に記載したスニペットのみキャッシュ指示があった場合のみキャッシュされると理解しておりました。違うんですね^^


さて、頂いたコアクラスを導入してテストしてみました。今のところ問題なく利用できております。

コードを見て思いましたが、modx はシンプルで追いやすいですね^^いずれ自分も独自拡張できるよう精進したいと思います。
今回はご対応ありがとうございました。

お願いします。
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: チャンクの中でテンプレート変数、スニペットを使う

投稿記事 by yama »

admsmith777 さんが書きました:キャッシュの件ですが、そうなんですか?
キャッシュはassets/cache の下に記憶されると思っていますが、試しにチャンク内で [[ と記載してもassets/cache にはキャッシュされませんでした。ということから、ドキュメントの本文に記載したスニペットのみキャッシュ指示があった場合のみキャッシュされると理解しておりました。違うんですね^^
エレメント単位で処理しているわけではないので、今回のように一番外側(本文領域の[!sunippet2!]のこと)が[!になっていたら、その内側は全てキャッシュをスキップしますね。そのほうがシンプルで問題の切り分けがしやすいからかな?と思います
(Revoのほうはエレメント単位でキャッシュを管理してた気がします)
admsmith777
メンバー
メンバー
記事: 7
登録日時: 2011年10月04日(火) 11:55

Re: チャンクの中でテンプレート変数、スニペットを使う  【解決済み】

投稿記事 by admsmith777 »

なるほど。そういうことだったんですね。良く理解できました。

少し脱線してキャッシュの話も質問してしまいましたが、このスレッドについてはクローズさせていただきます。

ありがとうございました。
返信する