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を出力することもできますが、その場合、多くの機能が失われます。
このガイドは回避策として使用できます http://echodittolabs.org/blog/2011/04/setting-js-callbacks-drupal-json-and-some-jquery-sauce-jcarousel-controls =
これに対する一般的な解決策を探しています http://drupal.org/node/1148204
私が問題を正しく理解している場合、ここには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の維持がはるかに簡単/より論理的であるため、私はこの方法を好みます。ただし、どちらの方法でも機能します。