使用AJAX和CakePHP保存数据

我今天花了很多时间研究如何使用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是什么? 它只是/控制器/行动?

2)我还需要做什么才能让控制器访问ajax数据?

奖金:

3)有没有办法在CakePHP框架中包含一个引用数据库设置的自定义php文件,以便我可以手动更新我的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.)使用Cake的魔力:

 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-friendly。 如果您需要查看$ this-> data的内容,Cake的内置调试(来自您应用中的任何位置)将帮助您理顺:

 debug($this->data); 

3.)等等,什么?

我不确定我理解你的问题是正确的,所以如果这不能解决你的问题,请澄清你想要做什么?

如果你的意思是,Cake会允许你手动更新表中的记录,是吗? 虽然我不确定你为什么要这样做。 Cake非常强大的内置ORM是框架的一半,其极为全面的魔力是另一半。

你可以使用Model :: sql()方法来划掉直接的SQL,虽然不鼓励它不是非常OOP或可重用。

在模型中定义关联时,可以将外键设置为false,并指定与Cake的自动连接中的嵌套选择类似的条件。

如果你需要强制加入/,Cake的$ options [‘join’]给你完全精细的控制; 如果默认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会允许你动态交换数据库配置,是的。 然而,这样做可能会变得非常核心,特别是当蛋糕的魔力成为这种情况的一部分时。

您可以在/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 / s传递给CI应用程序以触发它的处理。哇!)

无论如何,HTH。 🙂

  1. 是的,就这么简单。
    1. 要像访问它一样访问数据,您可以像往常一样使用$this->data访问数据
    2. 你为什么不使用像phpmyadmin这样的工具?
  public function add_project() { $this->autoRender = false; $this->layout = 'ajax'; if ($this->RequestHandler->isAjax()) { $this->Project->set($this->request->data); $this->request->data['Project']['user_id'] = $this->Session->read('Auth.User.id'); $this->request->data['Project']['created_by'] = $this->Session->read('Auth.User.id'); $this->request->data['Project']['updated_by'] = $this->Session->read('Auth.User.id'); //$this->request->data['Skill']['accept_decline'] = 0; $this->User->set($this->request->data['Project']); Configure::write('debug', 0); if ($this->Project->validates(array('fieldList' => array('project_title', 'show_on', 'summary')))) { if ($this->Project->save($this->request->data, false)) { $response['status'] = 'succses'; $response['message'] = 'data sent'; echo json_encode($response); exit(); } else { $response['status'] = 'error'; $response['model'] = 'Project'; $response['message'] = 'data not sent'; echo json_encode($response); exit(); } } else { $response['status'] = 'invalid'; $response['model'] = 'Project'; $errors = $this->Project->validationErrors; $response['errors'] = $errors; echo json_encode($response); exit(); } } }