繁体   English   中英

如何从shopware中的后端控制器添加重定向

[英]How to add a redirect from the backend controller in shopware

我已经创建了一个插件,在完成插件的其他进程后,我想从后端的控制器重定向到给定的URL。

我已经创建了一个插件,可以从订单创建文档,并且工作正常。 但是在流程结束时,我想重定向到可以下载或打开已创建文档的URL。 我知道这样做的网址结构如下( http:// localhost:8000 / backend / Order / openPdf?id = harshvalueforpdf )。 我在本地主机上的docker中使用了商店版本5.5.1。

 public function redirectmyurlAction()
 {
     $harsh = "9ce6b9a9cd5d469386fbb5bd692f9644";
     $search_word = $harsh;
     error_log(print_r(array('Reached redirect action'), true)."\n", 3, Shopware()->DocPath() . '/test.log');
     $this->redirect(
 array(
   'module'=> backend,
     'controller' => 'Order',
     'action' => 'openPdf?id='.$search_word,
   )
 );
 }

我希望当进程到达此操作时,用户将被重定向到创建的URL,然后它应该能够下载或显示pdf。 但它会记录我在重定向之前放置的日志,但不会重定向。 没有记录错误或控制台。 当我在前端放置相同的重定向时,我得到CSRFTokenValidationException,这是我所期望的,但它显示重定向在那里工作,所以为什么不在后端。

更新:

在回复之后,我已经复制了该功能并将其修改如下,但是它记录了所有内容并且仍然无所事事我错过了什么?

 public function openmyPdf($DocHarsh, $orderId)
    {
        error_log(print_r(array('Entered openmyPdf function',$DocHarsh,$orderId,$date), true)."\n", 3, Shopware()->DocPath() . '/error.log');

        $filesystem = $this->container->get('shopware.filesystem.private');
        $file = sprintf('documents/%s.pdf', basename($DocHarsh));

        if ($filesystem->has($file) === false) {
            error_log(print_r(array('Entered if statement, file doesnt exists ',$DocHarsh,$orderId,$date), true)."\n", 3, Shopware()->DocPath() . '/error.log');
            $this->View()->assign([
                'success' => false,
                'data' => $this->Request()->getParams(),
                'message' => 'File not exist',
            ]);

            return;
        }
        // Disable Smarty rendering
        $this->Front()->Plugins()->ViewRenderer()->setNoRender();
        $this->Front()->Plugins()->Json()->setRenderer(false);
        $orderModel = Shopware()->Models()->getRepository(Document::class)->findBy(['hash' =>$DocHarsh]);
        $orderModel = Shopware()->Models()->toArray($orderModel);
        $orderId = $orderModel[0]['documentId'];
        $response = $this->Response();
        $response->setHeader('Cache-Control', 'public');
        $response->setHeader('Content-Description', 'File Transfer');
        $response->setHeader('Content-disposition', 'attachment; filename=' . $orderId . '.pdf');
        $response->setHeader('Content-Type', 'application/pdf');
        $response->setHeader('Content-Transfer-Encoding', 'binary');
        $response->setHeader('Content-Length', $filesystem->getSize($file));
        $response->sendHeaders();
        $response->sendResponse();
        $upstream = $filesystem->readStream($file);
        $downstream = fopen('php://output', 'wb');
        while (!feof($upstream)) {
            fwrite($downstream, fread($upstream, 4096));
        }
        error_log(print_r(array('leaving the pdf function',$DocHarsh,$orderId,$upstream,$downstream), true)."\n", 3, Shopware()->DocPath() . '/error.log');
    }

请查看订单模块的后端控制器。 它应该是相同的情况。 此功能用于从后端打开/下载文档: https//github.com/shopware/shopware/blob/5.5/engine/Shopware/Controllers/Backend/Order.php#L1113

我认为将后端用户(从后端上下文)重定向到带有下载的新空白页可能会让人感到困惑。

根据我自己的评价。 我认为你遇到的问题是因为这不是一个动作,而只是一个函数尝试使它成为一个Action并像原始的那样通过浏览器运行它。

不要忘记将其列入白名单。

使用该类使用Shopware \\ Components \\ CSRFWhitelistAware;

然后

这样的事情

    /**
 * {@inheritdoc}
 */
public function getWhitelistedCSRFActions()
{
    return [
        'youropenPdfActionnamewithoutthewordAction'
    ];
}

并将实现CSRFWhitelistAware添加到您的类声明中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM