Example #1
0
 /**
  * Add a code pool to override
  * 
  * @param string $path
  */
 public static function addCodePath($path = null)
 {
     if (is_null($path)) {
         return self::$_paths;
     }
     settype($path, 'array');
     foreach ($path as $codePool) {
         $codePool = JPath::clean($codePool);
         JModuleHelper::addIncludePath($codePool);
         array_push(self::$_paths, $codePool);
     }
     return self::$_paths;
 }
 /**
  * onAfterRoute function.
  *
  * @access public
  * @return void
  */
 public function onAfterRoute()
 {
     $option = $this->getOption();
     if ($option === false || !isset(self::$componentList[$option])) {
         return;
     }
     MVCOverrideHelperCodepool::initialize();
     // Add override paths for the current component files
     foreach (MVCOverrideHelperCodepool::addCodePath() as $codePool) {
         if (version_compare(JVERSION, '3.0', '>=')) {
             JViewLegacy::addViewHelperPath($codePool . '/' . $option);
             JViewLegacy::addViewTemplatePath($codePool . '/' . $option);
         } else {
             JView::addViewHelperPath($codePool . '/' . $option);
             JView::addViewTemplatePath($codePool . '/' . $option);
         }
         JModuleHelper::addIncludePath($codePool . '/modules');
         JTable::addIncludePath($codePool . '/' . $option . '/tables');
         JModelForm::addComponentFormPath($codePool . '/' . $option . '/models/forms');
         JModelForm::addComponentFieldPath($codePool . '/' . $option . '/models/fields');
     }
 }
 /**
  * onAfterRoute function.
  *
  * @access public
  * @return void
  */
 public function onAfterRoute()
 {
     $app = JFactory::getApplication();
     $option = $app->input->get('option');
     if (empty($option) && $app->isSite()) {
         $menuDefault = $app->getMenu()->getDefault();
         if ($menuDefault == 0) {
             return;
         }
         $componentID = $menuDefault->componentid;
         $db = JFactory::getDBO();
         $db->setQuery('SELECT * FROM #__extensions WHERE extension_id =' . $db->quote($componentID));
         $component = $db->loadObject();
         $option = $component->element;
     }
     //get files that can be overrided
     $componentOverrideFiles = $this->loadComponentFiles($option);
     //application name
     $applicationName = $app->getName();
     //template name
     $template = $app->getTemplate();
     //code paths
     $includePath = array();
     //template code path
     $includePath[] = JPATH_THEMES . '/' . $template . '/code';
     //base extensions path
     $includePath[] = JPATH_BASE . '/code';
     JModuleHelper::addIncludePath(JPATH_BASE . '/code');
     JModuleHelper::addIncludePath(JPATH_THEMES . '/' . $template . '/code');
     //constants to replace JPATH_COMPONENT, JPATH_COMPONENT_SITE and JPATH_COMPONENT_ADMINISTRATOR
     define('JPATH_SOURCE_COMPONENT', JPATH_BASE . '/components/' . $option);
     define('JPATH_SOURCE_COMPONENT_SITE', JPATH_SITE . '/components/' . $option);
     define('JPATH_SOURCE_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR . '/components/' . $option);
     //loading override files
     if (!empty($componentOverrideFiles)) {
         foreach ($componentOverrideFiles as $componentFile) {
             if ($filePath = $this->findPath($includePath, $componentFile)) {
                 //include the original code and replace class name add a Default on
                 if ($this->params->get('extendDefault', 0)) {
                     $bufferFile = file_get_contents(JPATH_BASE . '/components/' . $componentFile);
                     //detect if source file use some constants
                     preg_match_all('/JPATH_COMPONENT(_SITE|_ADMINISTRATOR)|JPATH_COMPONENT/i', $bufferFile, $definesSource);
                     $bufferOverrideFile = file_get_contents($filePath);
                     //detect if override file use some constants
                     preg_match_all('/JPATH_COMPONENT(_SITE|_ADMINISTRATOR)|JPATH_COMPONENT/i', $bufferOverrideFile, $definesSourceOverride);
                     // Append "Default" to the class name (ex. ClassNameDefault). We insert the new class name into the original regex match to get
                     $rx = '/class *[a-z0-0]* *(extends|{)/i';
                     preg_match($rx, $bufferFile, $classes);
                     $originalClass = '';
                     if (!empty($classes)) {
                         $parts = explode(' ', $classes[0]);
                         $originalClass = $parts[1];
                     }
                     $replaceClass = $originalClass . 'Default';
                     if (count($definesSourceOverride[0])) {
                         throw new Exception(JText::_('Plugin MVC Override', 'Your override file use constants, please replace code constants<br />JPATH_COMPONENT -> JPATH_SOURCE_COMPONENT,<br />JPATH_COMPONENT_SITE -> JPATH_SOURCE_COMPONENT_SITE and<br />JPATH_COMPONENT_ADMINISTRATOR -> JPATH_SOURCE_COMPONENT_ADMINISTRATOR'));
                     } else {
                         //replace original class name by default
                         $bufferContent = str_replace($originalClass, $replaceClass, $bufferFile);
                         //replace JPATH_COMPONENT constants if found, because we are loading before define these constants
                         if (count($definesSource[0])) {
                             $bufferContent = preg_replace(array('/JPATH_COMPONENT/', '/JPATH_COMPONENT_SITE/', '/JPATH_COMPONENT_ADMINISTRATOR/'), array('JPATH_SOURCE_COMPONENT', 'JPATH_SOURCE_COMPONENT_SITE', 'JPATH_SOURCE_COMPONENT_ADMINISTRATOR'), $bufferContent);
                         }
                         // Change private methods to protected methods
                         if ($this->params->get('changePrivate', 0)) {
                             $bufferContent = preg_replace('/private *function/i', 'protected function', $bufferContent);
                         }
                         // Finally we can load the base class
                         eval('?>' . $bufferContent . PHP_EOL . '?>');
                         require_once $filePath;
                     }
                 } else {
                     require_once $filePath;
                 }
             }
         }
     }
 }
Example #4
0
 private function allowModulesOverrides()
 {
     $jV = new JVersion();
     if (version_compare($jV->getShortVersion(), "3", "lt")) {
         $loc = '/joomla/application/module/';
     } else {
         $loc = '/cms/module/';
     }
     //override JModuleHelper library class
     $moduleHelperContent = JFile::read(JPATH_LIBRARIES . $loc . 'helper.php');
     $moduleHelperContent = str_replace('JModuleHelper', 'JModuleHelperLibraryDefault', $moduleHelperContent);
     $moduleHelperContent = str_replace('<?php', '', $moduleHelperContent);
     eval($moduleHelperContent);
     jimport('joomla.application.module.helper');
     JLoader::register('jmodulehelper', dirname(__FILE__) . '/module/helper.php', true);
     JModuleHelper::addIncludePath(JPATH_BASE . '/code/modules');
     JModuleHelper::addIncludePath(JPATH_THEMES . '/' . JFactory::getApplication()->getTemplate() . '/code/modules');
 }