0

我有一个“工作”控制器,允许用户相互分配任务/工作。这些工作中的每一个都有一个“客户”,它是一个外键。

在作业控制器的“添加”视图中,我添加了一个复选框和另一个字段,以允许用户从“添加”作业表单中添加客户端。基本上,我需要一个 ajax 请求,将输入的客户端名称发送到“客户端”控制器,然后控制器会将新客户端添加到数据库中,然后返回一个新的客户端列表,以便我更新下拉列表列表。

我不知道从哪里开始,因为我之前没有在 PHP 环境中使用过 AJAX,而且我不确定应该如何构建它,或者应该如何开始处理它。

4

1 回答 1

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是所有客户。

然后这个 JSON 对象在 javascript 成功语句中被解析和排序,这个排序保留了控制器定义的顺序,即按字母顺序按值(不是键)。

接下来,我可以创建一个全新的options变量,其中包含选择框所需的相同标记。然后我需要做的就是把它们关掉。

如果有人能想到一个更优雅的解决方案,我很乐意授予他们接受。

于 2012-07-19T16:34:41.760 回答