我有一个'作业'控制器,允许用户相互分配任务/作业。这些工作中的每一个都有一个“客户”,这是一个外键。
在作业控制器的“添加”视图中,我添加了一个复选框和另一个字段,以允许用户在“添加”作业表单中添加客户端。基本上,我需要一个ajax请求,将输入的客户端名称发送到'客户'控制器,然后控制器将新客户端添加到数据库,然后返回一个新的客户端列表,让我更新我的下拉列表列表。
我不知道从哪里开始这个,因为我之前没有从PHP环境中使用过AJAX,我不知道应该如何构建它,或者我应该如何开始处理它。
答案 0 :(得分:1)
我已经解决了问题。它不是很优雅,但它有效。
在我的视图底部:
echo $this->Html->scriptBlock(
'function sendAjaxRequest(){
$.ajax({
type: "POST",
url: "' . $this->Html->url(array('controller' => 'clients', 'action' => 'add_external')) . '",
data: "name="+$(\'#JobNewClientName\').val(),
success: function(msg){
//parse and sort the entries alphabetically
msg = $.parseJSON(msg);
var values = [];
for(var i in msg) {
values.push({ key: i, value: msg[i] });
}
values.sort(function(a, b) {return a.value.toLowerCase().localeCompare(b.value.toLowerCase())});
var str = values.map(function (kvp) { return kvp.value; }).join(\'\n\');
//remake the selectbox options
var options = \'<option value=""></option>\';
$.each(values, function(i){
options += \'<option value="\'+values[i].key+\'">\'+values[i].value+\'</option>\';
});
$(\'#JobClientId\').html(options);
}
});
}');
控制器:
function add_external() {
$this->autoRender = false;
$this->Client->create();
$this->Client->set('name', $_POST['name']);
$this->Client->save();
echo json_encode($this->Client->find('list', array('order' => array('Client.name' => 'ASC'))));
}
基本上,add_external()
函数从ajax获取一个已发布的名称并将其添加到数据库中。然后它json_encode
是所有客户。
然后在javascript成功语句中解析和排序此JSON对象,此排序保留控制器定义的顺序,即按字母顺序按值(不是键)。
接下来,我可以创建一个全新的options
变量,其中包含选择框所需的相同标记。然后我需要做的就是把它们换掉。
如果有人能想到更优雅的解决方案,我很乐意将其接受。