createEntityPrinter()->print($this->template, $entity, $params, $data); } /** * @param Collection $collection * @throws Error */ public function printCollection( Collection $collection, ?Params $params, ?IdDataMap $idDataMap = null ): Contents { $params = $params ?? new Params(); $idDataMap = $idDataMap ?? new IdDataMap(); if ($this->hasCollectionPrinter()) { return $this->createCollectionPrinter()->print($this->template, $collection, $params, $idDataMap); } $printer = $this->createEntityPrinter(); $zipper = new Zipper(); foreach ($collection as $entity) { $data = $idDataMap->get($entity->getId()) ?? new Data(); $itemContents = $printer->print($this->template, $entity, $params, $data); $zipper->add($itemContents, $entity->getId()); } $zipper->archive(); return new ZipContents($zipper->getFilePath()); } /** * @throws Error */ private function createEntityPrinter(): EntityPrinter { /** @var ?class-string $className */ $className = $this->metadata ->get(['app', 'pdfEngines', $this->engine, 'implementationClassNameMap', 'entity']) ?? null; if (!$className) { throw new Error("Unknown PDF engine '{$this->engine}', type 'entity'."); } return $this->injectableFactory->create($className); } /** * @throws Error */ private function createCollectionPrinter(): CollectionPrinter { $className = $this->getCollectionPrinterClassName(); if (!$className) { throw new Error("Unknown PDF engine '{$this->engine}', type 'collection'."); } return $this->injectableFactory->create($className); } private function hasCollectionPrinter(): bool { return (bool) $this->getCollectionPrinterClassName(); } /** * @return ?class-string */ private function getCollectionPrinterClassName(): ?string { /** @var ?class-string */ return $this->metadata ->get(['app', 'pdfEngines', $this->engine, 'implementationClassNameMap', 'collection']) ?? null; } }