zend framework 2 ajax请求错误
我正在学习Zend框架2。我发现了一篇关于如何在zend中发出Jquery模态窗口ajax请求的帖子。我用它制作了一个小弹出窗口,用户可以在其中添加一个专辑名称和一个专辑类型。 当我在没有Jquery模式窗口的情况下运行下面的脚本时,它会完美地保存到我的数据库中,但是当我试图通过ajax执行此操作时,数据库中没有任何内容。我开始查找错误,当我想发布表单时,我在控制台中发现: 加载资源失败:服务器响应状态为500(内部服务器错误)zend framework 2 ajax请求错误,ajax,zend-framework2,Ajax,Zend Framework2,我正在学习Zend框架2。我发现了一篇关于如何在zend中发出Jquery模态窗口ajax请求的帖子。我用它制作了一个小弹出窗口,用户可以在其中添加一个专辑名称和一个专辑类型。 当我在没有Jquery模式窗口的情况下运行下面的脚本时,它会完美地保存到我的数据库中,但是当我试图通过ajax执行此操作时,数据库中没有任何内容。我开始查找错误,当我想发布表单时,我在控制台中发现: 加载资源失败:服务器响应状态为500(内部服务器错误)http://localhost/album/validatepos
http://localhost/album/validatepostajax
但当我点击它加载的URL时
非常感谢您的帮助
控制器:
<?php
namespace Album\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class AddNewAlbumController extends AbstractActionController {
public function savetodb($data)
{
$mapper = $this->getServiceLocator()->get('Album/Mapper/Album');
$mapper->insert($data);
}
protected function getForm()
{
$form = $this->getServiceLocator()->get('Album\Form\AddNewAlbumForm');
$form->setInputFilter(new \Album\Form\Filters\AddNewAlbumFormFilter());
$form->setName('AlbumForm');
return $form;
}
public function newalbumAction()
{
$viewmodel = new ViewModel();
$viewmodel->setTemplate('album/form/add-album.phtml');
$form = $this->getForm();
$form->setHydrator ( new \Zend\Stdlib\Hydrator\Reflection () );
$request = $this->getRequest();
//disable layout if request by Ajax
$viewmodel->setTerminal($request->isXmlHttpRequest());
$is_xmlhttprequest = 1;
if ( ! $request->isXmlHttpRequest()){
//if NOT using Ajax
$is_xmlhttprequest = 0;
if ($request->isPost()){
$form->bind ( new \Album\Entity\Album());
$form->setData($request->getPost());
$mapper = $this->getServiceLocator()->get('Album/Mapper/Album');
if ($form->isValid()){
$this->savetodb($form->getData());
}
}
}
$viewmodel->setVariables(array(
'form' => $form,
'is_xmlhttprequest' => $is_xmlhttprequest //need for check this form is in modal dialog or not in view
));
return $viewmodel;
}
public function validatepostajaxAction()
{
$form = $this->getForm();
$form->setHydrator ( new \Zend\Stdlib\Hydrator\Reflection () );
$request = $this->getRequest();
$response = $this->getResponse();
$messages = array();
if ($request->isPost()){
$form->bind ( new \Album\Entity\Album());
$form->setData($request->getPost());
if ( ! $form->isValid()) {
$errors = $form->getMessages();
foreach($errors as $key=>$row)
{
if (!empty($row) && $key != 'submit') {
foreach($row as $keyer => $rower)
{
$messages[$key][] = $rower;
}
}
}
}
if (!empty($messages)){
$response->setContent(\Zend\Json\Json::encode($messages));
} else {
$this->savetodb($form->getData());
$response->setContent(\Zend\Json\Json::encode(array('success'=>1)));
}
}
return $response;
}
}
isXmlHttpRequest()){
//如果不使用Ajax
$IsxmlHttpRequest=0;
如果($request->isPost()){
$form->bind(new\Album\Entity\Album());
$form->setData($request->getPost());
$mapper=$this->getServiceLocator()->get('Album/mapper/Album');
如果($form->isValid()){
$this->savetodb($form->getData());
}
}
}
$viewmodel->setVariables(数组(
'form'=>$form,
'is_xmlhttprequest'=>$is_xmlhttprequest//需要检查此表单是否在模式对话框中或不在视图中
));
返回$viewmodel;
}
公共函数validatepostajaxAction()
{
$form=$this->getForm();
$form->setHydrator(new\Zend\Stdlib\Hydrator\Reflection());
$request=$this->getRequest();
$response=$this->getResponse();
$messages=array();
如果($request->isPost()){
$form->bind(new\Album\Entity\Album());
$form->setData($request->getPost());
如果(!$form->isValid()){
$errors=$form->getMessages();
foreach($key=>$row的错误)
{
如果(!empty($row)&&$key!='submit'){
foreach($keyer=>$rower的行)
{
$messages[$key][]=$rower;
}
}
}
}
如果(!空($messages)){
$response->setContent(\Zend\Json\Json::encode($messages));
}否则{
$this->savetodb($form->getData());
$response->setContent(\Zend\Json\Json::encode(数组('success'=>1));
}
}
返回$response;
}
}
视图:
var是_xmlhttprequest=;
var urlform='';
Js:
$(函数(){
$(“form#AlbumForm”).submit(函数(){
如果(is_xmlhttprequest==0)
返回true;
$.post(urlform,{'name':$('input[name=name]')).val(),
'type':$('select[name=type]').val()},函数(itemJson){
var错误=错误;
if(itemJson.name!=未定义){
$(“.element_name”).append(“+itemJson.name[0]+”);
错误=真;
}
if(itemJson.type!=未定义){
$(“.element_type”).append(“+itemJson.type[0]+”);
错误=真;
}
$(“winpopup”).dialog(“选项”、“位置”{my:“中心”,在“中心”,of:window});
如果(!错误){
$(“#winpopup”).dialog('close');
location.reload();
if(itemJson.success==1){
警报(“数据已保存”);
}
}
}“json”);
返回false;
});
});
使用用户1291203
调试代码后,通过echo
和die
逐行检查代码,我们发现Ajax帖子是空的
用户1291203发现,
在$this->savetodb($form->getData())
前面有一个echodie()
,它在控制台中说
TypeError:“null”不是对象(正在计算“itemJson.name”)。因此
500(内部服务器错误)
我建议
print\u r()
您正在发布的数据。另外,在浏览器控制台上,通过按Ajax call url+展开并按post选项卡查看表单数据是否已发布来检查您的发布
结论:
类型是文本输入,而不是选择列表,因此js。为该值返回NULL
500(内部服务器错误)
很可能代码挂起,但在Ajax调用中,您看不到这一点
通过echo调试Ajax,并在每行代码后使用die来查看它挂起的位置,这似乎可以实现Ajax调用的技巧:)
感谢您user1291203给我机会帮助您调试代码。快乐编码:)1。您是否在模块配置文件中添加了此项?”策略“=>数组('ViewJsonStrategy',),。2.js正在加载吗?3.注释一些代码invalidatepostajaxAction(),并添加一个简单的echo和exit();看看你能不能拿到response@dixromos98谢谢你的帮助。因此:1)是的,我添加了,尽管我在validatepostajaxAction()中注释掉了这个->savetodb($form->getData())代码>部分所以现在只$response->setContent(\Zend\Json\Json::encode(数组('success'=>1))代码>正在执行,警报正在弹出,因此我不太明白为什么不能将其保存到数据库中好吧,那么您知道Ajax在收到响应后就可以工作了(好消息)。现在,您应该检查本地主机日志,看看是什么导致了问题,或者测试代码的每一行,看看是什么导致了异常@dixromos98你能给我一些建议我应该如何调试它吗?就像我说的savetodb()函数工作一样,我的建议是检查日志,看看Ajax调用发生时是否有错误,这可能是fasted或echo,在每行代码之前都会死,以测试是否有代码抛出异常。当ajax调用发生时,除非看到日志或逐行查看,否则无法看到异常
<script type="text/javascript">
var is_xmlhttprequest = <?php echo $this->is_xmlhttprequest; ?>;
var urlform = '<?php echo $this->url('album\newalbum',
array( 'action' => 'validatepostajax'));?>';
</script>
<?php echo $this->headScript()->appendFile($this->basePath() . '/js/ajaxform-up.js'); ?>
<?php
$form = $this->form;
$form->setAttribute('action', $this->url('album\newalbum',
array( 'action' => 'newalbum'))
);
$form->prepare();
?>
<?php
echo $this->form()->openTag($form);
?>
<div class="element element_name">
<?php echo $this->formlabel($form->get('name')). $this->formelement($form->get('name'));?>
</div>
<div class="element element_type">
<?php echo $this->formElement($form->get('type'));?>
</div>
<?php echo $this->formElement($form->get('submit')).$this->form()->closeTag(); ?>
$(function(){
$("form#AlbumForm").submit(function(){
if (is_xmlhttprequest == 0)
return true;
$.post(urlform, { 'name' : $('input[name=name]').val(),
'type' : $('select[name=type]').val()}, function(itemJson){
var error = false;
if (itemJson.name != undefined){
$(".element_name").append("<div class = 'alert alert-error'>"+itemJson.name[0]+"</div>");
error = true;
}
if (itemJson.type != undefined){
$(".element_type").append("<div class = 'alert alert-error'>"+itemJson.type[0]+"</div>");
error = true;
}
$( "winpopup" ).dialog( "option", "position", { my: "center", at: "center", of: window } );
if (!error){
$("#winpopup").dialog('close');
location.reload();
if (itemJson.success == 1){
alert('Data saved');
}
}
}, 'json');
return false;
});
});