とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…  【解決済み】

質問全般・改善要望
Kenny
メンバー
メンバー
記事: 175
登録日時: 2011年5月28日(土) 13:41

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by Kenny » 2018年7月20日(金) 16:27

MODXバージョン 1.0.20J
PHPのバージョン 7.1.14
MySQLのバージョン 5.6.23-log

お世話になります。

とあるサイトをPHP5.6からPHP7.1に変更したところ以下のようなメッセージが編集ページの一番下に出てきて、編集画面のマルチテキストやリッチテキストが正常に出てこなくなってしまいました。

Parse error: syntax error, unexpected end of file in ~~~~~~~/assets/plugins/managermanager/widgets/ddmultiplefields/ddmultiplefields.php(44) : eval()'d code on line 1

このような場合、どのように対処すればよろしいでしょうか。
どうぞよろしくお願いいたします。
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by mod_kks » 2018年7月23日(月) 11:48

PHP7以降、eval()に渡される文字列(コード)でパースエラーが発生した場合、ParseError例外をスローするとのことなので、
columnsDataパラメタで渡す文字列に問題があるようなんですが、「ddmultiplefields.php」の以下の部分

コード: 全て選択

$eval = @eval($value);
$columnsData[] = $eval ? addslashes(json_encode($eval)) : $value;

Evolution CMSでは以下ような処理になっています。

コード: 全て選択

try {
    $eval = eval($value);
} catch (Throwable $t) {
    echo $t->getMessage(), "\n";
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}
$columnsData[] = $eval ? addslashes(json_encode($eval)) : addslashes($value);

とりあえず上記のように書き換えるとcatch文の中身がエラーの代わりに出力されるようになるので、エラー自体は回避できます。
catch文の中のechoを塞げば表面上何もなく処理できるようです。あまりスッキリはしませんが・・・。

columnsDataパラメタの最後にセミコロンを追加すれば一応evalは通るのですが、PHPコードでない場合
セミコロンを再度削除して・・・

コード: 全て選択

$columnsData[] = $eval ? addslashes(json_encode($eval)) : addslashes(rtrim($value, ';'));

みたいな動作が必要だったりするので、悩ましい所です。
Kenny
メンバー
メンバー
記事: 175
登録日時: 2011年5月28日(土) 13:41

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by Kenny » 2018年7月25日(水) 07:07

mod_kks様

詳細なアドバイスありがとうございます!

コードを変えてやってみたのですが、やはり同じ状況のままで、マルチテキストとTinyMCEのところが使えません。

将来、PHP5.6が使えなくなった場合が怖くて。。
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by mod_kks » 2018年7月26日(木) 02:50

そうですか。
mm_ddMultipleFieldsを設定していると思われますが、columnsDataパラメタ(第13引数)の内容はどんな感じでしょうか。
差し支えなければ参考までに教えていただけませんか。
Kenny
メンバー
メンバー
記事: 175
登録日時: 2011年5月28日(土) 13:41

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by Kenny » 2018年7月26日(木) 06:36

mod_kks様

ありがとうございます。

例えば、mm_rulesのところで
とあるテンプレート変数は以下のようにセッティングしてあります。

mm_ddMultipleFields('流れるバナー_マルチ', '', '112,440,438', 'text,field,text', 'リンクURL,バナー画像のURL,alt', '200,200,200', '||', '::', 300, 100, 0, 150, '');
mm_ddMultipleFields('流れるバナー', '', '334', 'text,field,text', 'リンクURL,バナー画像のURL,alt', '200,200,200', '||', '::', 300, 100, 0, 150, '');

もちろんこれだけではなく、他のマルチテキストも全部使えない状況です。

一応画像もキャプチャしてみました

PHP5.6の場合~~~~~~~~~~~~~~~~~~
マルチテキスト
http://imgur.com/idMBu97
TinyMCE
http://imgur.com/l3VfUb3


PHP7.1の場合~~~~~~~~~~~~~~~~~~
マルチテキスト
http://imgur.com/v89mpuM
TinyMCE
http://imgur.com/IS8JjCa
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by mod_kks » 2018年7月26日(木) 10:35

ご教示いただきましてありがとうございます。
気になる点ではキャプチャにある「グリッドcontents」のmm_rules設定ですかね。
これはどんな感じの設定になっていますでしょうか。
Kenny
メンバー
メンバー
記事: 175
登録日時: 2011年5月28日(土) 13:41

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by Kenny » 2018年7月26日(木) 10:48

mod_kks様

有難うございます。
「グリッドcontents」のmm_rules設定は、以下のようになっています。

mm_ddMultipleFields('グリッドcontents', '', '112,440', 'text,textarea,textarea,field,text,text,text,text,text,select', '段目,タイトル,内容,画像,画像のALT,画像の寄せ,文字の色,枠線の色,背景の色,ボックスの横幅(%)', '40,150,220,100,100,50,50,50,50,50,50', '||', '::', 300, 100, 0, 150, $coloumnsData='||||||||||||||||||[[10],[20],[25],[30],[33],[40],[50],[60],[66],[70],[80],[90],[100]]');
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by mod_kks » 2018年7月26日(木) 15:15

