如何覆盖核心类?


20

有时需要重写核心类以获得更多功能或使某些核心功能以其他方式工作。有什么办法可以覆盖核心类吗?如果有可能,那么我可以通过覆盖这些问题来面对哪些问题?


1
如果您可以改进问题以使其更加具体或描述一个明确的问题,那就太好了。
Valentin Despa

Answers:


16

对的,这是可能的。

您可以使用系统插件来覆盖类,请阅读此链接以及

您将面临的两个问题:

  1. 您需要覆盖整个类(而不仅仅是部分类)

  2. 如果核心已更新且类也已更新/更改,则需要更新替代(如果需要)。


4
如果您可以粘贴提供的链接中的相关步骤,或者至少对链接进行描述,以防它们移动或更改,这将很有用。
codinghands

10

我不久前创建了一个插件,该插件可让您覆盖核心类,但是它仍然成为@jackJoe在其答案中指出的问题的牺牲品。但是,它允许您干净地进行覆盖。

https://gist.github.com/dongilbert/323​​7387


7
只是想说这种解决方案效果很好,而Don是真正的开源精神,对他及其工作表示敬意!!!
GDP

您的简单脚本存在一个实质性问题,那就是它不会预加载组件。因此,如果您覆盖了组件,那么对于大多数组件(例如com_content组件)而言,它实际上是行不通的。它运作良好,但必须预加载组件,以便它可以覆盖它们(您不能覆盖尚未声明的内容)。哦,您必须使用onAfterRoute而不是在构造函数中完成全部操作。如果您想知道此评论的意思,请尝试覆盖components/com_content/models/articles.php
itoctopus


4

我在这上面呆了很长时间,并向Don保证,一旦我完成,他会提供更多细节。

我需要重写Joomla MVC的组件,并告诉Joomla也要在我的插件html文件夹中查找替代项,而不仅仅是在模板html文件夹中。

我从来不喜欢开发人员真正接受Joomla默认类并弄乱它的方法,所以我更愿意扩展该类,而不是煞费苦心。

我的过程确实如下。

  1. 获取我需要覆盖的课程
  2. 读取它,替换类名,在我的temp类文件夹中创建新文件
  3. 加载我的课程版本
  4. 加载Joomla类
  5. 注册我的扩展方法,该方法扩展了功能loadTemplate,以在我的插件中查找替换内容,而不是joomla模板和最后一个joomla组件

这是图片而不是 http://prntscr.com/3d9syq

下面的代码片段的第一部分是检查用户的位置,如果他要更新Joomla,我将删除所创建的临时类文件,以确保更新完成后得到新鲜的临时类文件,这些文件将由JackJoe负责2。

if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {

    JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    $indexContent = '';
    JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}

$YjsgJViewDefaultRead         = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile         = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";



    //extend JView library class

    if (!JFile::exists($YjsgJViewDefaultFile)) {
        $YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
        $YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
        JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
    }

    require_once($YjsgJViewDefaultFile);
    jimport('joomla.application.component.view');
    JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.