テンプレート変数で@SELECTを使用した際の挙動について

質問全般・改善要望
返信する
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

-----
ご利用のサーバ:さくらインターネット さくらのレンタルサーバ ビジネス
MODXのバージョン:1.0.7J-r1
PHPのバージョン:5.2.17
MySQLのバージョン:5.5.28-log
ブラウザ:Chrome、Firefox
-----

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

1.0.6J-r7から1.0.7J-r1にアップデートしたところ、テンプレート変数の「入力時のオプション」で、下記のように@SELECTを用いて値を取得していたのができなくなりました。

@SELECT pagetitle FROM modx_site_content WHERE parent='63' ORDER BY pagetitle

要するに、親リソース63に属するリソースのpagetitleをタグのように使っているわけですが、同様のテンプレート変数を多用しています。

@SELECTを使えるようにご対応いただくか、別の方法を教えていただけますと、非常にありがたいです。

なお現在は、1.0.6J-r7に戻して対応しています。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

1.0.6J-r8で生じた不具合のようです。後ほど修正パッチを作成しますので、もしよければお試しいただけますでしょうか。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

tmplvars.inc.zip
(3.83 KiB) ダウンロード数: 476 回
パッチできました。添付のファイルを解凍してmanager/includes/ディレクトリに上書きしてみていただけますでしょうか
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

いつも早急にご対応いただき、ありがとうございます。

パッチの件、週明け以降に試して、ご報告したいと思います。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

パッチを試してみました。

@SELECTを用いたテンプレート変数で、値を取得できているのを確認できました。

しかし、

[[Ditto? &parents=`[*parent*]` &hideFolders=`1` &depth=`2` &filter=`hoge1,Yes,2` &extenders=`tagging` &tagData=`hoge2` &tags=`[*@SELECTを用いたテンプレート変数*] ` &tagDelimiter=`,` &sortDir=`DESC` &sortBy=`hoge3` &tpl=`hoge4` &noResults=`hoge5`]]

と、スニペットコールしたところ、1.0.6J-r7 までと動作が異なり、意図した数のリソースが取得されません。

また、@SELECTの件とは関係ないと思うのですが、1.0.7J-r1にするとサイト全体の表示速度が重くなってしまい、500エラーも出るようになってしまいました。

PHPなどの知識がなく、原因は分からないのですが、下記のようなエラーが多数出ていました。

イベントID 0
ソース Snippet - Ditto
日付 2013/01/07 16:07:14
Undefined index: a
« MODX Parse Error »
MODX encountered the following error while attempting to parse the requested resource:
« PHP Parse Error »
PHP error debug
Error : getimagesize() [function.getimagesize]: Filename cannot be empty
ErrorType[num] : WARNING[2]
File : /home/******/www/assets/plugins/phx/phx.parser.class.inc.php(467) : eval()'d code
Line : 2
Basic info
REQUEST_URI : ********************************
Resource : [2276]**************
Current Snippet : Ditto
Current Plugin : phx(OnParseDocument)
Referer : *********************
User Agent : Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0
IP : **************
Parser timing
MySQL : 4.6900 s (280 Requests)
PHP : 0.7137 s
Total : 5.4037 s

Backtrace

1 executeParser() index.php on line 135
2 prepareResponse() manager/includes/document.parser.class.inc.php on line 294
3 parseDocumentSource() manager/includes/document.parser.class.inc.php on line 404
4 invokeEvent() manager/includes/document.parser.class.inc.php on line 1961
5 evalPlugin() manager/includes/document.parser.class.inc.php on line 3576
6 eval() manager/includes/document.parser.class.inc.php on line 1483
7 OnParseDocument() manager/includes/document.parser.class.inc.php(1483) : eval()'d code on line 24
8 Parse() assets/plugins/phx/phx.parser.class.inc.php on line 47
9 ParseValues() assets/plugins/phx/phx.parser.class.inc.php on line 65
10 ParseValues() assets/plugins/phx/phx.parser.class.inc.php on line 212
11 evalSnippets() assets/plugins/phx/phx.parser.class.inc.php on line 140
12 _get_snip_result() manager/includes/document.parser.class.inc.php on line 1594
13 evalSnippet() manager/includes/document.parser.class.inc.php on line 1678
14 eval() manager/includes/document.parser.class.inc.php on line 1525
15 render() manager/includes/document.parser.class.inc.php(1525) : eval()'d code on line 1075
16 output() assets/snippets/ditto/classes/ditto.class.inc.php on line 335
17 Parse() assets/snippets/ditto/classes/phx.pre.class.inc.php on line 41
18 ParseValues() assets/plugins/phx/phx.parser.class.inc.php on line 65
19 Filter() assets/plugins/phx/phx.parser.class.inc.php on line 196
20 eval() assets/plugins/phx/phx.parser.class.inc.php on line 467
21 getimagesize() assets/plugins/phx/phx.parser.class.inc.php(467) : eval()'d code on line 2

