Your IP : 216.73.217.154


Current Path : /var/www/html/dynaweb-starter/plugin/dynaweb-site/src/Classes/
Upload File :
Current File : /var/www/html/dynaweb-starter/plugin/dynaweb-site/src/Classes/LoadComponents.php

<?php

namespace Dynaweb\DynawebSite\Classes;

use Illuminate\Support\Facades\Storage;
use Dynaweb\DynawebSite\Enums\FrontendComponentType;
use Dynaweb\DynawebSite\Models\FrontendComponent;
use Illuminate\Support\Facades\View;

class LoadComponents
{
    private ?String $site_slug;

    private ?String $page_slug;

    private $meta;

    public const BASE_PATH = '/storage/app/';

    public const LAYOUT_SITE_PATH = 'LAYOUTS.SITE.';

    public const LAYOUT_PAGE_PATH = 'LAYOUTS.PAGE.';

    public const LAYOUT_FILE_PATH = 'PHP.';

    public const PAGE_ENTRY_PATH = '/app/ENTRY/PAGE/';

    public const PAGE_ENTRY_EXT = '.blade.php';

    public const SHARED_VARIABLE = '__shared__';

    public function __construct(
        public $handler,
        public $meta_provider
    ) {
    }

    /**
     * Handle the component loading
     */
    public function handle()
    {

        if(empty($this->handler->site_slug) || empty($this->handler->page_slug)) {
            throw new \Exception("Not enough slug information send");
        }

        return $this->loadMeta();

    }

    public function loadMeta()
    {
        $this->meta = json_decode($this->meta_provider->getSiteMeta());

        return $this;
    }

    public function exportComponent()
    {
        $__site_slug__ = $this->handler->site_slug;
        $__page_slug__ = $this->handler->page_slug;
        $__component__ = $this->meta?->{$__site_slug__}?->page?->{$__page_slug__}?->component;

        $__export_component__ = [];

        $__view__ = $this->setViewNamespace();

        $__path__ = storage_path(self::PAGE_ENTRY_PATH) . $__page_slug__ . self::PAGE_ENTRY_EXT;
        
        if(file_exists($__path__)) {
            include($__path__);
        }

        /** shared variable */
        $__shared__ =  get_defined_vars();

        $__shared__ = $this->unsetShared($__shared__);

        if(!empty($__component__)) {
            foreach ($__component__ as $ckey => $cdata) {
                $__export_component__[$cdata->component_code] = View('storage::' . self::LAYOUT_FILE_PATH . $cdata->component_code, $__shared__);
                ;
            }
        }
        
        $export = [];

        $export = $this->exportHeader($export, $__shared__);

        $export = $this->exportPageLayout($export, $__export_component__, $__shared__);

        $export = $this->exportFooter($export, $__shared__);

        /** export shared variable */
        $export += $__shared__;

        return $export;
    }

    public function setViewNamespace()
    {
        return View::addNamespace('storage', base_path() . self::BASE_PATH);
        ;
    }

    public function exportHeader($export,  $__shared__)
    {
        $site_slug = $this->handler->site_slug;
        $header = $this->meta?->{$site_slug}?->header;

        $export['__header__'] = View('storage::' . self::LAYOUT_FILE_PATH . $header, $__shared__);

        return $export;
    }

    public function exportFooter($export, $__shared__)
    {
        $site_slug = $this->handler->site_slug;
        $footer = $this->meta?->{$site_slug}?->footer;

        $export['__footer__'] = View('storage::' . self::LAYOUT_FILE_PATH . $footer, $__shared__);

        return $export;
    }


    public function exportPageLayout($export, $component)
    {
        $this->setViewNamespace();

        $page_slug = $this->handler->page_slug;

        $export['__page__'] = View('storage::' . self::LAYOUT_PAGE_PATH . $page_slug, $component);

        return $export;
    }

    public function exportSiteLayout()
    {
        $this->setViewNamespace();

        $site_slug = $this->handler->site_slug;

        return View('storage::' . self::LAYOUT_SITE_PATH . $site_slug);
    }

    private function unsetShared($shared) {
        unset($shared['__component__']);
        unset($shared['__export_component__']);
        unset($shared['__view__']);
        unset($shared['__path__']);

        return $shared;
    }
}