Example #1
0
 /**
  * @param WebApplication $app
  * @param Request        $request
  * @param Response       $response
  */
 public function actionGetFile(WebApplication $app, Request $request, Response $response, Security $security)
 {
     if (!$security->hasAccess(new PageActionAccess(AccessMapper::ACTION_FILE), '@temp-staff-book')) {
         throw new ForbiddenException(sprintf('Нет доступа к странице "%s"', Url::to()));
     }
     set_time_limit(0);
     $fs = new Filesystem();
     if (!$fs->exists(App::getAlias('@cache/documents'))) {
         $fs->mkdir(App::getAlias('@cache/documents'));
     }
     if (!$fs->exists(App::getAlias('@temp/documents'))) {
         $fs->mkdir(App::getAlias('@temp/documents'));
     }
     $revision_kvo = (new Kvo())->getRevision();
     $revision_kvp = (new Kvp())->getRevision();
     $filters = md5(serialize($request->query->all()));
     // Поучаем номер текущей в/ч
     if (null === ($vch = $app->vch)) {
         throw new BadRequestException('Данные для экспорта отсутствуют');
     }
     $filename = 'tempstaffbook-N' . $vch->num . '_' . date('Y.m.d_H:i:s') . '.odt';
     $templateSourcePath = App::getAlias('@data/document-templates/odt-tempstaffbook');
     $temporarySourcePath = App::getAlias("@temp/documents/tempstaffbook.{$vch->num}.{$revision_kvo}.{$revision_kvp}.{$filters}.build");
     $cachedFilePath = App::getAlias("@cache/documents/tempstaffbook.{$vch->num}.{$revision_kvo}.{$revision_kvp}.{$filters}.odt");
     // Настраиваем заголовки и отправляем их клиенту
     $response->setFormat(Response::FORMAT_ODT)->headers->set('Set-Cookie', 'fileDownload=true; path=/')->set('Cache-Control', 'max-age=60, must-revalidate')->set('Content-Disposition', "attachment; filename={$filename}");
     $response->sendHeaders();
     /*if ($fs->exists($cachedFilePath) && $app->cacheExportFile) {
           readfile($cachedFilePath);
           return;
       }*/
     $fs->mirror($templateSourcePath, $temporarySourcePath);
     $fs->remove(["{$temporarySourcePath}/content.header.xml.tpl", "{$temporarySourcePath}/content.row.xml.tpl", "{$temporarySourcePath}/content.footer.xml.tpl"]);
     $render = new Render(['templatesBaseDir' => $templateSourcePath]);
     $render->getRender()->addExtension(new OdtTwig());
     $content = $render->render('/content.header.xml.tpl', ['num' => $vch->num]);
     // Создаем поток вывода клиенту
     $stream = $response->createStream(fopen("{$temporarySourcePath}/content.xml", 'w'));
     $stream->write($content);
     if ($request->query->get('controller') == 'missing') {
         $where_kvo = array_merge(['vidub' => '0', 'prib' => '0'], $request->query->get('where', []));
         $where_kvp = ['ub' => '0'];
     } else {
         $where_kvo = ['vidub' => '0', 'prib' => '0'];
         $where_kvp = array_merge(['ub' => '0'], $request->query->get('where', []));
     }
     $bag_kvo = new ParameterBag(['select' => ['view_id', 'view_c2', 'view_c3', 'view_c4', 'view_c5', 'view_c6', 'view_c7', 'view_vid'], 'where' => $where_kvo, 'limit' => $this->config['kvo']['recordsExportLimit'], 'scenarios' => Kvo::SCENARIO_VIEW, 'offset' => 0]);
     $bag_kvp = new ParameterBag(['select' => ['view_id', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7'], 'where' => $where_kvp, 'limit' => $this->config['kvp']['recordsExportLimit'], 'scenarios' => Kvp::SCENARIO_VIEW, 'offset' => 0]);
     do {
         list(, $data_kvo, , ) = $this->api(Kvo::className(), $bag_kvo);
         list(, $data_kvp, , ) = $this->api(Kvp::className(), $bag_kvp);
         $content = $render->render('/content.row.xml.tpl', ['data_kvo' => $data_kvo, 'data_kvp' => $data_kvp, 'vidList' => Kvo::$vidList, 'vidNum' => array_unique(array_map(function ($item) {
             return $item['view_vid'];
         }, array_values($data_kvo)))]);
         $stream->write($content);
         $bag_kvo['offset'] += $bag_kvo['limit'];
         $bag_kvp['offset'] += $bag_kvp['limit'];
     } while (is_array($data_kvo) && is_array($data_kvp) && count($bag_kvo) === $bag_kvo['limit'] && count($bag_kvp) === $bag_kvp['limit']);
     unset($data_kvo);
     unset($data_kvp);
     $content = $render->render('/content.footer.xml.tpl');
     $stream->write($content);
     Zip::make($cachedFilePath)->folder($temporarySourcePath)->exceptByRegExp('/^.*\\.tpl$/i')->add(glob("{$temporarySourcePath}/*"));
     readfile($cachedFilePath);
 }