Source of file BaseDocumentTemplate.php

Size: 3,227 Bytes - Last Modified: 2019-09-16T10:31:02+00:00

/home/vagrant/www/document-templates/src/DocumentTemplates/BaseDocumentTemplate.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
<?php


namespace BWF\DocumentTemplates\DocumentTemplates;

use BWF\DocumentTemplates\Exceptions\InvalidClassException;
use BWF\DocumentTemplates\Layouts\LayoutInterface;
use BWF\DocumentTemplates\Renderers\PdfRendererInterface;
use BWF\DocumentTemplates\TemplateDataSources\TemplateDataSource;
use BWF\DocumentTemplates\TemplateDataSources\TemplateDataSourceFactory;
use BWF\DocumentTemplates\TemplateDataSources\TemplateDataSourceInterface;

trait BaseDocumentTemplate
{
    /**
     * @var \BWF\DocumentTemplates\Layouts\Layout
     */
    protected $layout;

    /**
     * @var \BWF\DocumentTemplates\Renderers\Renderer
     */
    protected $renderer;

    /**
     * Stores the datasource instances containing the renderable data. Used for template rendering.
     *
     * @var TemplateDataSource[]
     */
    private $templateData = [];

    protected abstract function dataSources();

    /**
     * @param array|\stdClass|TemplateDataSourceInterface $data
     * @param string $name
     * @param bool $isIterable
     * @param string $iterableName Use as an iterable variable in the template
     * @return TemplateDataSource
     */
    protected function dataSource($data, $name = '', $isIterable = false, $iterableName = '')
    {
        $templateDataSource = TemplateDataSourceFactory::build($data, $name);
        if ($isIterable) {
            $templateDataSource = collect([$templateDataSource]);
            $templateDataSource = TemplateDataSourceFactory::build($templateDataSource, $iterableName);
        }

        return $templateDataSource;
    }

    public function setLayout(LayoutInterface $layout)
    {
        $this->layout = $layout;
    }

    public function addTemplateData($data, $name = '')
    {
        $this->templateData[] = TemplateDataSourceFactory::build($data, $name);
    }

    public function getTemplatePlaceholders()
    {
        $placeholders = [];

        foreach ($this->dataSources() as $dataSource) {
            $placeholders[] = $dataSource->getPlaceholders();
        }

        return $placeholders;
    }

    public function render()
    {
        return $this->renderer->render(
            $this->layout,
            $this->getTemplates(),
            $this->templateData
        );
    }

    public function renderPdf($filePath)
    {
        $renderer = $this->getPdfRenderer();

        $renderer->render(
            $this->layout,
            $this->getTemplates(),
            $this->templateData,
            $filePath
        );

        return $filePath;
    }

    public function setRenderer($renderer)
    {
        $this->renderer = $renderer;
    }

    /**
     * @return PdfRendererInterface
     * @throws InvalidClassException
     */
    private function getPdfRenderer() : PdfRendererInterface
    {
        $pdfRendererClass = config('document_templates.pdf_renderer');
        $renderer = new $pdfRendererClass();

        if (!$renderer instanceof PdfRendererInterface) {
            throw new InvalidClassException(sprintf('The configured pdf renderer (%s) is invalid. The renderer should implement the %s',
                $pdfRendererClass,
                PdfRendererInterface::class));
        }
        return $renderer;
    }
}