ページ 1 / 1
MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月16日(木) 16:34
by yama
MODX Revutionでリソースを新規作成時、プレビュー操作ができません。その都度キャッシュをクリアするか空更新すればいいのですが、不便です。
対症療法ですが、プラグインで解決する方法が分かったのでシェアします
コード: 全て選択
if($mode==='new') $modx->cacheManager->refresh();
上記のような一行プラグインを作ってOnDocFormSaveにフックします。
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月17日(金) 13:57
by neran
自分では気にしてなかったけど、確認してみたら、空更新してるお客さんいました。
newResourcePreviewHelper プラグインとして、使わせてもらいます。
ありがとうございます。
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月17日(金) 14:03
by yama
どうもです。最初は気のせいかなと思ってたのですが・・
コード: 全て選択
public function clearCache() {
$clear = $this->getProperty('syncsite',false) || $this->getProperty('clearCache',false);
if ($clear) {
$this->modx->cacheManager->refresh(array(
https://github.com/modxcms/revolution/blob/develop/core/model/modx/processors/resource/create.class.php
ポイントはここで、たとえば$clearに決め打ちでtrueを入れてやると問題なく処理されるようになります。ちょっとしたことで修正できそうなんですがgetProperty()の扱いがよく分からずです orz
(syncsiteとclearCacheはどちらも投稿画面内のフィールド)
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月17日(金) 16:00
by neran
こんにちは。Revo周りがちょっと賑やかになってきたような。
getProperty()はこいつですかね。
https://github.com/modxcms/revolution/b ... s.php#L186
コード: 全て選択
/**
* Get a specific property.
* @param string $k
* @param mixed $default
* @return mixed
*/
public function getProperty($k,$default = null) {
return array_key_exists($k,$this->properties) ? $this->properties[$k] : $default;
}
Revoでは model を主にプロセッサーとして抽象化してて、
getProperty()はその基底クラスに用意された、properties arrayのgetterメソッド。
第2引数でキーが存在しない場合の戻り値を指定できるので、あちこちで使いやすい。
んで、'syncsite' か 'clearCache' というキーを使って、
フォーム側からキャッシュの制御が出来るようにしてある、という感じでしょうか。
対症療法的でない解決は、new時のフォームに'syncsite' か 'clearCache' を 真で持たせる、かな…?
意味合いとしてどっちを使うのが適切かは、扱いもうちょっと見てみないと言えないですね。
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月17日(金) 16:17
by yama
ありがとうございます。
と、今思いついたのですが。このタイミングで値を取得できないから$cacheManager->refresh()を行なうわけですから、ここでgetProperty()を使ってsyncsiteやclearCacheの値を見ようとしていること自体が意味ないですよね。だから、第2引数で指定したfalseしか返ってこない。
キャッシュを無視して、DBにストアされた値を直接参照できるオプションがあるとよいのですが。
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 14:33
by neran
Revo 言語ファイルの配信、ありがとうございます。
> このタイミングで値を取得できないから$cacheManager->refresh()を行なうわけですから、
> ここでgetProperty()を使ってsyncsiteやclearCacheの値を見ようとしていること自体が意味ないですよね。
んー、これはどうなんでしょうか。何か動きを勘違いしてるかもしれないので、
後でフォーム側いじって確認してみます。
そもそもは、modResourceCreateProcessor のキャッシュ制御を担う clearCache() が、
new のケースを考慮してないって事が問題な気がします。
最初にyamaさんがプラグイン向けに用意した
コード: 全て選択
if($mode==='new') $modx->cacheManager->refresh();
という処理が、clearCache()で行われれば良いような…。
$modeが取れるとしてですが、
コード: 全て選択
public function clearCache() {
$clear = $this->getProperty('syncsite',false) || $this->getProperty('clearCache',false) || $mode === 'new' ;
if ($clear) {
$this->modx->cacheManager->refresh(array(
で、どうでしょうか。
なんかやっぱり制御の全体像が自分で見えてない感じです。
もうちょっと把握続けます。
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 14:51
by yama
https://github.com/RTOSkit/revolution/c ... decf079f9b
他の方からアイデアいただきました。私はgetProperty()ばかり見てたけど、ポイントはそこじゃないみたいです。たとえば、フレンドリーURL無効でindex.php?id=xxでサイトを運用している場合は今回の問題は発生しないということで。つまりgetProperty()はちゃんと値を取得できてるはずだよということなんですが、ホントかな?という気がします。
コード: 全て選択
public function clearCache() {
$clear = $this->getProperty('syncsite',false) || $this->getProperty('clearCache',false) || $mode === 'new' ;
if ($clear) {
$this->modx->cacheManager->refresh(array(
これだと、syncsiteやclearCacheの値を$mode === 'new' が打ち消して無条件にキャッシュをリフレッシュしてしまうと思います。私が書いたコードもそうですけど orz
print_r($this->properties)を見てみるとヒントがありそうな・・
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 15:04
by yama
さっそく試してみました。ログに出力するのはかえって面倒なのでfile_put_contentsで・・
1のはずなんですが、0が渡ってきてます。たぶんgetProperty()自体は問題なさそうで、MODXの基本的な設計が絡んでる気がします。Evoの場合は、syncsiteは特別なフィールドで、ドキュメントのプロパティとして扱われておらず、単純に操作上の便宜を図るためだけのスイッチとして機能してますが、もしかするとRevoもそうかもしれません。Evoでは、内部的には値が存在しませんが、投稿画面の表示上では決め打ちで1がセットされています。
もうひとつのclearCacheは、これはプロパティ自体が存在しない気がします。
ということはsetPropertyまわりのチェックが必要かも?
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 17:10
by yama
分かりました
新規投稿時の画面をよく見ると「更新時にキャッシュ削除」にチェックが入ってません
orz
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 17:58
by neran
orz
それで自分では気になってなかったんでしょうか…。
まあ、内部少し理解できたので、良かったです。
取り敢えず、syncsiteを新規リソース作成時にデフォルトでONにするのは、
formcustomizeでsyncsiteのデフォルト値に"1"を指定でOk。
その為だけにルール設定するのが面倒なら、
OnDocFormRenderフックするプラグインですね。
-
Revoの中身掘っていくのは、取り敢えず
http://api.modx.com/revolution/2.2/ か、
ソース追うのが手っ取り早いでしょうか?
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 18:49
by yama
修正ポイントが分かったので、念のために開発リポジトリの該当ポイントを見てみましたら、
https://github.com/modxcms/revolution/c ... d835fb6e59
マークが24日前に修正してました。
Revoを理解するには、ソースを追跡するのがよいと思います。Evoみたいにgrepで単純に追うことはできませんが、class名などに目が慣れたらあとはツール次第だと思います。
Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件
Posted: 2012年8月18日(土) 19:51
by neran
あ、そういうことですか。
単なるnew時のsyncsite設定漏れだったんですね。
きちんと追わずに返信してました。再度orz。
ソースで、まずはmodelを中心にclass追いかけてみます。