如何从引导表中获取数据并使用ajax保存?

时间:2017-05-03 20:35:54

标签: jquery ajax cakephp

我有一张像这张图片中的表,我想从中获取数据并使用这个ajax函数保存它,但它似乎没有将数据传递给php。当我在我的php代码上返回$ this-> request->数据时,console.log()会在显示多个函数的.fail中被触发,当我返回json_encode($ this-> request-> data)时.done被触发但是console.log()显示一个空数组。

编辑: console.log(JSON.stringify(array))=

[{"SIA_ID":"1070","DESCONTO_CNES":"100,00","VALOR_PAGO":"679,19"}]

我做错了什么?

似乎我无法发布图片,所以这里有一个链接: http://i.imgur.com/qC0ol06.jpg

对不起我的英文,希望你能理解。

$("#modal-btn-salvar-desconto").on("click", function() {        
    var dadosTabela = $("#tabela-estabelecimento").bootstrapTable("getData");
    var array=[];
    $(dadosTabela).each(function(index) {   
        array[index] = {
            "SIA_ID"        : this.ID,
            "DESCONTO_CNES" : $("#modal-valor-desconto").val().replace("R$", ""),
            "VALOR_PAGO"    : this["VALOR_A_PAGAR"]
        };
    });

    console.log(JSON.stringify(array));

    $.ajax({
        url: "ajaxAtualizar",
        type: "POST",
        dataType: "json",
        data: JSON.stringify(array)
    })
    .done(function(data) {     
            var data = JSON.parse(data);
            if (!data.salvou){
                new PNotify({
                    icon: false,
                    text: '<h5>Registro não pôde ser gravado!<h5>',
                    type: 'error'
                });
                return;
            }
            $(".modal-estabelecimento").modal("toggle");
            $("#mensagem-ajax").html("<div class='" + (data.salvou ? "alert alert-secondary fade in" : "alert alert-warning fade in") + "'><button type='button' class='close' data-dismiss='alert' aria-hidden='true'>X</button>" + data.mensagem + "</div>");

    })
    .fail( function(data) {
        console.log("FALHOU");
        console.log(data);
        return;
    });
});



public function ajaxAtualizar() {
    $this->layout = "ajax";
    $this->autoRender = false;              

    if ($this->request->is("ajax")) {           
        foreach ($this->request->data as $dados) {
            $dados["desconto_cnes"]     = str_replace(",", ".", str_replace(".", "", $dados["desconto_cnes"]));
            $dados["desconto_rubrica"]  = str_replace(",", ".", str_replace(".", "", $dados["desconto_rubrica"]));
            $dados["valor_pago"]        = str_replace(",", ".", str_replace(".", "", $dados["valor_pago"]));

            $existeId = $this->Pagamento->findBySiaId($dados["sia_id"]);

            if ($existeId) {
                $dados["id"] = $existeId["PagamentoAmbulatoriai"]["id"];
            }                              
        }

        if ($this->Pagamento->saveAll($dados)) {
            return json_encode(array("salvou" => true, "mensagem" => $this->Mensagem->Msgi(7)));
        } else {
            return json_encode(array("salvou" => false, "mensagem" => $this->Mensagem->Msgi(6)));
        }

    }
}

2 个答案:

答案 0 :(得分:0)

经过两天以上的强调这个问题,一位朋友刚刚添加了

contentType: 'application/json',

到ajax选项,事情开始起作用了。现在我的php控制器看到ajax正在发送什么(没有发生什么)。

我得到并解决的另一个错误是你需要在我用ajax发送的数组的索引处使用小写,如果不是cakephp将不会使用saveAll保存。

虽然一切正常,但我仍然不知道为什么我需要使用这个contentType,因为数据类型已经是json。朋友代码中的很多请求甚至没有这个选项并且有效......

答案 1 :(得分:0)

为了更好地理解,我删除了一些代码。

问题:

  • 不要JSON.stringify数组,因为它会将其转换为字符串,并且不会再将其作为数组发布。之后,您必须定义一个将发送帖子值的键,所以请执行此data: {myData:array}
  • 当我们请求json dataType时,不需要$this->layout = "ajax";$this->autoRender = false;它将为我们提供json数据。我们必须设置这样的数据$this->set($dataToSend); $this->set('_serialize', true);

毕竟所有的代码都是这样的。

    $(document).ready(function(){
        $.ajax({
            url: "ajaxAtualizar",
            type: "POST",
            dataType: "json",
            data: {myData:array} // Put a key 
        })
            .done(function(data) {
                console.log(data);

            })
            .fail( function(jqXHR, textStatus, errorThrown) { // Change
                console.log("FALHOU");
                console.log(jqXHR.responseText); // Change
                return;
            });
    });





    public function ajaxAtualizar() {

        $dataToSend = [];
        if ($this->request->is("ajax")) {
            if ($this->request->data('myData')) {
                $dataToSend = array("salvou" => true, "mensagem" => 'Found');
            } else {
                $dataToSend = array("salvou" => false, "mensagem" => 'Problem');
            }
        }
        $this->set($dataToSend);
        $this->set('_serialize', true);
    }