如何从PrestaShop ModuleFrontController返回带有错误HTTP代码的Ajax响应?

问题描述

我开始使用PrestaShop 1.7.6(在使用Symfony之前),我向PrestaShop写了一些自定义模块,但是现在我想从前端控制器模块向用户发送json数据。如果我使用http代码200发送json,一切正常,但是现在我想使用正确的http代码(例如400)发送错误消息。在Symfony中,我可以使用JsonResponse做到这一点(我在这里尝试这样做,但是没有按预期工作)。我在presta控制器中看到只有两种具有Ajax响应的方法(ajaxDie-已弃用和ajaxRender),但是它们两者不会将http代码响应作为参数,而是始终发送200。

    if (!$product) {
         $json = Tools::jsonEncode(['status' => false]);
         $this->ajaxRender($json);

         //return new JsonResponse($json,Response::HTTP_BAD_REQUEST);// doesn't send proper code
    }

谁能告诉我如何从扩展ModuleFrontController的模块前端控制器发送错误代码?现在对我来说唯一可行的措施是使用HTTP代码200发送错误消息(但我认为使用该代码发送错误一个坏主意)。非常感谢您的帮助。

解决方法

以下显示了使用AJAX发送和接收数据的正确方法。 更多信息,请访问Prestashop Docs

Ajax帖子

    $.ajax({
        type: 'POST',dataType : 'json',url: 'linktoyourfile.php',data: { action: 'getMyrequest' },success: function(data) {
            alert(data.result);
        },error: function(jqXHR,textStatus,errorThrown) {
            alert('Error: ' + textStatus + ' ' + errorThrown);
        }
    });

模块化前端控制器

    class TestModuleFrontController extends ModuleFrontController
    {
        public function init()
        {
            parent::init();
        }

        public function displayAjaxGetMyrequest()
        {
            // ERROR HANDELING
            if ($this->errors) {
                die(Tools::jsonEncode(array('hasError' => true,'errors' => $this->errors)));
            } else {
                echo Tools::json_encode(array('result' => 'test result'));
            }
        }
    }