Dittoが原因なのでしょうか?Dittoのスニペットコールを書き換えればいいのでしょうか?

@SELECTの件とは外れてしまいますが、こちらについても教えていただけますと本当に助かります。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

PHxプラグインをお使いと思いますが、PHxプラグインのバージョンは分かりますか?

assets/plugins/phx/phx.parser.class.inc.php
または、上記のファイルを添付いただければ直接見てみます。PHxプラグインでは使われていないはずの関数が呼ばれているようなので、添付いただくほうが確実かもしれません。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

PHxのバージョンは2.1.5です。

assets/plugins/phx/phx.parser.class.inc.php
のファイルも添付いたします。

どうぞよろしくお願いいたします。
添付ファイル
phx.parser.class.inc.zip
(5.56 KiB) ダウンロード数: 414 回
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

なるほどカスタムモディファイアが呼ばれているみたいですね。スニペットコール内には特に記述がないみたいですが。

管理画面の「ツール」→「バックアップ・リストア」→「バックアップ」でmodx_manager_logとmodx_event_log以外のテーブルに全てチェックを入れてSQLダンプをダウンロードし、テキストエディタで開いて「getimagesize」という文字列が含まれる行の内容を教えていただけますでしょうか。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

「getimagesize」という文字列が含まれる行の内容は、つぎの通りです。

INSERT INTO `modx_site_snippets` VALUES ('40','phx:height','テンプレート変数 image の height を取得','0','26','0','\nlist($width, $height, $type, $attr) = getimagesize($output);\nreturn $height;\n','0','',' ');

INSERT INTO `modx_site_snippets` VALUES ('39','phx:width','テンプレート変数 image の width を取得','0','26','0','\nlist($width, $height,$type,$attr) = getimagesize($output);\nreturn $width;\n','0','',' ');

私もすっかり忘れていたのですが、以前、「phx:height」と「phx:width」というスニペットを作っていたようです。
現在は使っていないのですが、まだ残っています。

「phx:height」
<?php
list($width, $height, $type, $attr) = getimagesize($output);
return $height;
?>

「phx:width」
<?php
list($width, $height,$type,$attr) = getimagesize($output);
return $width;
?>
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

デバッグログの処理の流れを見ると、Phxプラグインの処理内でDittoが呼び出されているみたいです。
先ほどダウンロードしたSQLダンプを今度は「:width」と「:height」で検索して該当行の内容を教えていただけますでしょうか。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

「:width」と「:height」で検索して該当行を抜き出してみました。
添付ファイルをご参照ください。

お忙しいところ恐れ入りますが、どうぞよろしくお願いいたします。
添付ファイル
「width」「height」.zip
(3.86 KiB) ダウンロード数: 422 回
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

photoLeft1などの名前のチャンク・テンプレート変数があるようですね。現在は使ってないとのことですが、どこかで呼び出されている気がします。

コード: 全て選択

if(empty($output)) return;
phx:width・phx:heightスニペットの先頭に上記の行を挿入すると状態は変わるでしょうか?

PHxプラグインでif文を利用していない場合は、コア内蔵のPHx機能を使うほうが副作用が起きにくいです。PHxプラグインを無効にすると自動的にコアの機能が有効になります。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

yama さんが書きました:現在は使ってないとのことですが、どこかで呼び出されている気がします
使っていないつもりでしたが、私の思い違いなのかもしれませんね。

現在、本番環境しかなく、再度1.0.7J-r1にして検証、万一トラブルが発生した際の処理をするのには、申し訳ないのですが今日は時間がありません。

後日、本番環境またはテスト環境を作って、1.0.7J-r1にアップデートして、新しいコードを追加して試してみて、結果をご報告します。

ちなみに、現在の1.0.6J-r7に新しいコードを挿入してみましたが、特に変化はないようです。
yama さんが書きました:PHxプラグインでif文を利用していない場合は、コア内蔵のPHx機能を使うほうが副作用が起きにくいです。PHxプラグインを無効にすると自動的にコアの機能が有効になります。
実は、PHxプラグインでif文を使用しています。以前から、if文を使用するのをやめることも検討しているのですが…。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

phx:width・phx:heightスニペットをリネームして一時的に無効にしてみて、変化があるかどうかでも切り分けできると思います。
document.parser.class.inc.zip
(29.05 KiB) ダウンロード数: 466 回
それとログの情報をもう少し具体的に出せるように修正を加えてみました。
上記のファイルを解凍してmanager/includes/ディレクトリに上書きしてみて、エラーログの内容を教えていただければ何か分かるかもしれません。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

アドバイスや新しいファイルをいただき、本当にありがとうございます。

ただ今、http://modx.jp/docs/admin/move.html を参考に、本番環境のサーバから別サーバに、ファイル一式やSQLバックアップデータを移して、テスト環境を構築中です。

テスト環境が構築できましたら、これまでいただいたアドバイスやファイルを活かしてテストしてみます。
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

ご報告が遅くなってしまい、申し訳ありません。

