CSV からの出力をフォーマットして、jquery ui.autocomplete の json として使用できるようにするのに PHP の問題があります。
フルーツ.csv:
apple, bananna, jackfruit,
... etc
ここからjquery:
http://jqueryui.com/demos/autocomplete/#default
$( "#fruits" ).autocomplete({
source: '/path/to/fruit.json'
});
CSV を json に変換する PHP:
// Callback function to output CSV as json object
function _custom_json_from_csv() {
$fruit_path = '/path/to/fruit.csv';
$fruits = array_map("str_getcsv", file($fruit_path));
drupal_json_output(array(array_values($fruits)));
exit;
}
// Below are CMS codes for detailed illustration
function drupal_json_output($var = NULL) {
// We are returning JSON, so tell the browser.
drupal_add_http_header('Content-Type', 'application/json');
if (isset($var)) {
echo drupal_json_encode($var);
}
}
function drupal_json_encode($var) {
// The PHP version cannot change within a request.
static $php530;
if (!isset($php530)) {
$php530 = version_compare(PHP_VERSION, '5.3.0', '>=');
}
if ($php530) {
// Encode <, >, ', &, and " using the json_encode() options parameter.
return json_encode($var, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);
}
// json_encode() escapes <, >, ', &, and " using its options parameter, but
// does not support this parameter prior to PHP 5.3.0. Use a helper instead.
include_once DRUPAL_ROOT . '/includes/json-encode.inc';
return drupal_json_encode_helper($var);
}
// parts of json-encode.inc - drupal_json_encode_helper(), responsible for json output:
case 'array':
// Arrays in JSON can't be associative. If the array is empty or if it
// has sequential whole number keys starting with 0, it's not associative
// so we can go ahead and convert it as an array.
if (empty($var) || array_keys($var) === range(0, sizeof($var) - 1)) {
$output = array();
foreach ($var as $v) {
$output[] = drupal_json_encode_helper($v);
}
return '[ ' . implode(', ', $output) . ' ]';
}
// Otherwise, fall through to convert the array as an object.
case 'object':
$output = array();
foreach ($var as $k => $v) {
$output[] = drupal_json_encode_helper(strval($k)) . ':' . drupal_json_encode_helper($v);
}
return '{' . implode(', ', $output) . '}';
jquery で CSV を直接使用するソリューションがあれば、それは素晴らしいことです。しかし、今のところ手がかりはありません。
私の問題は、関数_custom_json_from_csv()が ui.autocomplete の予期しない形式を出力することです。[[[...]]] の過剰に注意してください:
[[["apple", "bananna", "jackfruit"]]]
ui.autocomplete が望んでいる間:
["apple", "bananna", "jackfruit"]
jquery ui.autocomplete で期待されるように関数をフォーマットする方向はありますか?
PS: 私は #autocomplete_path フォーム API を使用せず、代わりに ui.autocomplete を使用しています。理由は次のとおりです。
1) コードはテーマ設定に保存されます。テーマごとに hook_menu は使用できません。可能な限り、この必要性のためのモジュールを避けたいと考えています。
2) do のどこかに ui.autocomplete を使用する計画があるので、これは冒険的だと考えてください。
3) jquery の観点からの以前の質問により、jquery を json に適応させるのではなく、json の出力を修正するようになりました。
4) これは drupal というより、私の php の問題です。
ありがとう
更新: drupal_json_output(array(array_values($fruits))); から 1 つの配列を削除する drupal_json_output(array_values($fruits)); へ []を1つ減らすことに成功しました(これの名前は何ですか?)。明らかに、トップグループとの以前のフォーマットからのミス。 [[「リンゴ」、「バナナ」、「ジャックフルーツ」]]
もう 1 つ削除する必要があります[]