* @git Joomla Component Builder * @copyright Copyright (C) 2015 Vast Development Method. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace VDM\Joomla\Componentbuilder\Compiler\Component; use VDM\Joomla\Componentbuilder\Compiler\Factory as Compiler; use VDM\Joomla\Componentbuilder\Compiler\Config; use VDM\Joomla\Componentbuilder\Compiler\Registry; use VDM\Joomla\Componentbuilder\Compiler\Interfaces\Component\SettingsInterface as Settings; use VDM\Joomla\Componentbuilder\Compiler\Component; use VDM\Joomla\Componentbuilder\Compiler\Model\Createdate; use VDM\Joomla\Componentbuilder\Compiler\Model\Modifieddate; use VDM\Joomla\Componentbuilder\Compiler\Utilities\Structure; use VDM\Joomla\Utilities\ObjectHelper; use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix; /** * Multiple Files and Folders Builder Class * * @since 3.2.0 */ final class Structuremultiple { /** * Compiler Config * * @var Config * @since 3.2.0 */ protected Config $config; /** * The compiler registry * * @var Registry * @since 3.2.0 */ protected Registry $registry; /** * Compiler Component Joomla Version Settings * * @var Settings * @since 3.2.0 */ protected Settings $settings; /** * Compiler Component * * @var Component * @since 3.2.0 **/ protected Component $component; /** * Compiler Model Createdate * * @var Createdate * @since 3.2.0 **/ protected Createdate $createdate; /** * Compiler Model Modifieddate * * @var Modifieddate * @since 3.2.0 **/ protected Modifieddate $modifieddate; /** * Compiler Utility to Build Structure * * @var Structure * @since 3.2.0 **/ protected Structure $structure; /** * Constructor * * @param Config|null $config The compiler config object. * @param Registry|null $registry The compiler registry object. * @param Settings|null $settings The compiler component Joomla version settings object. * @param Component|null $component The component class. * @param Createdate|null $createdate The compiler model to get create date class. * @param Modifieddate|null $modifieddate The compiler model to get modified date class. * @param Structure|null $structure The compiler structure to build dynamic folder and files class. * * @since 3.2.0 */ public function __construct(?Config $config = null, ?Registry $registry = null, ?Settings $settings = null, ?Component $component = null, ?Createdate $createdate = null, ?Modifieddate $modifieddate = null, ?Structure $structure = null) { $this->config = $config ?: Compiler::_('Config'); $this->registry = $registry ?: Compiler::_('Registry'); $this->settings = $settings ?: Compiler::_('Component.Settings'); $this->component = $component ?: Compiler::_('Component'); $this->createdate = $createdate ?: Compiler::_('Model.Createdate'); $this->modifieddate = $modifieddate ?: Compiler::_('Model.Modifieddate'); $this->structure = $structure ?: Compiler::_('Utilities.Structure'); } /** * Build the Multiple Files & Folders * * @return bool * @since 3.2.0 */ public function build(): bool { $success = false; if ($this->settings->exists()) { $success = $this->admin(); $success = $this->site() || $success; $success = $this->custom() || $success; } return $success; } /** * Build the Dynamic Admin Files & Folders * * @return bool * @since 3.2.0 */ protected function admin(): bool { if (!$this->component->isArray('admin_views')) { return false; } // check if we have a dynamic dashboard if (!$this->registry->get('build.dashboard')) { // setup the default dashboard $target = ['admin' => $this->component->get('name_code')]; $this->structure->build($target, 'dashboard'); } $config = []; $checkin = false; foreach ($this->component->get('admin_views') as $view) { if (!$this->isValidAdminView($view, $config)) { continue; } $this->buildAdminView($view, $config); // quick set of checkin once if (!$checkin && isset($view['checkin']) && $view['checkin'] == 1) { // switch to add checking to config $checkin = true; $this->config->set('add_checkin', $checkin); } } return true; } /** * Build the Dynamic Site Files & Folders * * @return bool * @since 3.2.0 */ protected function site(): bool { if (!$this->component->isArray('site_views')) { return false; } $config = []; foreach ($this->component->get('site_views') as $view) { if (!$this->isValidView($view, $config)) { continue; } $this->buildView($view, $config, 'site'); } return true; } /** * Build the Dynamic Custom Admin Files & Folders * * @return bool * @since 3.2.0 */ protected function custom(): bool { if (!$this->component->isArray('custom_admin_views')) { return false; } $config = []; foreach ($this->component->get('custom_admin_views') as $view) { if (!$this->isValidView($view, $config)) { continue; } $this->buildView($view, $config, 'custom_admin'); } return true; } /** * Check if the view is a valid view * * @param array $view * @param array $config * * @return bool * @since 3.2.0 */ private function isValidAdminView(array $view, array &$config): bool { if (!isset($view['settings']) || !ObjectHelper::check($view['settings']) || ((!isset($view['settings']->name_list) || $view['settings']->name_list == 'null') && (!isset($view['settings']->name_single) || $view['settings']->name_single == 'null'))) { return false; } $created = $this->createdate->get($view); $modified = $this->modifieddate->get($view); $config = [ Placefix::_h('CREATIONDATE') => $created, Placefix::_h('BUILDDATE') => $modified, Placefix::_h('VERSION') => $view['settings']->version ]; return true; } /** * Check if the view is a valid view * * @param array $view * @param array $config * * @return bool * @since 3.2.0 */ private function isValidView(array $view, array &$config): bool { if (!isset($view['settings']) || !ObjectHelper::check($view['settings']) || !isset($view['settings']->main_get) || !ObjectHelper::check($view['settings']->main_get) || !isset($view['settings']->main_get->gettype) || ($view['settings']->main_get->gettype != 1 && $view['settings']->main_get->gettype != 2)) { return false; } $created = $this->createdate->get($view); $modified = $this->modifieddate->get($view); $config = [ Placefix::_h('CREATIONDATE') => $created, Placefix::_h('BUILDDATE') => $modified, Placefix::_h('VERSION') => $view['settings']->version ]; return true; } /** * Build the admin view * * @param array $view * @param array $config * * @return void * @since 3.2.0 */ private function buildAdminView(array $view, array $config) { // build the admin edit view if ($view['settings']->name_single != 'null') { $target = ['admin' => $view['settings']->name_single]; $this->structure->build($target, 'single', false, $config); // build the site edit view (of this admin view) if (isset($view['edit_create_site_view']) && is_numeric($view['edit_create_site_view']) && $view['edit_create_site_view'] > 0) { // setup the front site edit-view files $target = ['site' => $view['settings']->name_single]; $this->structure->build($target, 'edit', false, $config); } } // build the list view if ($view['settings']->name_list != 'null') { $target = ['admin' => $view['settings']->name_list]; $this->structure->build($target, 'list', false, $config); } } /** * Build the custom view * * @param array $view * @param array $config * @param string $type * * @return void * @since 3.2.0 */ private function buildView(array $view, array $config, string $type) { $target = [$type => $view['settings']->code]; $view_type = ($view['settings']->main_get->gettype == 1) ? 'single' : 'list'; $this->structure->build($target, $view_type, false, $config); } }