在Concrete5.6.1.2中覆盖包内的page_list控制器

时间:2013-08-13 12:47:07

标签: concrete5

有没有办法覆盖位于/concrete/blocks/page_list/controller.php的控制器文件并将其放在/packages/mypackage/blocks/page_list/内?我想对原始编辑和视图进行一些更改。

/packages/mypackage/blocks/page_list/controller.php中,我尝试过这样做,但似乎没有任何效果:

class PageListBlockController extends Concrete5_Controller_Block_PageList { ... }

2 个答案:

答案 0 :(得分:3)

您现在可以通过新版本Concrete5(v.5.6 +)中的包覆盖/扩展核心类。

您必须添加到包的主controller.php文件中:

public function on_start(){
    $objEnv = Environment::get();
    $objEnv->overrideCoreByPackage('blocks/page_list/controller.php', $this);
}

您不必复制整个核心控制器,只需声明您的新块控制器:

class PageList extends Concrete5_Controller_Block_Page_List {
    public function mymethod() {
    }
}

(您要扩展的类和放置文件的位置可能因C5版本而异 - 只需比较/concrete/文件夹结构和文件以供参考)

以下C5论坛帖子可能会有所帮助:

Overriding Core Class with Package

Can A Package Override A Core Library?

虽然谨慎 - 如果您希望提交到官方C5市场,他们通常不会接受带有替代的附加组件。

答案 1 :(得分:1)

没有。您无法从包中覆盖块控制器。想象一下,如果不止一个包这样做了。 (但是,您可以在包目录中有一个块模板,但这是有道理的,因为它会添加而不是替换。)

如果可以的话,你应该把它放在/blocks/page_list/controller.php

但是,如果您仍需要从包中覆盖它,则应该查看支持不太好的Environment::overrideCoreByPackage()并尝试:

Environment::get()->overrideCoreByPackage('/blocks/page_list/controller.php', $myPackage);

查看来源: https://github.com/concrete5/concrete5/blob/master/web/concrete/core/libraries/environment.php#L123

使用示例: http://www.concrete5.org/community/forums/customizing_c5/override-a-core-class-within-a-package/#460765