/** * Returns the alternate view template paths (a.k.a. template overrides in Joomla!-speak) for the given View name * * @param string $viewName The name of the view triggering this event * * @return array The template override paths */ public function onGetViewTemplatePaths($viewName) { $container = $this->subject->getContainer(); $application_name = $container->application_name; $component_name = 'com_' . strtolower($application_name); // That's the path in the site's current template containing template overrides $overridePath = Helper::getTemplateOverridePath($component_name, true); // The alternative view name (pluralised if the view is singular, singularised if the view is plural) $altViewName = Inflector::isPlural($viewName) ? Inflector::singularize($viewName) : Inflector::pluralize($viewName); // Remember, each path is pushed to the TOP of the path stack. This means that the least important directory // must go FIRST so that it ends add being added LAST. return array($overridePath . '/' . $altViewName, $overridePath . '/' . $viewName); }
/** * Asks each observer to handle an event based on the provided arguments. The first observer to return a non-null * result wins. This is a *very* simplistic implementation of the Chain of Command pattern. * * Please note that in this implementation the Joomla! plugins are queried first. If any of them handled the event * no Observer will run. However, since Joomla! doesn't implement a chain handler, ALL Joomla! plugins handling * $event will fire, even if the first plugin to fire did handle the event successfully (non-null result). * * @param string $event The event name to handle * @param array $args The arguments to the event * * @return mixed Null if the event can't be handled by any observer */ public function chainHandle($event, $args = array()) { // First try using Joomla! plugins $resultsJoomla = Helper::runPlugins($event, $args); if (!empty($resultsJoomla)) { foreach ($resultsJoomla as $result) { if (!is_null($result)) { return $result; } } } // Finally use the AWF Observers return parent::chainHandle($event, $args); }
/** * Checks if the current user has enough privileges for the requested ACL * area. * * @param string $area The ACL area, e.g. core.manage. * * @return bool True if the user has the ACL privilege specified */ protected function checkACL($controller_name, $area) { // If the area is one of false, 0, no or 403 we cancel the action if (in_array(strtolower($area), array('false', '0', 'no', '403'))) { return false; } // If the area is one of true, 1, yes we proceed with the action if (in_array(strtolower($area), array('true', '1', 'yes'))) { return true; } // If no ACL area is specified we proceed with the action if (empty($area)) { return true; } // Get the controller, model and table $container = $this->subject->getContainer(); $application_name = $container->application_name; $component_name = 'com_' . strtolower($application_name); /** @var DataController $controller */ $controller = Controller::getInstance($application_name, $controller_name, $container); $model = $controller->getModel(); // If it's not a data model or it's not assets tracked just perform a regular ACL check on the component if (!$model instanceof DataModel || !$model->getState('_isAssetsTracked', false)) { return Helper::authorise($area, $component_name); } // Initialise $ids = null; // Get the IDs in the request $ids = $controller->getIDsFromRequest($model, false); // If there are no IDs there is no asset tracking, fall back to the generic ACL check if (empty($ids)) { return Helper::authorise($area, $component_name); } // This should never happen unless you screw up overriding getIDsFromRequest in your model... if (!is_array($ids)) { $ids = array($ids); } // Check the asset permissions of each record $resource = Inflector::singularize($controller_name); $isEditState = $area == 'core.edit.state'; foreach ($ids as $id) { $asset = $component_name . '.' . $resource . '.' . $id; // Dedicated permission found, check it! if (Helper::authorise($area, $asset)) { return true; } // No dedicated permissions. Fallback on edit.own. if (!$isEditState && Helper::authorise('core.edit.own', $asset) && $model->hasField('created_by')) { // Load the record $model->find(array('id' => $id)); // Make sure the record can be loaded if ($model->getId()) { // Now test the owner is the user. $owner_id = (int) $model->created_by; // If I am the owner the test is successful if ($owner_id == \JFactory::getUser()->id) { return true; } } } } return false; }
public function initialise() { // Put a small marker to indicate that we run inside another CMS $this->container->segment->set('insideCMS', true); // Load the configuration $this->container->appConfig->loadConfiguration(); // Attach the Joomla!-specific observer for Controller ACL checks $this->container->eventDispatcher->attach(new ControllerAcl($this->container->eventDispatcher)); // Attach the Joomla!-specific observer for template override support $this->container->eventDispatcher->attach(new ViewAlternatePaths($this->container->eventDispatcher)); // Set up the template (theme) to use – different for front-end and back-end if (empty($this->template) || $this->template == $this->container->application_name) { $template = Helper::isBackend() ? 'backend' : 'frontend'; $this->setTemplate($template); } // Load the extra language files $appName = $this->container->application_name; if (Helper::isBackend() && substr($appName, -5) == 'Admin') { $appName = substr($appName, 0, -5); } $appNameLower = strtolower($appName); $languageTag = \JFactory::getLanguage()->getTag(); Text::loadLanguage('en-GB', $appName, '.com_' . $appNameLower . '.ini', false, $this->container->languagePath); Text::loadLanguage($languageTag, $appName, '.com_' . $appNameLower . '.ini', true, $this->container->languagePath); // Load the framework's language file Text::loadLanguage('en-GB', 'lib_awf', '.ini', false, $this->container->languagePath); Text::loadLanguage($languageTag, 'lib_awf', '.ini', false, $this->container->languagePath); // In the back-end, also load front-end languages if (Helper::isBackend()) { Text::loadLanguage('en-GB', $appName, '.com_' . $appNameLower . '.ini', true, JPATH_SITE . '/language'); Text::loadLanguage($languageTag, $appName, '.com_' . $appNameLower . '.ini', true, JPATH_SITE . '/language'); Text::loadLanguage('en-GB', 'lib_awf', '.ini', true, JPATH_SITE . '/language'); Text::loadLanguage($languageTag, 'lib_awf', '.ini', false, JPATH_SITE . '/language'); } }
} // Include the autoloader if (false == (include_once JPATH_LIBRARIES . '/awf/Autoloader/Autoloader.php')) { echo 'ERROR: Autoloader not found' . PHP_EOL; exit(1); } // Add our app to the autoloader, if it's not already set $componentName = 'com_' . strtolower($appName); $prefixes = Awf\Autoloader\Autoloader::getInstance()->getPrefixes(); if (!array_key_exists($appName . '\\', $prefixes)) { \Awf\Autoloader\Autoloader::getInstance()->addMap($appName . '\\', JPATH_SITE . '/components/' . $componentName)->addMap($appName . 'Admin\\', JPATH_ADMINISTRATOR . '/components/' . $componentName)->addMap($appName . '\\', JPATH_SITE . '/components/' . $componentName . '/' . $appName)->addMap($appName . 'Admin\\', JPATH_ADMINISTRATOR . '/components/' . $componentName . '/' . $appName . 'Admin'); } // Load Joomla!-specific translation files \Awf\Platform\Joomla\Helper\Helper::loadTranslations($componentName); // Find the name of the DI container class suitable for this component $appName = \Awf\Platform\Joomla\Helper\Helper::isBackend() ? $appName . 'Admin' : $appName; $containerClass = "\\{$appName}\\Container\\Container"; if (!class_exists($containerClass, true)) { $containerClass = '\\Awf\\Platform\\Joomla\\Container\\Container'; } if (!isset($containerOverrides)) { $containerOverrides = array(); } if (!isset($containerOverrides['application_name'])) { $containerOverrides['application_name'] = $appName; } // Try to create a new DI container try { /** @var \Awf\Platform\Joomla\Container\Container $container */ $container = new $containerClass($containerOverrides); } catch (Exception $exc) {
public function __construct(array $values = array()) { $appNameForPaths = $values['application_name']; if (Helper::isBackend() && substr($appNameForPaths, -5) == 'Admin') { $appNameForPaths = substr($appNameForPaths, 0, -5); } // Set up the filesystem path if (empty($values['filesystemBase'])) { $values['filesystemBase'] = JPATH_ROOT; } // Set up the base path if (empty($values['basePath'])) { $basePath = '/components/com_' . $appNameForPaths . '/' . $values['application_name']; $values['basePath'] = (Helper::isBackend() ? JPATH_ADMINISTRATOR : JPATH_ROOT) . $basePath; } // Set up the template path if (empty($values['templatePath'])) { $values['templatePath'] = __DIR__ . '/../templates'; } // Set up the temporary path if (empty($values['temporaryPath'])) { $values['temporaryPath'] = \JFactory::getConfig()->get('tmp_path', sys_get_temp_dir()); } // Set up the language path if (empty($values['languagePath'])) { $values['languagePath'] = (Helper::isBackend() ? JPATH_ADMINISTRATOR : JPATH_ROOT) . '/language'; } // Set up the SQL files path if (empty($values['sqlPath'])) { $values['sqlPath'] = JPATH_ADMINISTRATOR . '/components/com_' . $appNameForPaths . '/sql/xml'; } // Application service if (!isset($this['application'])) { $this['application'] = function (Container $c) { return Application::getInstance($c->application_name, $c); }; } // Session Manager service if (!isset($this['session'])) { $this['session'] = function () { return new \Awf\Platform\Joomla\Session\Manager(new \Awf\Platform\Joomla\Session\SegmentFactory(), new \Awf\Platform\Joomla\Session\CsrfTokenFactory()); }; } // Application Session Segment service if (!isset($this['segment'])) { $this['segment'] = function (Container $c) { if (empty($c->session_segment_name)) { $c->session_segment_name = $c->application_name; } return $c->session->newSegment($c->session_segment_name); }; } // Database Driver service if (!isset($this['db'])) { $this['db'] = function (Container $c) { $db = \JFactory::getDbo(); $options = array('connection' => $db->getConnection(), 'prefix' => $db->getPrefix(), 'driver' => 'mysqli'); switch ($db->name) { case 'mysql': $options['driver'] = 'Mysql'; break; default: case 'mysqli': $options['driver'] = 'Mysqli'; break; case 'sqlsrv': case 'mssql': case 'sqlazure': $options['driver'] = 'Sqlsrv'; break; case 'postgresql': $options['driver'] = 'Postgresql'; break; case 'pdo': $options['driver'] = 'Pdo'; break; case 'sqlite': $options['driver'] = 'Sqlite'; break; } return Driver::getInstance($options); }; } // Application Event Dispatcher service if (!isset($this['eventDispatcher'])) { $this['eventDispatcher'] = function (Container $c) { return new Dispatcher($c); }; } // Application Configuration service if (!isset($values['appConfig'])) { $values['appConfig'] = function (Container $c) { return new Configuration($c); }; } // Application Router service if (!isset($values['router'])) { $values['router'] = function (Container $c) { return new Router($c); }; } // User Manager service if (!isset($values['userManager'])) { $values['userManager'] = function (Container $c) { return new Manager($c); }; } parent::__construct($values); // Mailer Object service – returns a Joomla! JMail object // IMPORTANT! It has to appear AFTER the parent __construct method $this['mailer'] = $this->factory(function (Container $c) { return \JFactory::getMailer(); }); }
public function __construct(Container $container) { \Awf\Router\Router::__construct($container); $this->isBackend = Helper::isBackend(); }