我正在尝试为CakePHP 2.2中的元素列表上的每个项目创建一个最喜欢/明星/心脏按钮(如Gmail中)。CakePHP AJAX请求未被识别
我有一个工作控制器和JS切换功能,但我的问题是,我的脚本的AJAX部分实际上并没有发生;而是将页面重定向到自身(作为JavaScript关闭浏览器的一部分)和重新加载。这是我试图避免的,所以用户不会失去他们在页面上的位置。
这里是我的CakePHP控制器,联合国收藏的物品:
class MarksController extends AppController {
public $components = array('RequestHandler');
public function unfav($id = null) {
// set default class & message for setFlash
$class = 'flash_bad';
$msg = 'Invalid List Id';
if (validation($id)) {
//load this mark's data
$this->request->data = $this->Mark->read(null, $id);
$this->request->data['Mark']['favorite'] = '0';
if ($this->Mark->save($this->request->data)) {
$class = 'message';
$msg = 'The WatchMark has removed from favorites.';
} else {
$msg = 'This WatchMark could not be saved. Please, try again.';
}
$this->autoRender= false;
$this->autoRender = $this->layout = false;
// output JSON on AJAX request
if($this->request->is('ajax')) {
echo json_encode(array('success'=>($class=='flash_bad') ? FALSE : TRUE,'msg'=>"{$msg}"));
exit;
}
// set flash message & redirect
$this->Session->setFlash($msg,'default',array('class'=>$class));
$this->redirect($this->referer());
} else {
//trying to edit a mark that doesn't belong to this user:
throw new NotFoundException(__('Invalid mark'));
} // end ownedby check
} //end markfav method
我有另一个类的反函数称为markfav(它们合并成一个单一的切换功能是另一天的任务)。
然后,在JQuery的& JavaScript端:
$(document).ready(function() {
// class exists
if($('.fav_toggler').length) {
// add click handler
$('.fav_toggler').click(function(e){
$('#flashMessage').fadeOut();
if($(this).hasClass("heart")) {
$.post('/marks/markfav/' + $(this).attr('target_id'), "ajax=1", function(response) {
if(response.success == true) {
$(this).addClass("heart").removeClass("hearttoggle");
}
},'json');
}
else {
$.post('/marks/unfav/' + $(this).attr('target_id'), "ajax=1", function(response) {
if(response.success == true) {
$(this).addClass("heart").removeClass("hearttoggle");
}
},'json');
}
e.preventDefault();
});
return false;
}
});
我已经扔警报到我的JavaScript测试,我认为这是执行正确的(它得到我的代码的右边部分,并且改变心脏& hearttoggle之间类。
我也知道,它跳过我的PHP的if($this->request->is('ajax'))
块出于某种原因(虽然我有一个AJAX删除功能击中了类似的条件就好了)。我测试过卸下if($this->request->is('ajax'))
条件来自PHP blo ck强制它执行JSON_encode位,我只是最终得到一个包含JSON编码数组的页面而没有其他东西。
如何在不使用页面重新加载的情况下使用AJAX正确工作?
编辑:头从呼叫/标记/ unfav/624
Request URL:http://towatchlist.com/marks/unfav/624
Request Method:GET
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:CAKEPHP=blah
Host:towatchlist.com
Referer:http://towatchlist.com/marks
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_1) AppleWebKit/537.8 (KHTML, like Gecko) Chrome/23.0.1255.0 Safari/537.8
Response Headers
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 09 Sep 2012 20:55:18 GMT
Keep-Alive:timeout=5, max=94
Server:Apache/2.2.22 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1ubuntu3.2
在你的动作中,执行'pr($ this)'(调试开启),然后检查它是否显示请求是ajax。此外,请尝试'$ this-> ResquestHandler-> isAjax()'。它在2.x中被弃用,但看看给出了什么。 – rlcabral
当我做'PR($ this)'时,我得到了列表中所有项目的长时间转储(不确定这是否正是你想要的)。所有的项目都有'[isAjax] =>'(表示未设置)。这是你正在寻找的信息吗?我尝试了'$ this-> ResquestHandler-> isAjax()',因为它在我的AJAX删除按钮中工作,但这里的结果没有变化(如预期的那样)。 – Nick
是的,'[isAjax]'是我想要的。它表明您的请求不被视为AJAX请求。你有萤火虫或任何调试工具来检查浏览器发送的请求吗?即发送数据和请求头。 – rlcabral