Exemplo n.º 1
0
 static function getList()
 {
     $app = App::$instance;
     $addonsList = $app->addons->getList();
     $result = [];
     foreach ($addonsList as $addonData) {
         $addonID = $addonData['id'];
         $addonData = \BearFramework\Addons::get($addonID);
         $addonOptions = $addonData['options'];
         if (isset($addonOptions['bearCMS']) && is_array($addonOptions['bearCMS']) && isset($addonOptions['bearCMS']['themes']) && is_array($addonOptions['bearCMS']['themes'])) {
             foreach ($addonOptions['bearCMS']['themes'] as $themeData) {
                 if (is_array($themeData) && isset($themeData['id'], $themeData['manifest']) && is_string($themeData['id']) && is_string($themeData['manifest'])) {
                     $manifestFilename = $addonData['dir'] . '/' . $themeData['manifest'];
                     if (is_file($manifestFilename)) {
                         $themeID = $themeData['id'];
                         $result[$themeID] = ['id' => $themeID, 'dir' => $addonData['dir'], 'manifestFilename' => $manifestFilename];
                     }
                 }
             }
         }
     }
     $result = array_values($result);
     $context = $app->getContext(__DIR__);
     array_unshift($result, ['id' => 'bearcms/default1', 'dir' => $context->dir, 'manifestFilename' => $context->dir . '/themes/default1/manifest.json']);
     array_unshift($result, ['id' => 'none']);
     return $result;
 }
Exemplo n.º 2
0
 /**
  * Converts data:, app:, addon:id: filenames to real filenames
  * 
  * @param string $filename
  * @return string The real filename
  * @throws \InvalidArgumentException
  */
 public function getRealFilename($filename)
 {
     if (!is_string($filename)) {
         throw new \InvalidArgumentException('');
     }
     $app = App::$instance;
     if (substr($filename, 0, 5) === 'data:') {
         $filename = $app->data->getFilename(substr($filename, 5));
     } elseif (substr($filename, 0, 4) === 'app:') {
         $filename = $app->config->appDir . DIRECTORY_SEPARATOR . substr($filename, 4);
     } elseif (substr($filename, 0, 6) === 'addon:') {
         $temp = explode(':', $filename, 3);
         if (sizeof($temp) === 3) {
             $addonDir = \BearFramework\Addons::get($temp[1])['dir'];
             $filename = $addonDir . DIRECTORY_SEPARATOR . $temp[2];
         }
     }
     return $filename;
 }
Exemplo n.º 3
0
 /**
  * Enables an addon and saves the provided options
  * 
  * @param string $id The id of the addon
  * @param array $options The options of the addon
  * @throws \InvalidArgumentException
  * @return boolean TRUE if successfully loaded. FALSE otherwise.
  */
 public function add($id, $options = [])
 {
     if (!is_string($id)) {
         throw new \InvalidArgumentException('The id argument must be of type string');
     }
     if (!is_array($options)) {
         throw new \InvalidArgumentException('The options argument must be of type array');
     }
     $id = strtolower($id);
     if (isset($this->data[$id])) {
         return false;
     }
     $addonData = \BearFramework\Addons::get($id);
     $definitionOptions = $addonData['options'];
     if (isset($definitionOptions['require']) && is_array($definitionOptions['require'])) {
         foreach ($definitionOptions['require'] as $requiredAddonName) {
             if (is_string($requiredAddonName)) {
                 $this->add($requiredAddonName);
             }
         }
     }
     unset($definitionOptions);
     $this->data[$id] = [$options];
     $dir = $addonData['dir'];
     $__indexFilename = realpath($dir . DIRECTORY_SEPARATOR . 'index.php');
     if ($__indexFilename !== false) {
         $app =& App::$instance;
         // Needed for the index file
         $context = new App\AddonContext($dir);
         $context->options = $options;
         unset($id);
         // Hide this variable from the file scope
         unset($dir);
         // Hide this variable from the file scope
         unset($options);
         // Hide this variable from the file scope
         include_once $__indexFilename;
         return true;
     } else {
         throw new \InvalidArgumentException('Invalid addon (the index file is missing)');
     }
 }