下記の条件で、テスト環境を作って試してみました。
また、Evoのバージョンは1.0.8Jにしました。

サーバ:さくらのマネージドサーバ Atomプラン
PHPのバージョン:5.2.17
MySQLのバージョン:5.1.41
ブラウザ:Chrome

テンプレート変数の「入力時のオプション」で、@SELECTを用いて値を取得できなかった件は、
http://forum.modx.jp/viewtopic.php?f=32&t=1045#p5875
のパッチを適用したら、値が取得できるようになりました。

また、
http://forum.modx.jp/viewtopic.php?f=32 ... t=10#p5895
も、manager/includes/ディレクトリに上書きしました。

今回のテスト環境では、
「PHxプラグインを有効(内蔵PHxを無効)」
「phx:width・phx:heightスニペット有効(if(empty($output)) return;を挿入、http://forum.modx.jp/viewtopic.php?f=32 ... t=10#p5893)」
の状態で、一部を除き、問題なくページが表示されるようになりました。

しかし、
http://forum.modx.jp/viewtopic.php?f=32&t=1045#p5886
で触れたように、Dittoの挙動に問題があるようです。

【問題1】

[[Ditto? &parents=`[*parent*]` &hideFolders=`1` &depth=`2` &filter=`hoge1,Yes,2` &extenders=`tagging` &tagData=`hoge2` &tags=`hoge3` &tagDelimiter=`,` &sortDir=`DESC` &sortBy=`hoge4` &tpl=`hoge5` &noResults=`hoge6`]]

上記のスニペットコールを使用して、hoge2の中に値が複数ある場合、意図した数のリソースが取得・表示できないのです。

(例)
リソースA→テンプレート変数hoge2の内容=hoge3→取得・表示できる。
リソースB→テンプレート変数hoge2の内容=hoge3,dataA,dataB,dataC…→取得・取得できない。

また、上記のスニペットコールを複数使用したページでは、以下のようなエラーメッセージがブラウザに出て、ページが表示されません。

Fatal error: Maximum execution time of 30 seconds exceeded in /home/sakurahiroshi/www/assets/snippets/ditto/classes/ditto.class.inc.php on line 824

または、

Fatal error: Maximum execution time of 30 seconds exceeded in /home/sakurahiroshi/www/assets/snippets/ditto/classes/ditto.class.inc.php on line 137


【問題2】

[[Ditto? &parents=`hoge1` &hideFolders=`1` &depth=`4` &extenders=`tagging` &tagData=`hoge2` &tags=`hoge3` &tagDelimiter=`,` &tpl=`hoge4` &noResults=`hoge5`]]

上記のスニペットコールで、1.0.6J-r7までは「hoge2にhoge3を含むリソース」が呼び出されていましたが、「hoge2にhoge3を含まないリソース」が呼び出されてしまいます。

※【問題1】【問題2】とも、管理画面のレポート→イベントログにはレコードはありません。

脆弱性の問題などもあり、お忙しいかと思いますが、対処法などを教えていただけますと、本当にありがたいです。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by yama »

了解です。こちらで同等の状況を作って試してみます。(リソース数はいくつくらい作るとよいでしょうか?)
hirostraydog
メンバー
メンバー
記事: 25
登録日時: 2012年9月05日(水) 13:25

Re: テンプレート変数で@SELECTを使用した際の挙動について

投稿記事 by hirostraydog »

早速のご対応、本当にありがとうございます。
yama さんが書きました:(リソース数はいくつくらい作るとよいでしょうか?)
当方のサイトを具体的に説明します。

◆「ブランド紹介ページ」(約200件)と「ショップ紹介ページ」(約1000件?)を掲載。
◆「ショップ紹介ページ」には「取扱ブランド」をテンプレート変数で入力。
◆上記テンプレート変数は「ブランド紹介ページ」のpagetitleを@SELECTで値を取得して、そのショップの「取扱ブランド」にチェックを入れる。
◆複数のブランドを取り扱っているショップが多数存在する。

「あるブランドの取扱ショップを都道府県別に一覧表示する」といった処理を、上記のDittoでおこなっています。

…といったところなのですが、ご参考になるでしょうか?
hirostraydog さんが書きました:リソースA→テンプレート変数hoge2の内容=hoge3→取得・表示できる。
リソースB→テンプレート変数hoge2の内容=hoge3,dataA,dataB,dataC…→取得・取得できない。
という状況は、「ある県内にあるブランドAの取扱ショップを一覧表示する」ページで発生しています。

また、
hirostraydog さんが書きました:上記のスニペットコールを複数使用したページでは、以下のようなエラーメッセージがブラウザに出て、ページが表示されません。
という状況は、「ブランドAの取扱ショップを都道府県別に一覧表示する」ページで発生しています。
このページには、都道府県別に計47のDittoスニペットコールを書いています。

また何かご不明な点がございましたら、ご連絡ください。

お手数おかけいたしますが、どうぞよろしくお願いいたします。
返信する