MODX Revutionでリソース新規作成時にプレビュー操作ができない件

質問全般・改善要望
返信する
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by yama »

MODX Revutionでリソースを新規作成時、プレビュー操作ができません。その都度キャッシュをクリアするか空更新すればいいのですが、不便です。
対症療法ですが、プラグインで解決する方法が分かったのでシェアします

コード: 全て選択

if($mode==='new') $modx->cacheManager->refresh();
上記のような一行プラグインを作ってOnDocFormSaveにフックします。
neran
メンバー
メンバー
記事: 22
登録日時: 2009年10月23日(金) 00:47

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by neran »

自分では気にしてなかったけど、確認してみたら、空更新してるお客さんいました。
newResourcePreviewHelper プラグインとして、使わせてもらいます。
ありがとうございます。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 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はどちらも投稿画面内のフィールド)
neran
メンバー
メンバー
記事: 22
登録日時: 2009年10月23日(金) 00:47

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 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' を 真で持たせる、かな…?
意味合いとしてどっちを使うのが適切かは、扱いもうちょっと見てみないと言えないですね。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by yama »

ありがとうございます。
と、今思いついたのですが。このタイミングで値を取得できないから$cacheManager->refresh()を行なうわけですから、ここでgetProperty()を使ってsyncsiteやclearCacheの値を見ようとしていること自体が意味ないですよね。だから、第2引数で指定したfalseしか返ってこない。
キャッシュを無視して、DBにストアされた値を直接参照できるオプションがあるとよいのですが。
neran
メンバー
メンバー
記事: 22
登録日時: 2009年10月23日(金) 00:47

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 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(
  
で、どうでしょうか。

なんかやっぱり制御の全体像が自分で見えてない感じです。
もうちょっと把握続けます。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 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)を見てみるとヒントがありそうな・・
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by yama »

さっそく試してみました。ログに出力するのはかえって面倒なのでfile_put_contentsで・・

コード: 全て選択

[syncsite] => 0
1のはずなんですが、0が渡ってきてます。たぶんgetProperty()自体は問題なさそうで、MODXの基本的な設計が絡んでる気がします。Evoの場合は、syncsiteは特別なフィールドで、ドキュメントのプロパティとして扱われておらず、単純に操作上の便宜を図るためだけのスイッチとして機能してますが、もしかするとRevoもそうかもしれません。Evoでは、内部的には値が存在しませんが、投稿画面の表示上では決め打ちで1がセットされています。
もうひとつのclearCacheは、これはプロパティ自体が存在しない気がします。
ということはsetPropertyまわりのチェックが必要かも?
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by yama »

分かりました

画像

新規投稿時の画面をよく見ると「更新時にキャッシュ削除」にチェックが入ってません




orz
neran
メンバー
メンバー
記事: 22
登録日時: 2009年10月23日(金) 00:47

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by neran »

orz

それで自分では気になってなかったんでしょうか…。
まあ、内部少し理解できたので、良かったです。

取り敢えず、syncsiteを新規リソース作成時にデフォルトでONにするのは、
formcustomizeでsyncsiteのデフォルト値に"1"を指定でOk。
その為だけにルール設定するのが面倒なら、
OnDocFormRenderフックするプラグインですね。

-

Revoの中身掘っていくのは、取り敢えず http://api.modx.com/revolution/2.2/ か、
ソース追うのが手っ取り早いでしょうか?
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by yama »

修正ポイントが分かったので、念のために開発リポジトリの該当ポイントを見てみましたら、

https://github.com/modxcms/revolution/c ... d835fb6e59
マークが24日前に修正してました。

Revoを理解するには、ソースを追跡するのがよいと思います。Evoみたいにgrepで単純に追うことはできませんが、class名などに目が慣れたらあとはツール次第だと思います。
neran
メンバー
メンバー
記事: 22
登録日時: 2009年10月23日(金) 00:47

Re: MODX Revutionでリソース新規作成時にプレビュー操作ができない件

投稿記事 by neran »

あ、そういうことですか。
単なるnew時のsyncsite設定漏れだったんですね。
きちんと追わずに返信してました。再度orz。

ソースで、まずはmodelを中心にclass追いかけてみます。
返信する