zend framework 2 ajax请求错误

时间:2014-05-21 11:18:50

标签: ajax zend-framework2

我正在学习Zend框架2.我发现了一篇关于如何在zend中创建Jquery模态窗口ajax请求的帖子。我用它做了一个小弹出窗口,用户可以在其中添加专辑名称和专辑类型。 当我在没有 Jquery模式窗口下运行脚本时,它完全保存到我的数据库中,但是当我试图通过ajax这样做时,没有任何东西进入数据库。我开始寻找错误,当我想发布表单时,我在控制台中找到了:

  

无法加载资源:服务器响应状态为500(内部服务器错误)http://localhost/album/validatepostajax

但是当我点击它加载的网址时。

非常感谢任何帮助。

控制器:

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

查看:

<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(); ?>

JS:

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

1 个答案:

答案 0 :(得分:3)

使用 User1291203 echodie逐行调试代码后,我们发现Ajax帖子为{{1} }。

user1291203 发现,  在null之前的回声die(),它在控制台中说出

  

TypeError:&#39; null&#39;不是一个对象(评估&#39; itemJson.name&#39;)。从而   500(内部服务器错误)。

我建议

$this->savetodb($form->getData())您要发布的数据。也可以在浏览器控制台上通过按下Ajax调用url +来检查您的发布是否展开,然后按下帖子选项卡以查看表单的数据是否正在发布。

结论:

类型是文本输入而不是选择列表因此js。使用print_r()返回该值。

  

500(内部服务器错误)

很可能代码挂起但是在Ajax调用上你看不到。

在每行代码之后通过echo和die调试Ajax以查看它挂起的位置似乎可以通过Ajax调用来实现诀窍:)

感谢 user1291203 让我有机会帮助您调试代码。快乐编码:)