数据库支持的输入字段的代理过滤器值

时间:2011-05-01 02:25:28

标签: php javascript jquery json jsonp

背景

对于国家/地区字段,系统会检测并默认为加拿大。对于城市字段,用户键入加拿大城市名称,填充Facebook-style

国家/地区列表和城市列表都使用AJAX和JSON填充,使用代理从远程数据库获取(通过PHP查询)。

使用MaxMind's GeoIP PHP API将该国家/地区默认为用户的原籍国。

当用户选择其他国家/地区时,必须将其双字母ISO代码作为参数传递给城市输入,以便驱动它的查询可以搜索所选国家/地区的城市。

例如,IP地址在加拿大的用户可以选择美国。发生这种情况时:

  1. 城市场地将被删除;
  2. 城市领域获得关注;然后
  3. 仅显示美国城市(作为用户类型)。
  4. 问题

    以下PHP代码段代理将城市列表检索到远程服务器:

    echo file_get_contents( 'http://server/city.dhtml?q=' . 
      urlencode( $_GET['q'] ) );
    

    jQuery tokenInput函数似乎没有提供传递其他内容的机制。相关的jQuery片段如下。

    获取国家/地区

    以下代码获取国家/地区代码和国家/地区列表。它将用户的国家/地区设置为默认国家/地区。

      // Where in the world?
      $.getJSON( 'geoip.dhtml', function( data ) {
        country = data[0].id;
      });
    
      // Select from countries that have significant amounts of data.
      $.getJSON( 'country.dhtml', function( data ) {
        var h = '';
        var len = data.length;
    
        for( var i = 0; i < len; i++ ) {
          var s = '';
    
          // Make the person's own country the default selection.
          if( data[i].id == country ) {
            s = '" selected="selected"';
          }
    
          h += '<option value="' + data[i].id + s + '">' + data[i].name + '</option>';
        }
    
        $('#country').html(h);
      });
    

    获取城市

    以下代码下载城市列表。 tokenInput函数自动将q参数传递给city.dhtml的“本地版本”内的代码(PHP源代码片段如上所示)。 q参数是用户为城市键入的文本。

      $('#city').tokenInput( 'city.dhtml', {
        hintText: "Type a city name.",
        tokenLimit: 1,
        classes: {
          tokenList: "token-input-list-facebook",
          token: "token-input-token-facebook",
          tokenDelete: "token-input-delete-token-facebook",
          selectedToken: "token-input-selected-token-facebook",
          highlightedToken: "token-input-highlighted-token-facebook",
          dropdown: "token-input-dropdown-facebook",
          dropdownItem: "token-input-dropdown-item-facebook",
          dropdownItem2: "token-input-dropdown-item2-facebook",
          selectedDropdownItem: "token-input-selected-dropdown-item-facebook",
          inputToken: "token-input-input-token-facebook"
        }
      });
    

    city.dhtml必须按国家/地区代码过滤城市。

    问题

    如果不使用Cookie,您如何向city.dhtml提供国家/地区代码?

    最新版本的令牌输入支持JSONP,这会有用吗?

    谢谢!

2 个答案:

答案 0 :(得分:2)

问题是,一旦设置了输入,就无法更改tokenInput URL参数。虽然也许可以删除现有的tokenInput并在每次选择新国家时重新创建它,但解决方案将是一个黑客。

解决方案是使用jQuery TokenInput的补丁,它允许根据函数调用的结果设置URL参数。

https://github.com/loopj/jquery-tokeninput/pull/77

应用补丁并使用以下代码动态更改查询:

  function cityURL() {
    return 'city.dhtml?c=' + $('#country').val();
  }

  $('#city').tokenInput( cityURL, { /* ... */ });

并在jquery.tokeninput.js(第650行附近)禁用缓存:

    //var cached_results = cache.get(query);
    var cached_results = false;

答案 1 :(得分:1)

整洁的问题,+ 1!是什么阻止你做的事情:

$('#city').tokenInput('city.dhtml?c=' + $('#country').val(), { /* ... */ });

您可能需要将其包含在onChange事件中,但它应该有效。