小编典典

使用AJAX和CakePHP保存数据

ajax

我今天花了很多时间研究如何在cakephp中使用ajax请求保存数据,现在已经知道在cakephp网站上的文档似乎缺少该特定主题。

我有几个可排序的列表,对一个列表项进行排序时,我需要保存每个列表项的位置。我有一个如下设置的ajax请求,该请求在移动项目时触发:

$.ajax({                    
        url: "/orders/save_column_order",
        type:"POST",                                        
        data:"data="+data
       });

控制器中引用的功能为:

function save_column_order(){
    if($this->RequestHandler->isAjax()){

             SAVE STUFF...

        }
  }

我已经设置了助手等:

var $helpers = array('Html','Form','Js');
var $components = array('Session','Email','RequestHandler');

而且它不起作用…

所以我的问题是:

1)当前向控制器中的动作发送ajax请求的URL是什么?它仅仅是/ controller / action吗?

2)我还需要对控制器做些什么来访问ajax数据?

奖金:

3)有没有一种方法可以在CakePHP框架中包含一个自定义php文件,该文件引用数据库设置,以便我可以手动更新mysql数据库?


阅读 257

收藏
2020-07-26

共1个答案

小编典典

你很亲近

1.)URL只是/ controller / action。数据以$ this-> data传递,并且在操作中可以神奇地使用。**由于您在助手中列出的是“
Js”而不是“ Javascript”,因此我假设您使用的是Cake 1.3.x和jQuery,因为jQuery是Cake
1.3的默认设置,而Js代替了Javascript / Ajax。

-修复您的助手:

var $helpers = array('Html', 'Form', 'Js'=>array("Jquery"));

-修复您的jQuery:

$.ajax({
    url:'/orders/save_column_order',
    type:'POST',
    data:data
});

2.)使用蛋糕的魔力:

function save_column_order() {
    if ($this->data != null) {
        $this->Model->save($this->data);
    // whatever else needs doing...
    }
}

-因为您正在做ajax,所以您可能不想要Cake的默认视图渲染行为(只是一个猜测。)如果您想完全渲染任何视图,则可能只是ajax回调的标记片段,所以您可能希望将其放置在元素中,而不是完整的视图中:

function save_column_order() {
    // ...
    /* arg 1 - you can specify any view or element you like. 
       arg 2 - enforces your preferred request handling and layout */
    $this->set(compact('vars', 'for', 'view'));
    $this->render('/elements/new_column_order', 'ajax'); 
}

-否则,仅抑制渲染:

function save_column_order() {
    ...     
    $this->autoRender = false;
}

-如果保存无效,请确保$ this-> data的结构对Cake-save友好。如果您需要查看$ this-> data的内容,Cake的内置调试(从应用程序中的任何位置)将帮助您弄清楚:

debug($this->data);

3)等等,什么?

不确定我是否正确理解您的要求,因此,如果这不能解决您的问题,请说明您要执行的操作?

如果您的意思是,Cake将允许您手动更新表中的记录,是吗?尽管我不确定您为什么要这么做。Cake极其强大的内置ORM是该框架的一半,而其极其全面的魔力是另一半。

您可以使用Model :: sql()方法来编写简单的SQL,尽管不建议这样做,因为它不是OOP或可重用的。

在模型中定义关联时,可以将外键设置为false并指定条件,这些条件的工作方式类似于Cake的自动联接中的嵌套选择。

如果您需要强制加入,Cake的$ options [‘joins’]可以让您完全控制。如果默认的LEFT不能满足您的需要,则可以指定任何类型的JOIN。

您可以使用$ this-> Model-> bind()/
unbind()快速建立和断开模型绑定。您可以指定递归级别,应用可包含行为,指定要选择的字段以及所有条件。

如果需要子查询,而Cake无法正确处理它,则$ dbo-> buildStatement()将构造您的SQL语句,而$ dbo->
expression()将触发它:

function intricate() {
    $dbo = $this->Rate->Status->getDataSource();
    $subquery = $dbo->buildStatement(
        array(
            'fields' => array('`Status`.`id`'),
            'table' => $dbo->fullTableName($this->Rate->Status),
            'alias' => 'Status',
            'limit' => null,
            'offset' => null,
            'joins' => array(),
            'conditions' => $subqueryConditions,
            'order' => null,
            'group' => null
            ),
        $this->Rate->Status
        );
    $subquery = "Status.id = (".$subquery.")";
    $status = $dbo->expression($subquery);
    $options['fields']=
        array(
            "Rate.id", "Rate.plan_id", "Rate.status_id","Rate.rate", "Plan.id", 
            "Plan.company_id", "Plan.name", "Company.id", "Company.name"
        );
    $options['conditions']=
        array(
            $status, 
            "Geographical.name LIKE '%{$this->zip}%'"
        );
    $rates = $this->Rate->find('all', $options);
    $this->set(compact('rates'));
    }

-如果您的意思是-Cake将允许您即时交换数据库配置,是的。但是,这样做可能会变得非常顽固,尤其是当Cake的魔力成为这种情况的一部分时。

您可以在/app/config/database.php中添加多个数据库配置-

class DATABASE_CONFIG {
    var $default = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host'=>'localhost',
        'login' => 'cake',
    'password' => 'icing',
        'database' => 'dev'
);
    var $offsite = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => '11.22.33.44', // or whatever
        'login' => 'cake',
        'password' => 'frosting',
        'database' => 'live'
);
}

-根据情况的复杂程度,在控制器/模型中在它们之间进行切换会使情况变得有些紧张:

// Model::getDataSource()->configKeyName holds whichever db config you're using
if ($this->Model->getDataSource()->configKeyName != 'default') {
    // do something, for example, change models, tables, reload schema, etc.
    $this->loadModel('Special')
    $this->Model->table = 'extras';
    $this->Model->schema(true);
} else {
    // predictably, Model::setDataSource($configKey) changes configs
    $this->Model->setDataSource('offsite');
}

-如果这是您的意思,我可以粘贴几周前编写的代码块,要求将ajax表单提交(在表单完成的两个阶段)保存到2个数据库中的3个表中(其中一个服务我的Cake应用程序,另一个服务于旧版CodeIgniter应用程序)展示了所有这些花式的实际操作,以及一些不错的老式Cake Magic通过保存/更新快捷键的连接。(我还必须生成选择性电子邮件,最后,触发REST请求,将新插入记录的ID传递给CI应用程序以触发其处理。哇!)

无论如何,HTH。:)

2020-07-26