0

私はMVCセットアップを使用しており、ビュー(.php)にJavaScriptを挿入しようとしていますが、ビューがアクセスできるすべての変数へのJavaScriptアクセスを許可しています。私の最終的な目標は、JavaScriptからPHP変数にアクセスできるようにすることです(たとえばalert()、製品の名前を取得できるようにするため)。

これが私のアプリケーションフローです:

  1. 出力バッファを開始します
  2. 連想配列でextract()を呼び出します(これには私のビューのデータが含まれています)
  3. ビューファイルでrequireを呼び出す
  4. 出力バッファの内容を返し、バッファをクリアします
  5. エコーバッファ

私は次のような関数を持ってinjectJS()います:

function injectJS($jsFile) {
 require APP_DIR . $jsFile;
}

これが私が注入したいJavascript(alert.js)のサンプルです:

 <script type="text/javascript">
     alert("product name: <?php echo $product['name']; ?>");
 </script>

したがって、ビューファイル内で。を呼び出しますinjectJS('alert.js');。JavaScriptを挿入し$productますが、ビューをレンダリングすると、未定義の変数があるというPHPの通知が表示されます。しかし、私requireが手でステートメントを書くと、すべてがうまくいきます。使用して達成しようとしていることはinjectJS()可能ですか?

編集
私は変数を明示的にに渡そうとしたことを言及するのを忘れましたinjectJS()、そしてそれは機能します、しかし私は常に変数を渡す必要はありません。ビューが多くの変数をJSに渡す必要がある場合、面倒で面倒になる可能性があります。(関数内で)呼び出しを担当するスクリプトのスコープ内で変数を取得する方法はありますinjectJS()か?

編集2考え直し
てみると、変数を再度渡すことは実際の問題ではありません。私はただ貪欲/怠惰であると思います;)。必要に応じて変数を渡しますinjectJS()。回答ありがとうございます

4

3 に答える 3

2

$ productを関数に渡すと、関数本体内に表示されるか、次の内部で定義されます。

function globalJs( $filename, $product ) {
    include $filename;
}

globalJs( 'foo.js', array( 'name' => 'test' ) );
于 2009-09-22T03:59:00.753 に答える
2

PHPでは、パラメーターとして渡されるか、として宣言されない限り、変数は関数内に表示されませんglobal

あなたが抱えていると思われる問題は、$product変数がinjectJS関数内に存在しないことです。その関数の外部で作成されたグローバル変数の場合は、パラメーターとして渡すか、関数の先頭でグローバルとして宣言する必要があります。

function injectJS($jsFile) {
    global $product;
    require APP_DIR . $jsFile;
}

詳細については、マニュアルの「変数スコープ」セクション、より具体的には、グローバルキーワードに関するサブセクションを参照してください。

于 2009-09-22T03:59:33.077 に答える
1

これは問題なく機能しますが、スコープの問題は、関数に変数が存在しないことが原因です。これを試して:

function injectJS($jsFile) {
    $product = array('name' => 'test');
    require APP_DIR . $jsFile;
}

ある時点で、関数のスコープで変数を定義する必要があります。PHPglobalキーワードを使用すると、変数がグローバルに存在する場合にこれを実行できます。ただし、グローバルの使用は避けてください。これは、将来的に問題が発生する可能性があるためです。

于 2009-09-22T04:00:56.303 に答える