2014-03-07 46 views
5

如何为每个动作创建一个函数? 比如我有功能:Magento默认控制器动作

public function indexAction() 
    { 

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

但现在是采取行动的索引,但什么时候我不知道动作,或其dynamiclly创建的,因此,例如操作可能是控制器/ someaction,控制器/ someaction2 我想创建默认的功能,这将在你的函数事情处理这个

回答

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中做到这一点
您还可以添加变量和控制器使用这些变量执行代码或不

+0

真棒,这就是我需要:) – user2746186

1

只是一个想法用开关罩状

public function($your_action) { 
    switch ($your_action) { 
     case action1: 
      $this->action1(); 
      break; 
     case action2: 
      $this->action2(); 
      break; 
     case action3: 
      $this->action3(); 
      break; 
    } 
} 
+0

我不知道行动名称 – user2746186

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>你自定义布局句柄。

就像我说的,这个接缝工作,但我不知道它的所有影响。
我认为如果您有两个扩展名重写(不扩展!)同一个控制器,但不确定它会发生一些错误。