ajax 请求 - 更新没有表格的记录

ajax request - update record without form

要进行记录更新,我通常使用 CRUD 和这样的商店:

        storeId: 'storeId',
        model: 'model',
        pageSize: 10,
        autoLoad: true,

        proxy: {
            type: 'ajax',

            actionMethods: {
                create: 'POST',
                read: 'POST',
                update: 'POST',
                destroy: 'POST'
            },

            api: {
                create: 'php/crud.php?action=create',
                read: 'php/crud.php?action=read',
                update: 'php/crud.php?action=update',
                destroy: 'php/crud.php?action=destroy'
            },

            reader: {
                type: 'json',
                rootProperty: 'net',
                totalProperty: 'total',
                successProperty: 'success'
            },

            writer: {
                type: 'json',
                writeAllFields: true,
                encode: true,
                rootProperty: 'net'
            }
        }

更新逻辑:

    var record = form.getRecord();
    record.set(values);

    store.sync({
        success: function () {

        },

        failure: function () {

        },

        callback: function () {
        },

    });

问题:只需更改数据库列的值:YES / NO

我不想用 'destroy' 删除记录,而是想用 'update' 数据库 table 列从 NO 到 YES 禁用它。

在这种情况下,我没有表格;只是一个删除按钮。

我试过没有成功:

    store.proxy.extraParams = {
           sub_case: 'change_delete_state',
           id_lista: id_lista
    },

    store.sync({
        success: function () {

        },

        failure: function () {

        },

        callback: function () {
        },

    });

并且:

    Ext.Ajax.request({
        url: 'php/crud.php?action=update',
        params: {
           sub_case: 'change_delete_state',
           id_lista: id_lista
        },
        success: function () {
            store.commitChanges();
        },

        failure: function () {

        },

        callback: function () {
        },
    });

我将不胜感激解决此问题的建议。

已编辑:

这样解决的:

    api: {
        destroy: 'php/crud.php?action=destroy'
    },

客户端逻辑:

        // soft delete
        store.proxy.extraParams = {
           sub_case: 'change_delete_state',
           id_lista: id_lista
        },

        //or
        // hard delete
        store.proxy.extraParams = {
           id_lista: id_lista
        },

        store.remove(record);
        store.sync({...});

服务器端(PHP):

case "destroy":{
    $record = stripslashes($_POST['net']);
    $data = json_decode($record);

    $id_lista = $data->{'id_lista'};

  if($_REQUEST['sub_case'] == "change_delete_state"){      
        $sqlQuery = "UPDATE ...";
        (...)
    }else{
        $sqlQuery = "DELETE ...";
        (...)
      }
}

如果你尽可能地隐藏server-side上的数据库逻辑,你就会过得很好。

所以,如果您只有一种方法可以删除 front-end 中的一条记录,并且应该从存储中删除该记录,您只需交换 destroy api一个 "special" 商店有一个特殊的 api:

        api: {
            create: 'php/crud.php?action=create',
            read: 'php/crud.php?action=read',
            update: 'php/crud.php?action=update',
            destroy: 'php/crud.php?action=hide' // hide the record using a SQL update, and remove it from the client-side store; don't remove from server
        },

当然你必须在crud.php中插入特殊逻辑才能对action=hide进行特殊处理。

如果您想要两种不同的方式,一种用于 "hard delete",一种用于 "soft delete",但都应从商店中删除,事情会变得有点复杂。然后,您需要在处理的记录中使用一个特殊的布尔值 "flag" server-side.

例如

fields:[{
    name:'hardDelete',
    type:'bool',
    defaultValue:false
}]

然后你会做某事。沿着

if(hardDelete) record.set("hardDelete",true);
store.remove(record);
store.sync(

并且在服务器端,您必须读取该标志并根据其值采取行动。