CakePHP从视图内交叉发布到不同的控制器

时间:2012-07-19 11:14:50

标签: ajax cakephp

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

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

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

1 个答案:

答案 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变量,其中包含选择框所需的相同标记。然后我需要做的就是把它们换掉。

如果有人能想到更优雅的解决方案,我很乐意将其接受。