CAKEPHP4从控制器返回数据到AJAX渲染问题
我通过AJAX将数据提交给控制器函数,对数据做我需要做的事情,并尝试将其返回到AJAX函数 我遇到的问题是,控制器正在转储错误消息,并试图将我重定向到实际函数。显然,该函数没有视图,这导致出现一个空白的白色屏幕,响应在左上角回响 以下是ajax:CAKEPHP4从控制器返回数据到AJAX渲染问题,php,jquery,ajax,cakephp,render,Php,Jquery,Ajax,Cakephp,Render,我通过AJAX将数据提交给控制器函数,对数据做我需要做的事情,并尝试将其返回到AJAX函数 我遇到的问题是,控制器正在转储错误消息,并试图将我重定向到实际函数。显然,该函数没有视图,这导致出现一个空白的白色屏幕,响应在左上角回响 以下是ajax: $('#submit_new_split_promo').on('click',function(e){ e.preventDefault(); var id = $(this).data('id');
$('#submit_new_split_promo').on('click',function(e){
e.preventDefault();
var id = $(this).data('id');
$('#d_overlay').show();
form = {};
$.each($('#promo-mail-split-add-'+id).serializeArray(),function(k,v){
form[this.name] = this.value;
});
$.ajax({
url:$('#promo-mail-split-add-'+id).attr('action'),
type:"POST",
dataType: "json",
data: form
}).done(function(result){
var res = JSON.parse(result);
if (res == 'Duplicate') {
$('#ms-promo').css('border','3px solid red');
$('#ms-promo').effect('shake');
$('#dynamodal-unique-title').text('That code has been used. Please enter a new Promo Code.');
$('#dynamodal-unique-title').text('That code has been used. Please enter a new Promo Code.').css('color','red').delay(2000).queue(function(next){
$('#dynamodal-unique-title').text('Create Mail Split Promo');
next();
});
return false;
}
$('#mail_split_promo_'+id).modal('toggle');
if (res == false) {
alert('Mail Split Promo did not save. Please try again.');
} else {
$('#add-promo-to-split-'+id).prop('disabled',true);
$('#promo-view-abled-'+id).hide();
$('#promo-view-disabled-'+id).show();
$('#promo-view-disabled-'+id).prop('disabled',false);
}
}).fail(function(){
}).always(function(){
$('#d_overlay').hide();
});
});
这是控制器代码
public function addpromo() {
$this->Authorization->skipAuthorization();
$this->request->allowMethod(['get','post']);
$this->autoRender = false;
$data = $this->request->getData();
$mail_split_id = $data['mail_split_id'];
$code = $data['code'];
$result = false;
$doesExist = $this->Promos->findByCode($code)->toArray();
if ($doesExist) {
$result = 'Duplicate';
}
if ($result !== 'Duplicate') {
$MailSplits = $this->getTableLocator()->get('MailSplits');
$mailSplit = $MailSplits->get($mail_split_id);
$entity = $this->Promos->newEmptyEntity();
foreach ($data as $key => $val) {
$entity->$key = $val;
}
$entity->record_count = $mailSplit->record_count;
$result = $this->Promos->save($entity);
if ($this->get_property($result,'id')) {
$promo_id = $result->id;
$MailSplits = $this->loadModel('MailSplits');
$mentity = $MailSplits->get($mail_split_id);
$mentity->promo_id = $promo_id;
$updated = $MailSplits->save($mentity);
if ($this->get_property($updated,'id')) {
$result = true;
} else {
$result = false;
}
$output = [];
exec(EXEC_PATH.'AddPromoToRecordSplits '.$promo_id,$output);
} else {
$result = false;
}
}
ob_flush();
echo json_encode($result);
exit(0);
}
它试图将我重定向到的URL是:/promos/addpromo,而我实际上只需要停留在同一页面上,即/mail jobs/view
有几件事需要注意:
我已尝试将该函数添加到控制器策略中,并实际授权初始化的实体。这没有效果,也不会改变我面临的问题
更令人沮丧的是,我在页面上为其他表单编写了基本相同的代码(ajax结构和控制器结构),它们工作得很好。唯一的区别似乎是任何形式的使用ajax的页面上的渲染,工作得很好。我遇到问题的ajax函数似乎都来自Modals中呈现的表单,它们是不同的元素。模态/元素中的每个形式都给了我这个问题,这是我注意到的唯一模式
非常感谢您的帮助,我知道这是一个奇怪而模糊的问题
谢谢大家! 我看不到这两个系统中任何一个应该进行重定向。事实上,您得到的是一个白色页面,这似乎表明它可能会正常提交表单,而不是通过Ajax提交表单,这是一种可能性吗?请注意,尤其是不会终止进程,这将导致整个中间件堆栈无法运行其响应处理逻辑!有关一些提示,请参阅,链接的还有Ajax插件,它还可以使呈现和返回HTML片段变得更容易。