我有一个Symfony 3 CRM,我使用ajax调用来删除整个系统中的项目。它使用单个调用,然后使用switch语句来确定用户尝试删除的内容并相应地处理它。
但是,由于某些特殊类型的项目似乎不起作用,它只是重新加载页面。
这是触发按钮(我正在实施bootstrap确认):
<a href="" data-type="unit" id="{{ unit.id }}"
data-toggle="confirmation-singleton"
data-btn-ok-class="btn btn-xs btn-success"
data-btn-cancel-class="btn btn-xs btn-danger"
class="btn btn-xs btn-danger remove-item">
<i class="fa fa-remove no-override"> </i>
</a>
我的ajax要求删除项目:
$('.remove-item').confirmation({
rootSelector: '[data-toggle=confirmation-singleton]',
container: 'body',
onConfirm: function() {
var type = $(this).attr('data-type');
var id = $(this).attr('id');
var data = type + '|' + id;
$.ajax( '/app_dev.php/ajax-call/remove-item/' + data )
.done( function(response) {
if(response != 'success') {
if(response == 'units_exist') {
alert("You cannot delete this item as there are units already linked to it.");
} else if(response == 'no_property') {
alert("Sorry! Property could not be found.");
} else if(response == 'bookings_exist') {
alert("Sorry! This unit has bookings. Please delete the bookings first.");
}
}
});
return false;
},
onCancel: function() {
return false;
}
});
在PHP方面,对于这个特定的例子:
$data = $request->get('data');
$parts = explode("|",$data);
$type = $parts[0];
$id = $parts[1];
// using switch on $type
case 'unit':
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('AppBundle:Unit');
$booking_repo = $em->getRepository('AppBundle:Booking');
$bookings = $booking_repo->findBy(array('unitId' => $id)); // check to see if any bookings exist
if(!empty($bookings)) {
return new Response('bookings_exist');
} else {
$item = $repo->findOneBy(array('id' => $id));
if(!empty($item)) {
$em->remove($item);
$em->flush();
}
}
break;
在这个例子中,它应该返回'bookings_exist',如果我直接转到浏览器中的URL,它会显示此消息 - 但是,它只是重新加载页面而不是按照ajax中的规定抛出警报呼叫。我知道这个调用有效,因为它成功删除了CRM中的其他项目,它似乎就是因为这样的条件而无法删除它。
我可能会遗漏一些非常明显的东西,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
success
和error
处理程序jQuery的Ajax对象中的其他处理程序充其量不可靠,并且在版本和浏览器之间的行为和支持各不相同。
如果jQuery失败,并且不返回false,该元素将执行它的默认行为,在您的情况下,<a href=""></a>
会重新加载页面。
onConfirm: function(e) {
e.preventDefault();
var type = $(this).attr('data-type');
var id = $(this).attr('id');
var data = type + '|' + id;
$.ajax( '/app_dev.php/ajax-call/remove-item/' + data )
.success( function(response) {
if (response.errorMessage) {
alert(response.errorMessage);
}
})
.error( function(xhr, status, error) {
console.log(status + '\n' + error);
})
;
return false;
}
if(!empty($bookings)) {
return new JsonResponse([
'errorMessage' => 'Sorry! Property could not be found.'
);
}
答案 1 :(得分:0)
而不是仅添加.done(),您还应该使用
.fail(function( jqXHR, textStatus, errorThrown ) {});
捕捉任何错误。
答案 2 :(得分:0)
如果预订不为空,则该功能将返回新的回复&#39; booking_exist&#39;并停止......它不会进入下一个陈述。
因此,如果您需要删除该项目,请改用此代码:
if(empty($bookings)) {
return new Response('bookings_not_exist');
} else {
$item = $repo->findOneBy(array('id' => $id));
if(!empty($item)) {
$em->remove($item);
$em->flush();
}