Magento默认控制器动作

时间:2014-03-07 13:55:10

标签: php magento zend-framework

如何为每个动作创建一个功能? 例如我有功能:

 public function indexAction()
    {

        $this->loadLayout();     
        $this->renderLayout();
    }

但这是针对动作索引的,但是当我不知道动作或动态创建动作时,例如动作可能是控制器/某些动作,控制器/某些动作2 我想创建将处理此

的默认函数

3 个答案:

答案 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;
    }
}
相关问题