我接手了一个项目,在这个项目中,最初的开发人员定制了JomSocial,并直接写信给:
components/com_community/templates/jomsocial/layouts
并在那里创建文件夹,以及写入base.php等文件。
JomSocial当前的自定义版本是4.0.9,我需要更新到最新的-4.4.5,Joomla版本是-3.8.1
我知道我需要在我的模板文件夹中创建一个覆盖文件夹,比如每个更改的base.php文件的例子:
/templates/yourTemplateName/html/com_community/layouts/frontpage/base.php
但是,为了保持开发人员所做的更改,并拥有最新版本的JomSocial,同时不阻碍进一步的更新,在这种情况下,如果我没有错的话,我必须这样做:
-
将更改与他在4.0.9上所做的核心文件分开。
-
在我的模板文件夹中为我需要自定义的每个核心文件创建文件夹和文件,并使它们只包括开发人员使用4.4.5更新版本所做的更改。
我说得对吗?有别的办法吗?任何帮助都将不胜感激。
您对如何覆盖模板中的布局文件是正确的。不幸的是,它将您的覆盖与特定的模板联系在一起——安装不同的模板并将其设置为默认模板将丢失您的覆盖。
您可以使用插件覆盖组件中的任何其他文件,并拦截对组件控制器的调用,替换您自己的调用。使用这种方法,您必须在入口点(控制器)和要应用更改的文件之间复制所有Jomsocial文件,这可能就是原始开发人员直接覆盖核心组件文件的原因(无论如何,如果不检查从核心组件文件复制到覆盖中的代码的更改,就无法安全地使用这种方法进行更新)。这种方法看起来像:
class plgSystemComSocialOverride extends JPlugin {
public function __construct(&$subject, $config = array()) {
parent::__construct($subject, $config);
}
public function onAfterRoute() {
$app = JFactory::getApplication();
if('com_social' == JRequest::getCMD('option') && !$app->isSite()) {
require_once(dirname(__FILE__) . DS . 'comsocialoverride' . DS . 'my_jomsocial_controller.php');
}
}
}
我认为您可以将上述方法与操纵Joomla的类加载器相结合,以避免为了将其include
语句更改为覆盖文件而不得不直接复制Jomsocial文件。在这种方法中,您可以如上所述覆盖控制器,并从被覆盖的控制器中调用Jomsocial控制器。但在此之前,您需要将重写的base.php
或其他内容添加到类加载器中。我不确定Jomsocial的新版本是否使用自动加载(即import()
而不是include()
)。