なるほど。ありがとうございます。
流れるバナー_マルチ、流れるバナー、グリッドcontentsの3つの設定を参考に検証してみました。

とりあえず先日のddmultiplefields.phpの以下の部分を

コード: 全て選択

foreach ($columnsDataTemp as $value){
  $eval = @eval($value);
  $columnsData[] = $eval ? addslashes(json_encode($eval)) : $value;
}

以下のように変更して

コード: 全て選択

foreach ($columnsDataTemp as $value){
  try {
    $eval = eval($value);
  } catch (Throwable $t) {
    echo $t->getMessage(), "\n";
  } catch (Exception $e) {
    echo $e->getMessage(), "\n";
  }
  $columnsData[] = $eval ? addslashes(json_encode($eval)) : addslashes($value);
}

3つのテンプレート変数設定を当てはめて確認してみましたところ、ページ下部にはメッセージが出力されますが、
一応PHP5.6と同じように動作しました。

eval()にかけられる対象は、グリッドcontentsでは'||||||||||||||||||[[10],[20],[25],[30],[33],[40],[50],[60],[66],[70],[80],[90],[100]]'で
他はデフォルトと同じく空です。
この文字列は「||」で配列に分離され一つずつeval()に通されます。グリッドcontentsは、前8つ分は文字列なしで$evalはfalseとなりますが、
元のコードで最後の文字列を通すとPHP7以降は不正なコードとなりsyntax error, unexpected end of file のエラーが出ます。

上記のEvolution CMS方式ではエラーとなる場合eval()を回避する方法で、ページ下部にメッセージが出力されますが、eval()自体は
catch文で回避しているので$columnsDataにはaddslashes($value)が適用されるという感じです。

教示いただいた3つに関してはとりあえず上部の方法で通りましたが、他にもmm_rulesで「columnsData」パラメタを設定しているものがあれば、
その内容によって躓いているのかもしれません。
Kenny
メンバー
メンバー
記事: 175
登録日時: 2011年5月28日(土) 13:41

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by Kenny » 2018年7月28日(土) 08:56

mod_kks様

検証して戴き、本当にありがとうございます。。
確かに、mm_rulesの「グリッドcontents」の部分をコメントアウトしてみると、他のマルチテキスト、TinyMCEが戻りました!

ただ、ご教授いただきました、ddmultiplefields.phpのコードを変更して、mm_rulesの「グリッドcontents」の部分を復活させてみると、症状は同じで、TinyMCE、他のマルチテキスト全部が作動しなくなってしまいました。

エラーもこのような形です
Parse error: syntax error, unexpected end of file in ~~/assets/plugins/managermanager/widgets/ddmultiplefields/ddmultiplefields.php(44) : eval()'d code on line 1
mod_kks
メンバー
メンバー
記事: 22
登録日時: 2017年11月04日(土) 01:31

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…  【解決済み】

投稿記事by mod_kks » 2018年7月28日(土) 23:36

グリッドcontentsの「columnsData」パラメタに由来するエラーなのは間違いなさそうな感じですが、
私の検証環境では前回の内容で普通に通ってしまっているので困りましたね。

では、一旦ddmultiplefields.phpをデフォルトに戻して視点を変えてみましょう。
eval()の仕様に合わせた形でmm_rulesのグリッドcontentsの設定を変更してみましょうか。

コード: 全て選択

mm_ddMultipleFields(
  'グリッドcontents',
  '',
  '112,440',
  'text,textarea,textarea,field,text,text,text,text,text,select',
  '段目,タイトル,内容,画像,画像のALT,画像の寄せ,文字の色,枠線の色,背景の色,ボックスの横幅(%)',
  '40,150,220,100,100,50,50,50,50,50,50',
  '||',
  '::',
  300,
  100,
  0,
  150,
  '||||||||||||||||||return [[10],[20],[25],[30],[33],[40],[50],[60],[66],[70],[80],[90],[100]];'
);

こんな感じで最後の「columnsData」パラメタを書き換えてみた場合はどうなりますか?
Kenny
メンバー
メンバー
記事: 175
登録日時: 2011年5月28日(土) 13:41

とあるサイトをPHP5.6からPHP7.1に変更したところ編集画面のマルチテキストやリッチテキストが正常に作動しなく…

投稿記事by Kenny » 2018年7月29日(日) 08:14

mod_kks様

ありがとうございます!
見事に治りました!
mm_rulesのセッティングで、TinyMCEやほかのマルチテキストも影響をうけてしまうのですね。
本当に助かりました!
この問題をずーっと(1年以上)抱えておりまして、とりあえずPHP5.6で動いていましたので、もやもやしながらも、やってまいりました。
これと同様のつくりのサイトがいくつもありますので、一気にもやもやが解消されそうです。(笑)