| 
<?php
 /**
 * Boot.php - Jaxon application bootstrapper
 *
 * @package jaxon-core
 * @author Thierry Feuzeu <[email protected]>
 * @copyright 2019 Thierry Feuzeu <[email protected]>
 * @license https://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
 * @link https://github.com/jaxon-php/jaxon-core
 */
 
 namespace Jaxon\App;
 
 use Jaxon\Utils\Config\Config;
 
 class Bootstrap
 {
 use \Jaxon\Features\Event;
 
 /**
 * The library options
 *
 * @var array
 */
 private $aLibOptions = [];
 
 /**
 * The application options
 *
 * @var array
 */
 private $aAppOptions = [];
 
 /**
 * The Ajax endpoint URI
 *
 * @var string
 */
 private $sUri = '';
 
 /**
 * The js code URI
 *
 * @var string
 */
 private $sJsUri = '';
 
 /**
 * The js code dir
 *
 * @var string
 */
 private $sJsDir = '';
 
 /**
 * Export the js code
 *
 * @var boolean
 */
 private $bExportJs = false;
 
 /**
 * Minify the js code
 *
 * @var boolean
 */
 private $bMinifyJs = false;
 
 /**
 * Set the library options
 *
 * @param array       $aLibOptions    The library options
 *
 * @return Bootstrap
 */
 public function lib(array $aLibOptions)
 {
 $this->aLibOptions = $aLibOptions;
 return $this;
 }
 
 /**
 * Set the applications options
 *
 * @param array       $aAppOptions    The application options
 *
 * @return Bootstrap
 */
 public function app(array $aAppOptions)
 {
 $this->aAppOptions = $aAppOptions;
 return $this;
 }
 
 /**
 * Set the ajax endpoint URI
 *
 * @param string  $sUri   The ajax endpoint URI
 *
 * @return Bootstrap
 */
 public function uri($sUri)
 {
 $this->sUri = $sUri;
 return $this;
 }
 
 /**
 * Set the javascript code
 *
 * @param boolean   $bExportJs      Whether to export the js code in a file
 * @param string    $sJsUri         The URI to access the js file
 * @param string    $sJsDir         The directory where to create the js file
 * @param boolean   $bMinifyJs      Whether to minify the exported js file
 *
 * @return Bootstrap
 */
 public function js($bExportJs, $sJsUri = '', $sJsDir = '', $bMinifyJs = false)
 {
 $this->sJsUri = $sJsUri;
 $this->sJsDir = $sJsDir;
 $this->bExportJs = $bExportJs;
 $this->bMinifyJs = $bMinifyJs;
 return $this;
 }
 
 /**
 * Set the Jaxon application options.
 *
 * @param Config        $xAppConfig        The config options
 *
 * @return void
 */
 private function setupApp($xAppConfig)
 {
 $di = jaxon()->di();
 // Register user functions and classes
 $di->getPluginManager()->registerFromConfig($xAppConfig);
 // Save the view namespaces
 $di->getViewManager()->addNamespaces($xAppConfig);
 }
 
 /**
 * Wraps the module/package/bundle setup method.
 *
 * @return void
 */
 public function run()
 {
 $jaxon = jaxon();
 $di = $jaxon->di();
 
 // Event before setting up the module
 $this->triggerEvent('pre.setup');
 
 // Setup the lib config options.
 $di->getConfig()->setOptions($this->aLibOptions);
 
 // Event before the module has set the config
 $this->triggerEvent('pre.config');
 
 // Get the app config options.
 $xAppConfig = $di->newConfig($this->aAppOptions);
 $xAppConfig->setOption('options.views.default', 'default');
 // Setup the app.
 $this->setupApp($xAppConfig);
 
 // Event after the module has read the config
 $this->triggerEvent('post.config');
 
 // Use the Composer autoloader. It's important to call this before triggers and callbacks.
 // $jaxon->useComposerAutoloader();
 // Jaxon library settings
 if(!$jaxon->hasOption('js.app.export'))
 {
 $jaxon->setOption('js.app.export', $this->bExportJs);
 }
 if(!$jaxon->hasOption('js.app.minify'))
 {
 $jaxon->setOption('js.app.minify', $this->bMinifyJs);
 }
 if(!$jaxon->hasOption('js.app.uri') && $this->sJsUri != '')
 {
 $jaxon->setOption('js.app.uri', $this->sJsUri);
 }
 if(!$jaxon->hasOption('js.app.dir') && $this->sJsDir != '')
 {
 $jaxon->setOption('js.app.dir', $this->sJsDir);
 }
 // Set the request URI
 if(!$jaxon->hasOption('core.request.uri') && $this->sUri != '')
 {
 $jaxon->setOption('core.request.uri', $this->sUri);
 }
 
 // Event after setting up the module
 $this->triggerEvent('post.setup');
 }
 }
 
 |