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[] $exportItems */ public function render(array $exportItems, 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($exportItems); // enable basic security measures $sandbox = new SandboxExtension(new ExportPolicy()); $sandbox->enableSandbox(); $this->twig->addExtension($sandbox); $content = $this->twig->render($this->getTemplate(), array_merge([ 'entries' => $exportItems, 'query' => $query, 'summaries' => $summary, 'budgets' => $this->calculateProjectBudget($exportItems, $query, $this->projectStatisticService), 'activity_budgets' => $this->calculateActivityBudget($exportItems, $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 $this->template; } /** * @deprecated since 2.40.0 */ public function setTemplate(string $filename): void { $this->template = '@export/' . $filename; } /** * @deprecated since 2.40.0 */ public function setId(string $id): void { $this->id = $id; } public function getId(): string { return $this->id; } public function getTitle(): string { return $this->title; } }