0

PHP 5.3.5 で CakePHP 2.1.2 を使用しており、通常は正常に動作する「Cakemenu」というプラグインを使用しています。プラグインはメニューを db テーブルに保存し、メニュー リンクは次のようなテキストとして保存されます。

array('plugin'=>null,'controller'=>'assets','action'=>'index');

プラグインのヘルパーはこれらの値を取得し、次のコードを実行してそのテキストを配列に変換します。

    //Try to evaluate the link (if starts with array)
    if (eregi('^array', $value['Menu']['link'])) {
      $code = "\$parse = " . $value['Menu']['link'] . ";";
      $result = eval($code);
      if (is_array($parse)) {
        $value['Menu']['link'] = $parse;
      }
    }

CakePHP がエラーを処理していない限り、すべて正常に動作します。たとえば、ブラウザでコントローラーの名前を間違えると、メニューが表示され、コントローラーが見つからないというメッセージが表示されます。代わりに、eval ステートメントのある行を指すページいっぱいの「解析エラー: 構文エラー、予期しない $end in...」というメッセージが表示されます。評価されている変数を出力すると、通常はエンコードされていない Html エンティティで (誤って) エンコードされていることがわかります。

評価するのに適した文字列:

 $parse = array('plugin'=>null,'controller'=>'assets','action'=>'index');

評価する文字列が正しくありません:

 $parse = array('plugin'=>null,'controller'=>'Parts','action'=>'add');

問題を一時的に修正するために、問題のある文字を置き換えるだけの 2 つのステートメントを追加しました

    $value['Menu']['link'] = str_replace( ''','\'',$value['Menu']['link']);
    $value['Menu']['link'] = str_replace( '>','>',$value['Menu']['link']);

そして、すべてが再びうまく機能します。役立つ可能性があるその他の情報として、メニューの生成に使用されるデータの配列がアプリの beforeFilter で読み取られ、ビュー変数に保存されてから、メニューがビューの要素として生成されることが挙げられます。

このエラーにより、CakePHP (または PHP) がロードまたは構成プロセスをスキップし、文字列が誤って処理されると考えています。助けていただければ幸いです、ありがとう

4

1 に答える 1

0

メソッドはエラーページでは実行されませbeforeFilter()ん。エラーを自分で処理し、手動でを呼び出す必要がありますbeforeFilter()カスタムエラーページの使用方法に関するブログ投稿を書きました。コントローラーのコールバックセクションに細心の注意を払ってください。

于 2012-08-02T20:12:34.120 に答える