web-dev-qa-db-ja.com

drupal_to_js()と無名関数

flot module を使用して、Drupalでいくつかのグラフを作成しています。一般的に、それはかなりうまく機能しています。しかし、より一般的な問題に遭遇しました。

ほとんどの場合に機能する設定配列を定義していますが、一部のフロート設定では匿名関数を使用できます。

_  xaxis: {
    transform: function (v) { return Math.log(v); },
    inverseTransform: function (v) { return Math.exp(v); }
  }
_

これをPHPにエンコードして、正しく出力されるようにするにはどうすればよいですか?)flotモジュールは drupal_to_js() を使用しており、それを置くことができません。引用符の外PHPはそれを解釈しようとします。引用符の中に入れると、文字列として扱われます。

私のグーグルから、それは json_encode() のように見えますが、これもサポートしていません。

もう少し説明:drupal_to_js()はPHP構造体を受け取り、それをJavaScriptに置き換えます。

_  $top = array(
    'a_string' => 'A string will convert fine',
    'a_number' => 123 // as will a number,
    'an_array' => array('a' => 'nested arrays work fine too'),
  );
_

これは次のように置き換えられます

_ [ a_string: 'A string will convert fine', a_number: 123 ...
_

関数を転置したい。次のコードでは、文字列'function (v) { return Math.log(v); }'が返されます。

_  $top = array(
    'a_string' => 'function (v) { return Math.log(v); }',
  );
_

次のコードを実行すると、PHP解析エラーが表示されます(あるはずです)。

_  $top = array(
    'a_string' => function (v) { return Math.log(v); },
  );
_

文字列内のテキストをJavaScriptリテラルとして使用したいのですが、実行できないと思います。

誰かがこれを回避する良い方法を見つけましたか?未加工のJavaScriptを出力することもできますが、その場合、多くの機能が失われます。

4
Jeremy French

このガイドは回避策として使用できます http://echodittolabs.org/blog/2011/04/setting-js-callbacks-drupal-json-and-some-jquery-sauce-jcarousel-controls =

これに対する一般的な解決策を探しています http://drupal.org/node/1148204

2
mikeytown2

私が問題を正しく理解している場合、ここには2つのオプションがあります。

1つ目は、インラインオプションをtrueに設定して drupal_add_js を使用することです。 drupal_to_js()は、特にPHP変数を同等のJavaScriptに変換することを扱います。この場合、変数ではなく関数を扱うため、適切に適合しません。

2番目のオプション(おそらく私が好む)は、匿名関数をまったく使用しないことです。代わりに、次のような独自のJSファイルを作成します。

_// Give yourself a namespace to play Nice with other JS.
if ( !ProjectName.flot ) { ProjectName.flot = {}; }

ProjectName.flot.transform = function (v) {
  // …
}

ProjectName.flot.inverseTransform = function (v) {
  // …
}
_

そこから、これらの関数を呼び出すコードは次のようになります。

_xaxis: {
  transform: ProjectName.flot.transform(v),
  inverseTransform: ProjectName.flot.transform(v)
}
_

これはdrupal_add_js()を介して追加されます。それが独自のファイルにある場合、JSの維持がはるかに簡単/より論理的であるため、私はこの方法を好みます。ただし、どちらの方法でも機能します。

1
beeradb