如何在 shopware 中从后端控制器添加重定向
How to add a redirect from the backend controller in shopware
我已经创建了一个插件,在插件的其他进程完成后,我想从后端的控制器重定向到给定的 url。
我已经创建了一个插件,可以根据订单创建文档,并且工作正常。但是在该过程结束时,我想重定向到可以下载或打开已创建文档的 url。我知道这样做的 url 结构是这样的 (http://localhost:8000/backend/Order/openPdf?id=harshvalueforpdf)。我在本地主机上的 docker 中使用 shopware 版本 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');
}
请查看订单模块的后端控制器。应该是一样的情况。此函数用于 opening/downloading 来自后端的文档:
https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Controllers/Backend/Order.php#L1113
我认为将后端用户重定向(从后端上下文)到带有下载的新空白页面可能会造成混淆。
根据我自己的评价。我认为你遇到的问题是因为这不是一个动作,而只是一个函数,试着让它成为一个动作,然后 运行 它像原来的浏览器一样通过浏览器。
别忘了将其列入白名单。
使用 class 使用 Shopware\Components\CSRFWhitelistAware;
然后
像这样
/**
* {@inheritdoc}
*/
public function getWhitelistedCSRFActions()
{
return [
'youropenPdfActionnamewithoutthewordAction'
];
}
并将 CSRFWhitelistAware 工具添加到您的 class 声明中。
我已经创建了一个插件,在插件的其他进程完成后,我想从后端的控制器重定向到给定的 url。
我已经创建了一个插件,可以根据订单创建文档,并且工作正常。但是在该过程结束时,我想重定向到可以下载或打开已创建文档的 url。我知道这样做的 url 结构是这样的 (http://localhost:8000/backend/Order/openPdf?id=harshvalueforpdf)。我在本地主机上的 docker 中使用 shopware 版本 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');
}
请查看订单模块的后端控制器。应该是一样的情况。此函数用于 opening/downloading 来自后端的文档: https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Controllers/Backend/Order.php#L1113
我认为将后端用户重定向(从后端上下文)到带有下载的新空白页面可能会造成混淆。
根据我自己的评价。我认为你遇到的问题是因为这不是一个动作,而只是一个函数,试着让它成为一个动作,然后 运行 它像原来的浏览器一样通过浏览器。
别忘了将其列入白名单。
使用 class 使用 Shopware\Components\CSRFWhitelistAware;
然后
像这样
/**
* {@inheritdoc}
*/
public function getWhitelistedCSRFActions()
{
return [
'youropenPdfActionnamewithoutthewordAction'
];
}
并将 CSRFWhitelistAware 工具添加到您的 class 声明中。