有没有办法覆盖位于/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 { ... }
答案 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