[編輯]
這適用於高達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