我正在学习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;
});
});
答案 0 :(得分:3)
使用 User1291203
,echo
和die
逐行调试代码后,我们发现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 让我有机会帮助您调试代码。快乐编码:)