2017-03-14 17 views
1

私は自分のPHPプロジェクトでhandsontableプラグインのための自分のレンダラを実装しようとしています。 ので、プラグイン用のparamsのセットはPHPの配列として調製される:配列値をPHPのjavascript関数クロージャとして設定する方法は?

$options = [ 
    'data' => $orders, 
    'columns' => [ 
     [ 
      'data' => 'email', 
      'renderer' => 

// Heredoc goes here 
<<<JAVASCRIPT 
function(value) { 
    console.log(value); 
} 
JAVASCRIPT 

     ], 
     ... 
    ] 
]; 

次に、それを引数としてプラグインに渡されます。

hot = new Handsontable("mydiv", { 
    'data': ..., 
    'columns': [ 
     { 
      'data': 'email', 
      // Here is the problem! 
      'renderer': 'function(value) { \n\r console.log(value) \n\r }' 
     }, 
     ... 
    ] 
}); 

$this->registerJs('hot = new Handsontable("mydiv", ' . json_encode($options) . ')'); 

HTMLをレンダリングするときに、私はこれを見ます

問題は、この関数をクロージャとして渡すことができず、引用符で囲まれたテキストとしてのみです。

可能ですか?

+1

here-docは常に文字列です。 JSONで関数をエンコードする方法はありません。 – Barmar

+0

@Barmarは関数を前に定義し、その名前をparamとして渡すべきですか? – dearmisterrobot

+1

そういうものがありますが、 'json_encode()'でそれを得る簡単な方法はありません。 'registerJs()'に複数のステートメントを置くことはできますか? – Barmar

答えて

2

JSONで関数をエンコードすることはできません。行うべきことは、オブジェクトを変数に代入することで、関数をJavascriptの別のステップとして追加することができます。

$options = [ 
    'data' => $orders, 
    'columns' => [ 
     [ 
      'data' => 'email' 
     ], 
     ... 
    ] 
]; 

$jsFunc = <<<JAVASCRIPT 
function(value) { 
    console.log(value); 
} 
JAVASCRIPT; 

$this->registerJs('var options = ' . json_encode($options) '; options.columns[0].renderer = ' . $jsFunc . '; hot = new Handsontable("mydiv", options);'); 
関連する問題