Exemplo n.º 4
0
 /**
  * Enables an addon and saves the provided options
  * @param string $name The name of the addon
  * @param array $options The options of the addon
  * @throws \InvalidArgumentException
  * @throws \Exception
  * @return boolean TRUE if successfully loaded. FALSE otherwise.
  */
 public function add($name, $options = [])
 {
     if (!is_string($name)) {
         throw new \InvalidArgumentException('');
     }
     if (!is_array($options)) {
         throw new \InvalidArgumentException('');
     }
     if (isset($this->data[$name])) {
         return false;
     }
     $addonDefinitionOptions = \BearFramework\Addons::getOptions($name);
     if (isset($addonDefinitionOptions['require']) && is_array($addonDefinitionOptions['require'])) {
         foreach ($addonDefinitionOptions['require'] as $requiredAddonName) {
             if (is_string($requiredAddonName)) {
                 $this->add($requiredAddonName);
             }
         }
     }
     $pathname = \BearFramework\Addons::getDir($name);
     $pathname = rtrim($pathname, '/\\') . '/';
     $this->data[$name] = ['pathname' => $pathname, 'options' => $options];
     $__indexFilename = realpath($pathname . 'index.php');
     if ($__indexFilename !== false) {
         $app =& App::$instance;
         // Needed for the index file
         $context = new App\AddonContext($pathname);
         $context->options = $options;
         unset($name);
         // Hide this variable from the file scope
         unset($pathname);
         // Hide this variable from the file scope
         unset($options);
         // Hide this variable from the file scope
         unset($addonDefinitionOptions);
         // Hide this variable from the file scope
         include_once $__indexFilename;
         return true;
     } else {
         throw new \Exception('Addon index file not found');
     }
 }
Exemplo n.º 5
0
 /**
  * Enables an addon and saves the provided options
  * 
  * @param string $id The id of the addon
  * @param array $options The options of the addon
  * @throws \InvalidArgumentException
  * @return boolean TRUE if successfully loaded. FALSE otherwise.
  */
 public function add($id, $options = [])
 {
     if (!is_string($id)) {
         throw new \InvalidArgumentException('The id argument must be of type string');
     }
     if (!is_array($options)) {
         throw new \InvalidArgumentException('The options argument must be of type array');
     }
     $id = strtolower($id);
     if (isset($this->data[$id])) {
         return false;
     }
     $addonData = \BearFramework\Addons::get($id);
     $definitionOptions = $addonData['options'];
     if (isset($definitionOptions['require']) && is_array($definitionOptions['require'])) {
         foreach ($definitionOptions['require'] as $requiredAddonName) {
             if (is_string($requiredAddonName)) {
                 $this->add($requiredAddonName);
             }
         }
     }
     $this->data[$id] = [$options];
     $indexFilename = realpath($addonData['dir'] . DIRECTORY_SEPARATOR . 'index.php');
     if ($indexFilename !== false) {
         ob_start();
         try {
             $includeFile = static function ($__filename) {
                 include_once $__filename;
             };
             $includeFile($indexFilename);
             ob_end_clean();
         } catch (\Exception $e) {
             ob_end_clean();
             throw $e;
         }
         return true;
     } else {
         throw new \InvalidArgumentException('Invalid addon (the index file is missing)');
     }
 }
Exemplo n.º 6
0
 static function getManifestData($name)
 {
     if (\BearFramework\Addons::exists($name)) {
         $addonData = \BearFramework\Addons::get($name);
         $addonOptions = $addonData['options'];
         if (isset($addonOptions['bearCMS']) && is_array($addonOptions['bearCMS']) && isset($addonOptions['bearCMS']['manifest']) && is_string($addonOptions['bearCMS']['manifest'])) {
             $filename = $addonData['dir'] . '/' . $addonOptions['bearCMS']['manifest'];
             if (is_file($filename)) {
                 $data = json_decode(file_get_contents($filename), true);
                 if (isset($data['media']) && is_array($data['media'])) {
                     foreach ($data['media'] as $i => $media) {
                         if (isset($media['filename']) && is_string($media['filename'])) {
                             $data['media'][$i]['filename'] = $addonData['dir'] . '/' . $media['filename'];
                         }
                     }
                 }
                 return $data;
             }
         }
     }
     return null;
 }
