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; }
/** * 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; }
/** * 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)'); } }
/** * 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'); } }
/** * 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)'); } }
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; }
$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'); } }
/** * 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'); }
/** * * @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'); } }
/** * * @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']); }