在Ajax响应中发送数据

时间:2012-08-21 14:04:23

标签: php ajax jquery

嘿,我试图在另一个使用ajax的基础上填充一个选择下拉列表。我有一个选择填充投资组合,第二个是空的。当我从第一个选择框中选择一个选项时。我调用一个ajax函数,在其中我发送选定的投资组合ID,在ajax方法中我找到所选id的组,如何用我找到的组填充第二个选择。我的代码是

包含两个选择的表单

<form name="portfolios" action="{{ path('v2_pm_portfolio_switch') }}" method="post" >
        <select id="portfolios" name="portfolio" style="width: 200px; height:25px;">
            <option selected="selected" value="default">Select Portfolio</option>
            {% for portfolio in portfolios %}
                <option get-groups="{{ path('v2_pm_patents_getgroups') }}" value={{ portfolio.id }}>{{ portfolio.portfolioName }}</option>
            {% endfor %}
        </select><br/><br/>
        <select id="portfolio-groups" name="portfolio-groups" style="width: 200px; height:25px;">
            <option selected="selected" value="default">Select Portfolio Group</option>
        </select><br/>
</form>

JS

 <script>
    $(document).ready(function(){
        $('#portfolios').change(function() {
            var id = $("#portfolios").val();
            var url = $('option:selected', this).attr("get-groups");
            var data = {PID:id};
            $.ajax({
                type: "POST",
                data: data,
                url:url,
                cache: false,
                success: function(data) {
                    //want to populate the 2nd select box here
                }
            });
        });
    }); 
</script>

控制器方法,我找到所选投资组合的组

public function getgroupsAction(Request $request){
    if ($request->isXmlHttpRequest()) {

        $id = $request->get("PID");
        $em = $this->getDoctrine()->getEntityManager();
        $portfolio_groups = $em->getRepository('MunichInnovationGroupPatentBundle:PmPatentgroups')
        ->getpatentgroups($id);
        return $portfolio_groups;
    }
}

我知道如何发送投资组合并填充第二个选择

提前致谢

5 个答案:

答案 0 :(得分:2)

使用getJson代替ajax();

Json(JavaScript Object Notation),是在php和javascript之间发送结构化数据的最简单方法。

我假设控制器直接响应ajax查询,$portfolio_groups是一个关联数组,其中“id”和“name”作为键或具有相同属性的对象。

在PHP控制器中发送json数据:

public function getgroupsAction(Request $request){
    if ($request->isXmlHttpRequest()) {

        $id = $request->get("PID");
        $em = $this->getDoctrine()->getEntityManager();
        $portfolio_groups = $em->getRepository('MunichInnovationGroupPatentBundle:PmPatentgroups')
        ->getpatentgroups($id);
        echo json_encode($portfolio_groups);
    }
}

然后使用getJson检索数据并迭代它:

$.getJSON(url, data, function(result) {
    var options = $("#portfolio-groups");
    $.each(result, function(item) {
        options.append($("<option />").val(item.id).text(item.name));
    });
});

请查看getjson documentation了解有关它的详细信息

答案 1 :(得分:0)

查看这个XML tutorial(那里的某人会激怒我链接到w3schools)这是一个好的开始。

非常广义地说,AJAX请求使浏览器打开一个只能看到(而不是用户)的窗口。向服务器发出请求,服务器返回一个页面,发出请求的脚本可以查看该页面。这意味着任何可以用文本表达的东西都可以通过AJAX传输,包括XML(AJAX中的X代表)。

这有什么用?考虑一下,如果您尝试填充下拉列表,则需要返回一个项目列表以填充它。您可以对页面http://www.mysite.com/mypage.php?d=select1进行ajax调用(如果您不熟悉GET和POST请求,或者对于AJAX更实用的方面有点暗淡,可以使用另一个完整的教程here并让它返回一个项目列表如下:

item1
item2
item3
...

扫描文本以查找换行符。虽然这肯定适用于大多数情况,但它并不理想,并且在所有其他可能使用AJAX的情况下肯定不会有用。而是考虑用XML格式化PHP中的返回值(.NET,ASP,等等):

<drop>
    <item>item1</item>
    <item>item2</item>
    <item>item3</item>
</drop>

使用内置解析器的Javascripts(概述here)来获取数据。

答案 2 :(得分:0)

我要做的是使用$ .load()函数。 为此,您的getgroupsAction应返回选项html。

JS:

<script>
    $(document).ready(function(){
        $('#portfolios').change(function() {
            var id = $("#portfolios").val();
            var url = $('option:selected', this).attr("get-groups");
            var data = {PID:id};

            // Perhaps you want your select to show "Loading" while loading the data?
            $('#portfolio-groups').html('<option selected="selected" value="default">Loading...</option>');

            $('#portfolio-groups').load(url, data);
        });
    }); 
</script>

我不知道$portfolio_groups如何存储数据,但是假设你在回复中做了类似的事情:

<?php foreach($portfolio_groups as $p) : ?>
    <option value="<?php echo $p->value ?>"><?php echo $p->name ?></option>
<?php endforeach ?>

这样,选择将填充getgroupsAction输出的选项。

答案 3 :(得分:0)

最简单的方法是从控制器返回json字符串,然后在$ .ajax的'success'调用中处理它。

让我们假设您的$ portfolio_groups变量是一个数组:

$portfolio_groups = array('1'=>'Portfolio 1', '2' => 'Portfolio 2');

然后你可以像控制器一样从控制器返回它:

echo json_encode($portfolio_groups);

然后在你的jQuery ajax调用中你可以在响应中捕获这个字符串($ .ajax的'success'设置)。不要忘记添加设置dataType:'json'

粗略地说,您的$ .ajax调用将如下所示:

$.ajax({
    type: "POST",
    data: data,
    url:url,
    cache: false,
    dataType: 'json', // don't forget to add this setting
    success: function(data) {
        $.each(data, function(id, title){
            var node = $('<option>').attr('value', id).html(title);

            // this will simply add options to the existing list of options
            // you might need to clear this list before adding new options
            $('#portfolio-groups').append(node);
        });
    }
});

当然,如果数据不为空,您还需要添加检查等。

答案 4 :(得分:0)

假设函数 getgroupsAction 保留在一个扁平的php控制器(不在类中),你应该告诉服务器执行函数

所以在ajax调用文件的末尾你几乎不应该首先调用该函数(可能是你做过了!)

对于您的专利组结果集,您可以通过php或javascript生成选择

在第一种情况下,你应该这样做:

//php
  $options = getgroupsAction($_REQUEST);
  $return = "<select name =\"name\" id=\"id\"><option value=\"\"></option>";
 foreach( $options as $option){
       $return.= "<option value=\"$option\">$option</option>";
 }
 $return .= "</select>";
  echo $return;

然后在Javascript中:      // javascript

  var data = {PID:id};
        $.ajax({
            type: "POST",
            data: data,
            url:url,
            cache: false,
            success: function(data) {
                //inside data you have the select html code so just:
               $('#divWhereToappend').append(data);
            },
    error: function(data) {
                //ALWAYS print the error string when it returns error for a more easily debug
         alert(data.responseText);
            }
        });