dispatcher->dispatch($event); return $event->getFields(); } protected function getOptions(TimesheetQuery $query): array { $decimal = false; if (null !== $query->getCurrentUser()) { $decimal = $query->getCurrentUser()->isExportDecimal(); } elseif (null !== $query->getUser()) { $decimal = $query->getUser()->isExportDecimal(); } return ['decimal' => $decimal]; } /** * @param ExportableItem[] $timesheets * @param TimesheetQuery $query * @return Response * @throws \Twig\Error\LoaderError * @throws \Twig\Error\RuntimeError * @throws \Twig\Error\SyntaxError */ public function render(array $timesheets, TimesheetQuery $query): Response { $timesheetMetaFields = $this->findMetaColumns(new TimesheetMetaDisplayEvent($query, TimesheetMetaDisplayEvent::EXPORT)); $customerMetaFields = $this->findMetaColumns(new CustomerMetaDisplayEvent($query->copyTo(new CustomerQuery()), CustomerMetaDisplayEvent::EXPORT)); $projectMetaFields = $this->findMetaColumns(new ProjectMetaDisplayEvent($query->copyTo(new ProjectQuery()), ProjectMetaDisplayEvent::EXPORT)); $activityMetaFields = $this->findMetaColumns(new ActivityMetaDisplayEvent($query->copyTo(new ActivityQuery()), ActivityMetaDisplayEvent::EXPORT)); $event = new UserPreferenceDisplayEvent(UserPreferenceDisplayEvent::EXPORT); $this->dispatcher->dispatch($event); $userPreferences = $event->getPreferences(); $summary = $this->calculateSummary($timesheets); // enable basic security measures $sandbox = new SandboxExtension(new ExportPolicy()); $sandbox->enableSandbox(); $this->twig->addExtension($sandbox); $content = $this->twig->render($this->getTemplate(), array_merge([ 'entries' => $timesheets, 'query' => $query, 'summaries' => $summary, 'budgets' => $this->calculateProjectBudget($timesheets, $query, $this->projectStatisticService), 'activity_budgets' => $this->calculateActivityBudget($timesheets, $query, $this->activityStatisticService), 'timesheetMetaFields' => $timesheetMetaFields, 'customerMetaFields' => $customerMetaFields, 'projectMetaFields' => $projectMetaFields, 'activityMetaFields' => $activityMetaFields, 'userPreferences' => $userPreferences, ], $this->getOptions($query))); $response = new Response(); $response->setContent($content); return $response; } protected function getTemplate(): string { return '@export/' . $this->template; } public function setTemplate(string $filename): HtmlRenderer { $this->template = $filename; return $this; } public function setId(string $id): HtmlRenderer { $this->id = $id; return $this; } public function getId(): string { return $this->id; } }