如何为每个动作创建一个功能? 例如我有功能:
public function indexAction()
{
$this->loadLayout();
$this->renderLayout();
}
但这是针对动作索引的,但是当我不知道动作或动态创建动作时,例如动作可能是控制器/某些动作,控制器/某些动作2 我想创建将处理此
的默认函数答案 0 :(得分:3)
<强> [编辑] 强>
这适用于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>
AND 。
就像我说的那样,这种缝合起作用,但我不知道它的含义 我认为如果你有2个扩展重写(不扩展!)相同的控制器,你可以得到一些错误,但不确定。
答案 1 :(得分:3)
我个人会做这样的事情:
1 - 我将创建一个继承自Zend_Controller_Action的抽象类,如下所示:
<?php
abstract Class Yourlibrary_Controller_ControllerAbstract extends Zend_Controller_Action
{
public function preDispatch()
{
$this->loadLayout();
$this->renderLayout();
}
2 - 我的控制器继承 Yourlibrary_Controller_ControllerAbstract 而不是 Zend_Controller_Action
我在preDispatch()中做过,但你也可以在postDispatch中做到
您还可以添加变量和控制器使用这些变量执行代码或不执行
答案 2 :(得分:1)
只是一个Idea在你的函数中使用switch case就像
public function($your_action) {
switch ($your_action) {
case action1:
$this->action1();
break;
case action2:
$this->action2();
break;
case action3:
$this->action3();
break;
}
}