当前位置: 首页 > 面试题库 >

使用AJAX和CakePHP保存数据

皮自明
2023-03-14
问题内容

我今天花了很多时间研究如何在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框架中包含一个自定义phphtml" target="_blank">文件,该文件引用数据库设置,以便我可以手动更新mysql数据库?


问题答案:

你很亲近

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。:)



 类似资料:
  • 这段javascript代码如下所示。注意,当file input元素的值发生变化时(即,一旦他们选择了要上传的文件),就会调用该命令 请原谅所有控制台日志。它的目的是显示输出和调试。 您将看到,我还附加了一个username字段,只是为了测试帖子是否在控制器中使用了一些完整的数据。的确是。以下是记录数组的输出: 有什么想法吗??

  • 问题内容: 如何将表单数据保存在文件或本地db(也许使用AJAX)中,该文件或数据通过表单操作将数据发送到外部db? 我的表单的源代码在这里:http : //jsbin.com/ojUjEKa/1/edit 我应该对代码进行哪些更改(如果有)? 对。因此,我能够使用AJAX将数据存储到localStorage中,并希望将存储的数据发送到名为backend.php的文件中。这是我的html文件:

  • 我想内联编辑列表页上的变量使用引导x-edable。我以前使用过这个功能,但是在一个只有一个ID和一个值的表上运行良好。现在在这种情况下,用户点击内容概览页面中的用户名。单击后,用户名变成一个带有用户名的选择框。这工作得很好。但在保存时不存储数据。至少存储为0 他认为: 单击此按钮,它将变为(似乎可以): 激活选择框的脚本为: 保存后,使用内容控制器中的此功能: 真的希望有人能看到我哪里出错了,或

  • 我试图找出如何整合谷歌隐形reCaptcha到一个自定义提交表单附加到submit.js(ajax)。多亏了这一点,我成功地在99%的网站上使用了谷歌的新隐形reCaptcha。我尝试遵循相同的指南,但当我尝试添加到listing.php之前调用submit.js(ajax),一切正常,但如果用户犯了一些错误(忘记一些字段),值不会像以前那样保存。这里是submit.js(ajax) 有什么想法吗

  • 问题内容: 美好的一天,我正在尝试从表单中发送或获取数据,然后使用jquery和ajax将数据发送到应保存在数据库中的php页面中,如何在jquery中使用ajax来做到这一点,任何帮助会做的,谢谢! HTML页面1,它将使用jquery ajax将数据发送到php页面 PHP页面2将从页面1表单中接收数据 这个项目的任何帮助将极大地帮助我们,谢谢! (更新)这是我尝试使用的jQuery,但它转到

  • 我正在学习cakephp,已经做了很多。我问这个问题的唯一原因是cakePHP中的文档可能是错误的。我不能从文档或过去的stackoverflow帖子中看到为什么(子)教师表不保存(父)用户表中id表中的user_id。我得到没有错误,但user_id是0在教师表,所以它不捡起它从用户表。我在两个模型上有一对一的关系。我只是测试保存超过2个模型,我有一个用户和老师。我只是在表单中输入数据,并创建一