0

たくさんのフィールド (名、姓など) があり、入力済みまたは部分的に入力済みの値をオートコンプリート サーバー側に渡して、クエリで使用できるようにしたいと考えています。

4

1 に答える 1

0

これは、さまざまなフィールドのフォーカスの変更、またはオートコンプリートの「選択」イベントで、オートコンプリートの「ソース」を更新することで行いました。

jQuery('#people_new_user input[type="text"]').each(
    function(index, element) {
        var field = element.name;
        jQuery(element)
            .focus(setSourceUser)
            .autocomplete({
          source: "/cf/AutoComplete/People?current="+field,
          select: selectUser
        });
    });

上記のコードは、「setSourceUser」と呼ばれる「フォーカス」イベント ハンドラーと、「selectUser」と呼ばれるオートコンプリートの「選択」イベントのハンドラーをセットアップします。

function setSourceUser(event)
{
  var endPart = "";
  jQuery('#people_new_user input[type="text"]').each(
    function(index, ielement) {
      var ifield = ielement.name;
      var ival = ielement.value;
      if (ival != '')
      {
          endPart += '&field=' + ifield;
          endPart += '&value=' + ival;
      }
    }).each(
    function(index, element) {
      var field = element.name;
      jQuery(element)
                .autocomplete("option", "source", 
                    "/cf/AutoComplete/People?current="+field+endPart);
    });
}

上記の「setSourceUser」関数は、(最初の「each」関数で) すべてのフィールドからすべての値を取得し、ソースの「endPart」を作成してから、各フィールドのオートコンプリート「source」オプションを設定します。「select」コールバックは表示しません。これは、この問題に関係のない他の処理を実行してから「setSourceUser」を呼び出すためです。ソースは/cf/AutoComplete/People?current=last_name&field=first_name&value=p&field=last_name&value=tomblin、オートコンプリート自体が提供する「用語」値と同様に、最終的には次のようなものになります。

サーバー側では、私の関数 (この場合は Mason と Perl で記述) は、「LIKE」SQL ステートメント&field=foo&value=barでペアを使用します (フィールド == 現在のものをスキップします。これは、オートコンプリートがより新しい値を に渡すためです)。term次に、見つかった結果を JSON で返します。(結果が 50 件を超える場合は、リストが長くなりすぎるので気にしません。)

% $r->content_type('application/json');
<% JSON::to_json( \@suggestions, { utf8 => 1, allow_blessed => 1,
    convert_blessed => 1, } ) |n %>
% $m->abort;
<%ARGS>
@field => undef
@value => undef
$current => undef
$term => undef
</%ARGS>
<%INIT>
use RTx::SearchBuilder::Records::Peoples;

$current =~ s/people_//g;

my $people = RTx::SearchBuilder::Records::Peoples->new(Handle => CFHandle());
my $fn = scalar(@field);
for my $i (0...$fn-1)
{
  my $f = $field[$i];
  next if !defined($f);
  my $v = $value[$i];
  if ($f ne $current)
  {
    $people->Limit(
        FIELD       =>  $f,
        OPERATOR    =>  'LIKE',
        VALUE       =>  '%'.$v.'%',
        ENTRYAGGREGATOR =>  'AND');
  }
}

$people->Limit(
    FIELD       =>  $current,
    OPERATOR    =>  'LIKE',
    VALUE       =>  '%'.$term.'%',
    ENTRYAGGREGATOR =>  'AND');

my @suggestions;

# If there are too many results, skip it and make them narrow it down a bit
# more
if ($people->Count < 50)
{
  while (my $person = $people->Next)
  {
    my $suggestion = { label => $person->$current, value => $person };
    push @suggestions, $suggestion;
  }
}
</%INIT>
于 2012-06-08T15:08:22.683 に答える