我今天花了很多时间研究如何在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数据库?
你很亲近
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。:)