【質問】スニペット間の値の共有について  【解決済み】

質問全般・改善要望
返信する
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

【質問】スニペット間の値の共有について

投稿記事 by Ralph »

いつもお世話になっております。

つかぬことをお聞きしますが、
例の様に、同リソース内で実行される同じスニペット間で、
同じ変数や値を更新・共有することは出来ないのでしょうか?

例)[*content*]内記述

コード: 全て選択

[[TEST_SNIPPET? &var=`123`]]
↑このスニペットで変数varの値を設定すると・・・

[[TEST_SNIPPET]]
↑このスニペットでvar=123とされて、内部でvar++すると・・・

[[TEST_SNIPPET]]
↑このスニペットではvar=124となる
上記例の様な実現方法で無くても良いので、
何らかの方法で値の共有が出来るのであれば、
教えていただけると助かります!

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

Re: 【質問】スニペット間の値の共有について

投稿記事 by yama »

https://github.com/modxcms-jp/evolution ... 2987-L2994
プレースホルダを使う方法が手軽です。ただしスニペットコールをネストした場合は先に書いたスニペットコールから順に処理されるとは限らないので要注意です。
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

Re: 【質問】スニペット間の値の共有について

投稿記事 by Ralph »

yama様

返信有難うございます。
私もプレースホルダの使用を考えましたが、
テストスニペット(TEST)として以下を作成してみました。

コード: 全て選択

$ph = $modx->getPlaceholder("test");
var_dump($ph);
if(empty($ph)){
	$modx->setPlaceholder("test", 123);
}
else{
	$modx->setPlaceholder("test", $ph++);
}
var_dump($modx->getPlaceholder("test"));
リソースで下記呼び出し

コード: 全て選択

[!TEST!]
[!TEST!]
としたところ、ページプレビューにて

コード: 全て選択

NULL int(123) NULL int(123)
となってしまいました。

使用方法が間違っているのでしょうか?
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: 【質問】スニペット間の値の共有について

投稿記事 by yama »

なるほど。これは別の問題で、$modx->evalSnippet()関数内のob_start()関数の前後で処理がキャッシュされているように見える現象を確認したことがあります。なので、2つ目のスニペットコールは実際には処理されず、キャッシュされた値を返している感じです。(キャッシュしないはずですが・・)

全く同じコードの別スニペットを作ると、そちらからは意図どおりに値を呼べると思います。

コード: 全て選択

[[test?test1]]
[[test?test2]]
あるいは上記のようにパラメータ違いのスニペットコールを書くとよいのではと思います。対症療法ですが。

ob関数やevalなどPHPのビルトイン関数側の問題なのか、MODX側の問題なのかは今のところ分かりません。
Ralph
メンバー
メンバー
記事: 24
登録日時: 2012年8月09日(木) 11:42

Re: 【質問】スニペット間の値の共有について  【解決済み】

投稿記事 by Ralph »

yama様

ありがとうございます!
一旦別の方法でシステム的には回避しました。
今後検討していきたいと思います。
よろしくお願いいたします。
返信する