diff --git a/mvcoverride.php b/mvcoverride.php
index 6af7a0a..96c4f4c 100755
--- a/mvcoverride.php
+++ b/mvcoverride.php
@@ -9,127 +9,113 @@
/**
* PlgSystemMVCOverride class.
- *
+ *
* @extends JPlugin
*/
class PlgSystemMVCOverride extends JPlugin
{
-
- public function onAfterInitialise()
- {
- $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('allowModulesOverrides();
+
+ if (!$this->isComponentOverrideNeeded()) {
+ JEventDispatcher::getInstance()->detach($this);
+
+ return;
+ }
+ }
+
/**
* onAfterRoute function.
- *
+ *
* @access public
* @return void
*/
public function onAfterRoute()
{
- $option = JFactory::getApplication()->input->get('option');
-
- if( empty($option) && JFactory::getApplication()->isSite() ) {
- $menuDefault = JFactory::getApplication()->getMenu()->getDefault();
- if ($menuDefault == 0) return;
-
- $componentID = $menuDefault->componentid;
- $db = JFactory::getDBO();
- $db->setQuery('SELECT * FROM #__extensions WHERE id ='.$db->quote($componentID));
- $component = $db->loadObject();
- $option = $component->element;
- }
-
+ $option = $this->getOption();
+
//get files that can be overrided
$componentOverrideFiles = $this->loadComponentFiles($option);
- //application name
- $applicationName = JFactory::getApplication()->getName();
+
//template name
$template = JFactory::getApplication()->getTemplate();
-
+
//code paths
$includePath = array();
//template code path
$includePath[] = JPATH_THEMES.'/'.$template.'/code';
//base extensions path
$includePath[] = JPATH_BASE.'/code';
-
- JModelLegacy::addIncludePath(JPATH_BASE.'/code/modules');
- JModelLegacy::addIncludePath(JPATH_THEMES.'/'.$template.'/code/modules');
-
-
+
//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
+ //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);
-
+
$parts = explode(' ',$classes[0]);
-
+
$originalClass = $parts[1];
$replaceClass = $originalClass.'Default';
-
+
if (count($definesSourceOverride[0]))
{
-
+
//throw new Exception(JText::_('Ckjhkjhkjh'));
- throw new Exception(JText::_('Plugin MVC Override','Your override file use constants, please replace code constants
JPATH_COMPONENT -> JPATH_SOURCE_COMPONENT,
JPATH_COMPONENT_SITE -> JPATH_SOURCE_COMPONENT_SITE and
JPATH_COMPONENT_ADMINISTRATOR -> JPATH_SOURCE_COMPONENT_ADMINISTRATOR'));
+ throw new Exception(JText::_('Plugin MVC Override','Your override file use constants, please replace code constants
JPATH_COMPONENT -> JPATH_SOURCE_COMPONENT,
JPATH_COMPONENT_SITE -> JPATH_SOURCE_COMPONENT_SITE and
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;
}
}
@@ -141,10 +127,10 @@ public function onAfterRoute()
}
}
}
-
+
/**
* loadComponentFiles function.
- *
+ *
* @access private
* @param mixed $option
* @return void
@@ -153,27 +139,27 @@ private function loadComponentFiles($option)
{
$JPATH_COMPONENT = JPATH_BASE.'/components/'.$option;
$files = array();
-
+
//check if default controller exists
if (JFile::exists($JPATH_COMPONENT.'/controller.php'))
{
$files[] = $JPATH_COMPONENT.'/controller.php';
}
-
+
//check if controllers folder exists
if (JFolder::exists($JPATH_COMPONENT.'/controllers'))
{
$controllers = JFolder::files($JPATH_COMPONENT.'/controllers', '.php', false, true);
$files = array_merge($files, $controllers);
}
-
+
//check if models folder exists
if (JFolder::exists($JPATH_COMPONENT.'/models'))
{
$models = JFolder::files($JPATH_COMPONENT.'/models', '.php', false, true);
$files = array_merge($files, $models);
}
-
+
//check if views folder exists
if (JFolder::exists($JPATH_COMPONENT.'/views'))
{
@@ -186,7 +172,7 @@ private function loadComponentFiles($option)
$files = array_merge($files, $viewsFiles);
}
}
-
+
$return = array();
//cleaning files
foreach ($files as $file)
@@ -195,13 +181,13 @@ private function loadComponentFiles($option)
$file = substr($file, strlen(JPATH_BASE.'/components/'));
$return[] = $file;
}
-
+
return $return;
}
/**
- * findPath function.
+ * findPath function.
* Replacement for JPATH::find, if the target path is a symlink JPATH::find fails
- *
+ *
* @access private
* @param mixed $option
* @return void
@@ -229,4 +215,82 @@ private function findPath($paths, $file)
// Could not find the file in the set of paths
return false;
}
+
+ private function getOption()
+ {
+ $app = JFactory::getApplication();
+ $option = $app->input->get('option');
+
+ if (!empty($option)) {
+ return $option;
+ }
+
+ if ($app->isAdmin()) {
+ return JAdministratorHelper::findOption();
+ }
+
+ $menu = $app->getMenu();
+
+ if (!$menu) {
+ return null;
+ }
+
+ $active = $menu->getActive();
+
+ if ($active && isset($active->component)) {
+ return $active->component;
+ }
+
+ $default = $menu->getDefault();
+
+ if ($default && isset($default->component)) {
+ return $default->component;
+ }
+
+ return null;
+ }
+
+ /**
+ * Check if component is overriden prior to looping through all its files
+ *
+ * @return boolean
+ */
+ private function isComponentOverrideNeeded()
+ {
+ $app = JFactory::getApplication();
+
+ $option = $this->getOption();
+
+ if ($option && JFolder::exists(JPATH_THEMES . '/' . $app->getTemplate() . '/code/' . $option)) {
+ return true;
+ }
+
+ if ($app->isAdmin() && JFolder::exists(JPATH_ADMINISTRATOR . '/code/' . $option)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ 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('getTemplate() . '/code/modules');
+ }
}