嘿,我正试图使用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;
}
}
知道我如何发送投资组合组并填充第二个选择吗
提前感谢
使用getJson
而不是ajax()
;
Json(JavaScriptObjectNotation)是在php和JavaScript之间发送结构化数据的最简单方法。
这里假设控制器直接响应ajax查询,并且$portfolio_groups
是一个以"id"answers"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文档以了解有关它的更多详细信息
看看这个XML教程(有人会因为我链接到w3schools而大发雷霆),这是一个很好的开始。
从广义上讲,AJAX请求是使浏览器打开一个只有它才能看到(而不是用户)的窗口的调用。向服务器发出请求,服务器返回一个页面,发出请求的脚本可以查看该页面。这意味着任何可以用文本表达的东西都可以通过AJAX传输,包括XML(AJAX中的X代表XML)。
这有什么帮助?考虑一下,如果您试图填充下拉列表,则需要返回一个项目列表来填充它。您可以对页面http://www.mysite.com/mypage.php?d=select1
进行ajax调用(如果您不熟悉GET和POST请求,或者对ajax更实用的方面有点一无所知,这里提供了另一个完整的教程),并让它返回如下项目列表:
item1
item2
item3
...
并扫描文本中的换行符。虽然这肯定适用于大多数情况,但它并不理想,而且在所有其他可能使用AJAX的情况下肯定不会有用。相反,可以考虑将PHP(.NET、ASP等)中的返回格式设置为XML:
<drop>
<item>item1</item>
<item>item2</item>
<item>item3</item>
</drop>
并使用解析器中内置的Javascript(此处概述)来获取数据。
我要做的是使用$.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
输出的选项填充。
最简单的方法是从控制器返回json字符串,然后在$.ajax.的"成功"调用中处理它
假设$portfolio_groups变量是一个数组:
$portfolio_groups = array('1'=>'Portfolio 1', '2' => 'Portfolio 2');
然后您可以从控制器返回json字符串,如下所示:
echo json_encode($portfolio_groups);
然后,在您的jQueryajax调用中,您可以在响应中捕获此字符串($.ajax的"success"设置)
大致来说,您的$.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);
});
}
});
当然,如果数据不是空的,您还需要添加检查,等等。
假设函数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);
}
});