Exemplo n.º 7
0
$app->container->set('bearCMS', \BearCMS::class);
Options::set($app->addons->get('bearcms/bearframework-addon')['options']);
$app->hooks->add('initialized', function () use($app) {
    // Load the CMS managed addons
    if (Options::hasFeature('ADDONS')) {
        $addons = InternalData\Addons::getList();
        foreach ($addons as $addonData) {
            $addonID = $addonData['id'];
            $addonDir = Options::$addonsDir . DIRECTORY_SEPARATOR . $addonID . DIRECTORY_SEPARATOR;
            if (is_file($addonDir . 'autoload.php')) {
                include $addonDir . 'autoload.php';
            } else {
                throw new Exception('Cannot find autoload.php file for ' . $addonID);
            }
            if (\BearFramework\Addons::exists($addonID)) {
                $_addonData = \BearFramework\Addons::get($addonID);
                $_addonOptions = $_addonData['options'];
                if (isset($_addonOptions['bearCMS']) && is_array($_addonOptions['bearCMS']) && isset($_addonOptions['bearCMS']['assetsDirs']) && is_array($_addonOptions['bearCMS']['assetsDirs'])) {
                    foreach ($_addonOptions['bearCMS']['assetsDirs'] as $dir) {
                        if (is_string($dir)) {
                            $app->assets->addDir($addonDir . $dir);
                        }
                    }
                }
                if ($addonData['enabled']) {
                    $app->addons->add($addonID, ['addedByBearCMS' => true]);
                }
            } else {
                throw new Exception('Addon ' . $addonID . ' not available');
            }
        }
Exemplo n.º 8
0
 /**
  * Creates a context object for the filename specified
  * 
  * @param string $filename
  * @throws \InvalidArgumentException
  * @throws \Exception
  * @return \BearFramework\App\AppContext|\BearFramework\App\AddonContext The context object
  */
 public function getContext($filename)
 {
     if (!is_string($filename)) {
         throw new \InvalidArgumentException('The filename argument must be of type string');
     }
     $filename = realpath($filename);
     if ($filename === false) {
         throw new \Exception('File does not exists');
     }
     if (is_dir($filename)) {
         $filename .= DIRECTORY_SEPARATOR;
     }
     if (strpos($filename, $this->config->appDir . DIRECTORY_SEPARATOR) === 0) {
         return new App\AppContext($this->config->appDir);
     }
     $addons = $this->addons->getList();
     foreach ($addons as $data) {
         $addonData = \BearFramework\Addons::get($data['id']);
         if (strpos($filename, $addonData['dir'] . DIRECTORY_SEPARATOR) === 0) {
             $context = new App\AddonContext($addonData['dir']);
             $context->options = $data['options'];
             return $context;
         }
     }
     throw new \Exception('Connot find context');
 }
Exemplo n.º 9
0
 /**
  * 
  * @param string $directory
  * @param string $id
  * @throws \Exception
  * @throws \InvalidArgumentException
  */
 public function update($directory, $id)
 {
     if (!is_string($directory)) {
         throw new \InvalidArgumentException('');
     }
     if (!is_string($id)) {
         throw new \InvalidArgumentException('');
     }
     if (\BearFramework\Addons::exists($id)) {
         $options = \BearFramework\Addons::getOptions($id);
         if (isset($options['releasesUrl'])) {
             $this->install($directory, $options['releasesUrl']);
         }
     } else {
         throw new \Exception('Addon does not exists');
     }
 }
Exemplo n.º 10
0
 /**
  * 
  * @param array $data
  * @return string
  * @throws \Exception
  */
 static function addonAssetUrl($data)
 {
     $app = App::$instance;
     if (!isset($data['key'])) {
         throw new \Exception('');
     }
     if (!isset($data['options'])) {
         throw new \Exception('');
     }
     if (!isset($data['addonID'])) {
         throw new \Exception('');
     }
     $addonDir = \BearFramework\Addons::get($data['addonID'])['dir'];
     return $app->assets->getUrl($addonDir . DIRECTORY_SEPARATOR . $data['key'], $data['options']);
 }