diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 2a76f31..ee4f20f 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -27,6 +27,7 @@ use Modules\Media\Models\CollectionMapper; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\NullMedia; use Modules\Media\Models\PathSettings; +use Modules\Admin\Models\SettingsEnum as AdminSettingsEnum; use Modules\Media\Models\Reference; use Modules\Media\Models\ReferenceMapper; use Modules\Tag\Models\NullTag; @@ -37,7 +38,9 @@ use phpOMS\Message\NotificationLevel; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; +use phpOMS\System\MimeType; use phpOMS\Utils\Parser\Markdown\Markdown; +use phpOMS\Views\View; /** * Calendar controller class. @@ -624,4 +627,87 @@ final class ApiController extends Controller return []; } + + public function apiEditorExport(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void + { + /** @var \Modules\Editor\Models\EditorDoc $doc */ + $doc = EditorDocMapper::get() + ->with('media') + ->where('id', (int) $request->getData('id')) + ->execute(); + + $type = $request->getDataString('type'); + $mimes = $type === null ? $request->header->get('content-type') : [$type]; + + foreach ($mimes as $mime) { + if ($mime === MimeType::M_TEXT) { + $response->header->set('Content-Type', $mime); + $response->set('', $doc->plain); + + return; + } elseif ($mime === MimeType::M_HTML) { + $response->header->set('Content-Type', $mime); + $response->set('', Markdown::parse($doc->plain)); + + return; + } elseif ($mime === MimeType::M_PDF) { + $response->header->set('Content-Type', $mime); + + require_once __DIR__ . '/../../../Resources/tcpdf/tcpdf.php'; + + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/Editor/Theme/Api/editor-pdf'); + + /** @var \Model\Setting[] $settings */ + $settings = $this->app->appSettings->get(null, + [ + AdminSettingsEnum::DEFAULT_TEMPLATES, + AdminSettingsEnum::DEFAULT_ASSETS, + ], + unit: $this->app->unitId, + module: 'Admin' + ); + + if (empty($settings)) { + /** @var \Model\Setting[] $settings */ + $settings = $this->app->appSettings->get(null, + [ + AdminSettingsEnum::DEFAULT_TEMPLATES, + AdminSettingsEnum::DEFAULT_ASSETS, + ], + unit: null, + module: 'Admin' + ); + } + + /** @var \Modules\Media\Models\Collection $defaultTemplates */ + $defaultTemplates = CollectionMapper::get() + ->with('sources') + ->where('id', (int) $settings[AdminSettingsEnum::DEFAULT_TEMPLATES]->content) + ->execute(); + + /** @var \Modules\Media\Models\Collection $defaultAssets */ + $defaultAssets = CollectionMapper::get() + ->with('sources') + ->where('id', (int) $settings[AdminSettingsEnum::DEFAULT_ASSETS]->content) + ->execute(); + + $view->setData('defaultTemplates', $defaultTemplates); + $view->setData('defaultAssets', $defaultAssets); + $view->setData('pdf', $pdf); + $view->setData('doc', $doc); + + $response->set('', $view->render()); + + return; + } elseif ($mime === MimeType::M_DOC || $mime === MimeType::M_DOCX) { + $response->header->set('Content-Type', $mime); + + return; + } + } + + $response->header->set('Content-Type', MimeType::M_TEXT); + $response->set('', $doc->plain); + } } diff --git a/Theme/Api/editor-doc.tpl.php b/Theme/Api/editor-doc.tpl.php new file mode 100644 index 0000000..ce21851 --- /dev/null +++ b/Theme/Api/editor-doc.tpl.php @@ -0,0 +1,41 @@ +getData('defaultTemplates') + ->findFile('.pdf.php') + ->getAbsolutePath(); + +/** @var \Modules\Editor\Models\EditorDoc $doc */ +$doc = $this->getData('doc') ?? new NullEditorDoc(); + +// Set up default pdf template +/** @phpstan-import-type DefaultPdf from ../../../../Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php */ +$word = new DefaultWord(); +$section = $word->createFirstPage(); + +\PhpOffice\PhpWord\Shared\Html::addHtml($section, Markdown::parse($doc->plain)); + +$file = \tempnam(\sys_get_temp_dir(), 'oms_'); +$word->save($file, 'Word2007'); + +$content = \file_get_contents($file); +if ($content !== false) { + echo $content; +} + +\unlink($file); diff --git a/Theme/Api/editor-pdf.tpl.php b/Theme/Api/editor-pdf.tpl.php new file mode 100644 index 0000000..7207727 --- /dev/null +++ b/Theme/Api/editor-pdf.tpl.php @@ -0,0 +1,72 @@ +getData('defaultTemplates') + ->findFile('.pdf.php') + ->getAbsolutePath(); + +/** @var \Modules\Editor\Models\EditorDoc $doc */ +$doc = $this->getData('doc') ?? new NullEditorDoc(); + +// Set up default pdf template +/** @phpstan-import-type DefaultPdf from ../../../../Admin/Install/Media/PdfDefaultTemplate/pdfTemplate.pdf.php */ +$pdf = new DefaultPdf(); + +$pdf->setHeaderData( + $this->getData('defaultTemplates')->findFile('logo.png')->getAbsolutePath(), 15, + $this->getData('logo_name') ?? 'Jingga', + $this->getData('slogan') ?? 'Business solutions made simple.' +); +$pdf->setCreator($this->getData('creator') ?? 'Jingga'); +$pdf->setAuthor($this->getData('creator') ?? 'Jingga'); +$pdf->setTitle($this->getData('title') ?? $bill->type->getL11n()); +$pdf->setSubject($this->getData('subtitle') ?? ''); +$pdf->setKeywords(\implode(', ', $this->getData('keywords') ?? [])); +$pdf->language = $bill->getLanguage(); + +$pdf->attributes['legal_name'] = $this->getData('legal_company_name') ?? 'Jingga e.K.'; +$pdf->attributes['address'] = $this->getData('company_address') ?? 'Gartenstr. 26'; +$pdf->attributes['city'] = $this->getData('company_city') ?? '61206 Woellstadt'; + +$pdf->attributes['ceo'] = $this->getData('company_ceo') ?? 'Dennis Eichhorn'; +$pdf->attributes['tax_office'] = $this->getData('company_tax_office') ?? 'HRB ???'; +$pdf->attributes['tax_number'] = $this->getData('company_tax_id') ?? '123456789'; + +$pdf->attributes['bank_name'] = $this->getData('company_bank_name') ?? 'Volksbank Mittelhessen'; +$pdf->attributes['swift'] = $this->getData('company_swift') ?? '.....'; +$pdf->attributes['bank_account'] = $this->getData('company_bank_account') ?? '.....'; + +$pdf->attributes['website'] = $this->getData('company_website') ?? 'www.jingga.app'; +$pdf->attributes['email'] = $this->getData('company_email') ?? 'info@jingga.app'; +$pdf->attributes['phone'] = $this->getData('company_phone') ?? '+49 0152 ????'; + +$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); + +// add a page +$pdf->AddPage(); +$topPos = $pdf->getY(); + +$doc = $this->getData('doc') ?? new NullEditorDoc(); + +$pdf->writeHTML(Markdown::parse($doc->plain)); + +//Close and output PDF document +$pdf->Output( + $this->getData('path') ?? ($doc->createdAt->format('Y-m-d') . '_' . $doc->id . '.pdf'), + 'I' +);