Как добавить редирект с бэкэнд-контроллера в shopware
Я создал плагин, и после того, как другие процессы плагина завершены, я бы хотел перенаправить на заданный URL-адрес из контроллера в серверной части.
Я создал плагин, который создает документы из заказов и работает нормально. Однако в конце процесса я хотел бы перенаправить на URL, который может загрузить или открыть документ, который был создан. я знаю, что URL для этого структурирован так ( http://localhost:8000/backend/Order/openPdf?id=harshvalueforpdf). Я использую Shopware версии 5.5.1 в Docker на моем локальном хосте.
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');
}
2 ответа
По моей собственной оценке. Я думаю, что проблема у вас в том, что это не действие, а просто функция, попробуйте сделать его действием и запустить его через браузер, как в оригинале.
Не забудьте добавить его в белый список.
используйте класс use Shopware\Components\CSRFWhitelistAware;
затем
что-то вроде этого
/**
* {@inheritdoc}
*/
public function getWhitelistedCSRFActions()
{
return [
'youropenPdfActionnamewithoutthewordAction'
];
}
а также добавьте реализации CSRFWhitelistAware в объявление вашего класса.
Пожалуйста, посмотрите на бэкэнд-контроллер модуля заказа. Должен быть такой же случай. Эта функция используется для открытия / загрузки документа из серверной части: https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Controllers/Backend/Order.php
Я думаю, что может быть непонятно, когда бэкэнд-пользователи перенаправляются (из бэкэнд-контекста) на новую пустую страницу с загрузкой.