Как добавить редирект с бэкэнд-контроллера в 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

Я думаю, что может быть непонятно, когда бэкэнд-пользователи перенаправляются (из бэкэнд-контекста) на новую пустую страницу с загрузкой.

Другие вопросы по тегам