1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Формирование отчета и загрузка его пользователем

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем infis, 09.02.2014.

Загрузка
  1. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Наткнулся сегодня на проблему. Не знаю, как она должна решаться в рамках XenForo Framework.

    В общем необходимо сформировать некий отчет в виде pdf и отдать его пользователю. В контроллере без проблем формирую этот самый pdf с помощью библиотеки tcpdf. И вот на последнем этапе не могу понять, как же его отдать пользователю. Если его просто сохранить, то нет проблем:
    Код:
    $pdf->Output('report_' . $joint_id. '.pdf', 'F');
    Если его попытаться отдать напрямую вот так:
    Код:
    $pdf->Output('report_' . $joint_id. '.pdf', 'I');
    Вываливается мусор, так как вывод идет непосредственно в страницу при responseView.

    Пробовал делать по аналогии с экспортом xml - ругается, что отдаваемый контент не HTML или что-то в этом духе.

    И вот как правильно отдавать получаемое содержимое pdf пользователю?
     
  2. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    243
    Версия XF:
    1.1.3
    Нужно использовать XenForo_ViewPublic_Attachment_View ну или свой класс возможно, наследующий этот.
    Смысл по сути в 1-й строке - $this->_response->setHeader('Content-type', 'application/octet-stream', true);
     
  3. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Спасибо. Я уже нашел, где у меня была проблема. Банально "подглядел", как отдаются пользователю вложения :)

    P.S. Тему можно закрывать.
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если кому интересно, то в контроллере нужно было указать:
    Код:
    $this->_routeMatch->setResponseType('raw');
    Затем вызываем свой вьювер. В моем случае это было так:
    Код:
    $viewParams = array(
       'pdf' => $pdf,
       'report' => 'report_' . $joint_id. '.pdf'
    );
    
    return $this->responseView('SP_ViewPublic_Report', '', $viewParams);
    Ну а во вьювере должно быть так:
    Код:
    <?php
    
    class SP_ViewPublic_Report extends XenForo_ViewPublic_Base
    {
       public function renderRaw()
       {
          /* @var $pdf TCPDF */
          $pdf = $this->_params['pdf'];
      
          $this->_response->setHeader('Content-type', 'application/pdf', true);
          $this->setDownloadFileName($this->_params['report']);
    
          $this->_response->setHeader('X-Content-Type-Options', 'nosniff');
    
          return $pdf->Output();
       }
    }
    
     
    Risk_plus, Mirovinger и patrig нравится это.

Поделиться этой страницей