Source of file DocumentTemplatesController.php

Size: 6,225 Bytes - Last Modified: 2019-07-03T08:35:57+00:00

/home/vagrant/www/document-templates/src/Http/Controllers/DocumentTemplatesController.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
<?php


namespace BWF\DocumentTemplates\Http\Controllers;

use BWF\DocumentTemplates\DocumentTemplates\DocumentTemplateFactory;
use BWF\DocumentTemplates\DocumentTemplates\DocumentTemplateModel;
use BWF\DocumentTemplates\DocumentTemplates\DocumentTemplateModelInterface;
use BWF\DocumentTemplates\EditableTemplates\EditableTemplate;
use BWF\DocumentTemplates\Http\Responses\DocumentTemplateResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

class DocumentTemplatesController extends Controller
{
    use ManagesDocumentTemplates;

    protected $documentClasses = [];

    protected function createDocumentTemplateModelFromRequest(Request $request, DocumentTemplateModelInterface $documentTemplateModel = null)
    {
        $name = $request->name;
        $layout = $request->layout;
        $documentClass = $request->document_class;

        $availableLayouts = $this->getAvailableLayouts();

        if($documentTemplateModel === null){
            $modelClass = config('document_templates.model_class', DocumentTemplateModel::class);
            $documentTemplateModel = new $modelClass();
        }

        if($name){
            $documentTemplateModel->setAttribute('name', $name);
        }

        if($layout && $availableLayouts->contains($layout)){
            $documentTemplateModel->setAttribute('layout', $layout);
        }

        if($documentClass && collect($this->documentClasses)->contains($documentClass)){
            $documentTemplateModel->setAttribute('document_class', $documentClass);
        }


        return $documentTemplateModel;
    }

    /**
     * @param Request $request
     * @param DocumentTemplateModelInterface $documentTemplateModel
     * @return DocumentTemplateResponse
     */
    protected function _save(Request $request, DocumentTemplateModelInterface $documentTemplateModel)
    {
        $documentTemplate = $this->createDocumentTemplateModelFromRequest($request, $documentTemplateModel);
        $status = $documentTemplate->save();

        $savedTemplates = [];

        foreach($request->templates as $template){
            $editableTemplate = EditableTemplate::firstOrNew(['id' => ($template['id'] ?? null) ]);
            $editableTemplate->document_template_id = $documentTemplate->id;
            $editableTemplate->fill($template);
            $editableTemplate->save();
            $savedTemplates[] = $editableTemplate;
        }

        $result = new DocumentTemplateResponse(
            $status,
            $documentTemplate,
            [],
            [],
            collect($savedTemplates)
        );

        return $result;
    }

    public function templates(Request $request, DocumentTemplateModelInterface $documentTemplateModel = null)
    {
        $documentTemplate = $this->createDocumentTemplateModelFromRequest($request, $documentTemplateModel);

        return $this->getTemplates($documentTemplate);
    }

    public function placeholders(Request $request, DocumentTemplateModelInterface $documentTemplateModel = null)
    {
        $documentTemplate = $this->createDocumentTemplateModelFromRequest($request, $documentTemplateModel);

        return $this->getPlaceholders($documentTemplate);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @throws \Exception
     * @return mixed
     */
    public function create()
    {
        $layouts = $this->getAvailableLayouts();
        $documentTemplate = new DocumentTemplateModel();
        $documentTemplate->document_class = $this->documentClasses[0];
        $documentTemplate->layout = $layouts[0];

        return $this->edit($documentTemplate);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $documentTemplate = $this->createDocumentTemplateModelFromRequest($request);

        $result = $this->_save($request, $documentTemplate);
        $result->redirect = route('document-templates.edit', $documentTemplate->id);

        return response()->json($result);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  DocumentTemplateModelInterface $documentTemplateModel
     * @throws \Exception
     * @return \Illuminate\Http\Response
     */
    public function edit(DocumentTemplateModelInterface $documentTemplateModel)
    {
        $layouts = $this->getAvailableLayouts();
        $documentClasses = collect($this->documentClasses);
        $placeholders = $this->getPlaceholders($documentTemplateModel);
        $templates = $this->getTemplates($documentTemplateModel);

        $params = [
            'documentClasses' => $documentClasses,
            'documentTemplate' => $documentTemplateModel,
            'layouts' => $layouts,
            'placeholders' => $placeholders,
            'templates' => $templates
        ];

        $params['data'] = $params;

        return view('document-templates::document-templates.edit', $params);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  DocumentTemplateModelInterface $documentTemplateModel
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, DocumentTemplateModelInterface $documentTemplateModel)
    {
        $result = $this->_save($request, $documentTemplateModel);

        return response()->json($result);
    }

    public function show(Request $request, DocumentTemplateModelInterface $documentTemplateModel){
        $documentTemplate = DocumentTemplateFactory::build($documentTemplateModel);

        $params = compact(
            'documentTemplate'
        );

        return view('document-templates::document-templates.show', $params);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $documentTemplates = DocumentTemplateModel::all();

        $params = compact(
            'documentTemplates'
        );

        return view('document-templates::document-templates.index', $params);
    }

}