0

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 つ削除する必要があります[]

4

2 に答える 2

1

おそらく単純なのは、js array[0][0]( for drupal_json_output(array(array_values($fruits)); in php) または array[0] in js( for drupal_json_output(array_values($fruits));) in で使用することですphp

于 2012-05-23T10:37:29.517 に答える
1

次の場合、コードは「正しい」と思います。

apple, bananna, jackfruit
peanut, walnut, almont
carrot, potato, pea

あなたの関数は...などになります

[[apple, bananna, jackfruit],[peanut, walnut, almont],[carrot, potato, pea]]

これは賢明に見えます。

1行だけが必要な場合は、の結果を使用できないのはなぜですか

$FileContents = file($fruit_path); 
$fruits = str_getcsv($FileContents[0]);

すべての行の配列の配列ではなく、最初の行の値の配列になるため

于 2012-05-23T10:45:33.860 に答える