[编辑]
这适用于高达CE 1.7和EE 1.12(包括这些)的magento版本。
对于以后的版本,您不能再在控制器中使用__call
。
[原来的答案]
这是一个非常有趣的问题。
这是一个可行的解决方案,但我不知道它的全部含义。
在php中,如果您在类中实现了__call
方法,则在方法不存在时会调用此方法。
下面是一个例子:
class SomeClass {
public function doSomething() {
return "Doing something";
}
public function __call($function, $args){
return "Still doing something even if you said ".$function;
}
}
基于上述类:...
$obj = new SomeClass();
echo $obj->doSomething(); //will output "Doing something" - because the method exists
echo $obj->doNothing(); //will output "Still doing something even if you said doNothing".
在此基础上,你可以在你的控制器的方法__call()
实现,但你必须小心。这将被称为所有不存在的东西。
因此,您可以尝试将请求的方法过滤为仅以Action
结尾的方法。
这里是一个例子。
public function __call($function, $args){
if (substr($function, -6) == 'Action') {
$this->loadLayout('some_default_layout_handle');
$this->renderLayout();
}
else {//otherwise throw an exeption
throw new Exception ("Method {$function} cannot be called in ". __CLASS__);
}
}
现在一些解释 我以前$this->loadLayout('some_default_layout_handle');
一个参数,因为打电话时只需loadLayout
的Magento将加载<default>
布局手柄和对应的操作手柄。但由于您的行为几乎可以做任何事情,因此您无法为每个可能的行为创建布局句柄。
这样你总是加载相同的句柄。
你也可以改变,要
$this->loadLayout(array('default','some_default_layout_handle'));
加载<default>
和你自定义布局句柄。
就像我说的,这个接缝工作,但我不知道它的所有影响。
我认为如果您有两个扩展名重写(不扩展!)同一个控制器,但不确定它会发生一些错误。
真棒,这就是我需要:) – user2746186