Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Silverstripe—使模块从自定义页面类型扩展的最佳方法_Php_Silverstripe_Extends - Fatal编程技术网

Php Silverstripe—使模块从自定义页面类型扩展的最佳方法

Php Silverstripe—使模块从自定义页面类型扩展的最佳方法,php,silverstripe,extends,Php,Silverstripe,Extends,我的站点结构是所有自定义页面类型,具有从page.php扩展而来的单亲页面 class CustomPage extends Page {} class Custom_Controller extends Page_Controller { //load all javascript/css for entire site here etc } class SomeClass extends CustomPage {} class SomeClass_Controller ex

我的站点结构是所有自定义页面类型,具有从page.php扩展而来的单亲页面

class CustomPage extends Page {}

class  Custom_Controller extends Page_Controller {
    //load all javascript/css for entire site here etc
}


class SomeClass extends CustomPage {}

class SomeClass_Controller extends Custom_Controller
{
    // etc etc you get the point. 
}
站点中的每一个其他页面现在分别从CustomPage和Custom_Controller扩展。php几乎是空的

现在,当使用非内部编写的模块时,问题就来了。例如,Blog*模块将不会继承新基类Custom_Controller中定义的javascripts/css/函数,因为它被设置为扩展Page_Controller

基本上,在不修改Blog模块的情况下,让Blog_控制器扩展自定义_控制器的理想方法是什么


*博客模块只是一个例子。这适用于所有模块。

直接问题的简短答案

基本上,在不修改Blog模块的情况下,让Blog_控制器扩展自定义_控制器的理想方法是什么

这在技术上是不可能做到的。实际上,你有两个选择

直接对页面/页面控制器类进行更改 在自定义页面类型中继承页面/页面控制器,但不要直接修改页面,而是使用绑定到页面的扩展为所有子页面类型提供自定义行为。对于提供自定义init行为的特定情况,您需要一个扩展扩展类的自定义扩展,并绑定到Page_控制器
查看直接问题的简短答案,了解更多信息

基本上,在不修改Blog模块的情况下,让Blog_控制器扩展自定义_控制器的理想方法是什么

这在技术上是不可能做到的。实际上,你有两个选择

直接对页面/页面控制器类进行更改 在自定义页面类型中继承页面/页面控制器,但不要直接修改页面,而是使用绑定到页面的扩展为所有子页面类型提供自定义行为。对于提供自定义init行为的特定情况,您需要一个扩展扩展类的自定义扩展,并绑定到Page_控制器
查看更多信息

不幸的是,由于我们的环境,选项一是不可能的,选项二似乎也不起作用。我从未遇到过通过扩展向控制器添加getter方法的问题,但在init位于扩展中时却没有任何运气。然而,似乎有效的方法是对Blog_控制器进行子类化,并复制所需的函数-然而,这不是一个非常优雅的解决方案…对于扩展,您需要定义的方法是onBeforeInit或onAfterInit而不是init本身进一步添加到Marcus的建议中-似乎为了让onAfter/BeforeInit加载需求,您需要先用requirements::clear清除之前加载的内容。我不确定这是否是我的环境所独有的,或者我是如何加载的,但是的……不幸的是,由于我们的环境,选项一是不可能的,选项二似乎也不起作用。我从未遇到过通过扩展向控制器添加getter方法的问题,但在init位于扩展中时却没有任何运气。然而,似乎有效的方法是对Blog_控制器进行子类化,并复制所需的函数-然而,这不是一个非常优雅的解决方案…对于扩展,您需要定义的方法是onBeforeInit或onAfterInit而不是init本身进一步添加到Marcus的建议中-似乎为了让onAfter/BeforeInit加载需求,您需要先用requirements::clear清除之前加载的内容。我不确定这是否是我的环境所独有的,或者我是如何加载的,但是是的。。。