Reflectがcreatedon以外受け付けない?  【解決済み】

質問全般・改善要望
返信する
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Reflectがcreatedon以外受け付けない?

投稿記事 by kazuike »

Reflectを使う際、
dateSourceパラメータに、createdon以外を指定すると全部1970年1月になってしまいます。
dateSourceパラメータを省略した場合と、dateSourceパラメータにcreatedonを指定した場合は正常に動きます。
dateSourceパラメータにeditedonやpub_dateを指定するとダメです。

最初はconfigやら色々指定していましたが、動かないので、以下のような状態までそぎ落としたんですが…

コード: 全て選択

[!Ditto? &dateSource=`editedon` &language=`japanese-utf8` &extenders=`dateFilter` &id=`topics`!]
[!Reflect? &dateSource=`editedon` &getDocuments=`1` &id=`topics`!]
もちろん、editedonもpub_dateも値は入ってます。

何か、心当たりあるかた、どんなことでも結構ですので、情報お待ちしてます。

環境は
modx1.0.2J
PHP5.1.6


0.9.6.3では多数動かしてましたが、もしかしたらEvoではReflect使うの始めてかも?
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: Reflectがcreatedon以外受け付けない?

投稿記事 by kazuike »

続報です。
テンプレート、チャンク、ドキュメント一式全く同じもの(テンプレートID、チャンクID、ドキュメントID…もすべて同じ)が、
modx0.9.6.3では、正常に動きました。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: Reflectがcreatedon以外受け付けない?

投稿記事 by kazuike »

さらに続報です。

試しに、スニペット「Reflect」のソース280~288行目の以下の箇所

コード: 全て選択

    $reflectParameters = array('reflect_base','config','id','getDocuments','showItems','groupByYears','targetID','yearSortDir','monthSortDir','start','phx','tplContainer','tplYear','tplMonth','tplMonthInner','tplItem','save');
    $params =& $modx->event->params;
    if(is_array($params)) {
        foreach ($params as $param=>$value) {
            if (!in_array($param,$reflectParameters) && substr($param,-3) != 'tpl') {
                $dParams[$param] = $value;
            }
        }
    }
を、
以前のmodx0.9.6.3の時代に同梱されていた以下のコード

コード: 全て選択

	$allParameters = func_get_args();
	$reflectParameters = array('reflect_base','config','id','getDocuments','showItems','groupByYears','targetID','yearSortDir','monthSortDir','start','phx','tplContainer','tplYear','tplMonth','tplMonthInner','tplItem','save');
	foreach ($allParameters[1] as $param=>$value) {
		if (!in_array($param,$reflectParameters) && substr($param,-3) != 'tpl') {
			$dParams[$param] = $value;
		}
	}
に置き換えると、正常に動きました。
まだ、ここの意味はよくわかっていませんが。


どちらもバージョン2.1.0?
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: Reflectがcreatedon以外受け付けない?

投稿記事 by kazuike »

さらに続報です。
Reflectは「$modx->event->params」をパラメータの取得に使おうとしていますが、
「$modx->event」をvar_dumpでダンプすると以下のように空です。

コード: 全て選択

object(SystemEvent)#3 (6) {
  ["name"]=>
  string(0) ""
  ["_propagate"]=>
  bool(true)
  ["_output"]=>
  string(0) ""
  ["activated"]=>
  bool(false)
  ["activePlugin"]=>
  NULL
  ["params"]=>
  &NULL
}
で、この「$modx->event」を、同じように使っているスニペットを探してみたのですが、
Reflect以外にはなさそうです。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: Reflectがcreatedon以外受け付けない?

投稿記事 by kazuike »

とりあえず、原因らしきものを発見しました。
(これは、Reflectだけではなく、他でも起こる可能性が高いかもしれません)

スニペット「Reflect」の252行目

コード: 全て選択

	    $params = $dittoSnippetParameters;
の箇所です。

「manager/includes/document.parser.class.inc.php」の「evalSnippet」では、

コード: 全て選択

    function evalSnippet($snippet, $params) {
        $etomite= $modx= & $this;

        $modx->event->params= & $params; // store params inside event object
:
        $snip= eval ($snippet);
のように、
「$modx->event->params」を「$params」のリファレンスとしています。

ところが、「Reflect」では、「$params」に「$dittoSnippetParameters」の値を代入してしまっています。
なので、「$modx->event->params」が壊れてしまっています。

おそらく、Reflect側は、「$params」をローカル変数として使っているのでしょうが、
意図せず、変数名がかぶってしまっていたのでしょうね。

今は「Reflect」だけの問題かもしれませんが、
今後、同様な間違いが起こる危険性は高いように思います。

根本的な解決としては、
「manager/includes/document.parser.class.inc.php」の
「evalSnippet」や「evalPlugin」側で、paramsはぜひ代入にしていただきたいですね。
(paramsをリファレンスにする必要性は感じられないので)

とりあえずは、Reflectの「$params」を別の変数名に置き換えれば、回避できそうですが。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: Reflectがcreatedon以外受け付けない?  【解決済み】

投稿記事 by kazuike »

具体的には、以下の方法で解決しました。

スニペット「Reflect」の252~261行目

コード: 全て選択

    $params = $dittoSnippetParameters;
        // TODO: Remove after 3.0
        
    if (isset($params)) {
        $givenParams = explode("|",$params);
        foreach ($givenParams as $parameter) {
            $p = explode(":",$parameter);
            $dParams[$p[0]] = $p[1];
        }
    }
を以下のように変更(変数名「dtparams」は他でも構わないです)

コード: 全て選択

    $dtparams = $dittoSnippetParameters;	// $params -> $dtparams
        // TODO: Remove after 3.0
        
    if (isset($dtparams)) {
        $givenParams = explode("|",$dtparams);
        foreach ($givenParams as $parameter) {
            $p = explode(":",$parameter);
            $dParams[$p[0]] = $p[1];
        }
    }
もっと簡単なのは、「&dittoSnippetParameters=`********`」で指定する方法ですが、
これは廃止すると宣言されているので、使わない方が良いですね。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
返信する