Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
zend framework 2 ajax请求错误_Ajax_Zend Framework2 - Fatal编程技术网

zend framework 2 ajax请求错误

zend framework 2 ajax请求错误,ajax,zend-framework2,Ajax,Zend Framework2,我正在学习Zend框架2。我发现了一篇关于如何在zend中发出Jquery模态窗口ajax请求的帖子。我用它制作了一个小弹出窗口,用户可以在其中添加一个专辑名称和一个专辑类型。 当我在没有Jquery模式窗口的情况下运行下面的脚本时,它会完美地保存到我的数据库中,但是当我试图通过ajax执行此操作时,数据库中没有任何内容。我开始查找错误,当我想发布表单时,我在控制台中发现: 加载资源失败:服务器响应状态为500(内部服务器错误)http://localhost/album/validatepos

我正在学习Zend框架2。我发现了一篇关于如何在zend中发出Jquery模态窗口ajax请求的帖子。我用它制作了一个小弹出窗口,用户可以在其中添加一个专辑名称和一个专辑类型。 当我在没有Jquery模式窗口的情况下运行下面的脚本时,它会完美地保存到我的数据库中,但是当我试图通过ajax执行此操作时,数据库中没有任何内容。我开始查找错误,当我想发布表单时,我在控制台中发现:

加载资源失败:服务器响应状态为500(内部服务器错误)
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())
前面有一个echo
die()
,它在控制台中说

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;
});
});