2014-03-07 96 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>你自定義佈局句柄。

就像我說的,這個接縫工作,但我不知道它的所有影響。
我認爲如果您有兩個擴展名重寫(不擴展!)同一個控制器,但不確定它會發生一些錯誤。