2009-12-05 155 views
3

我想顯示具有2種形式的頁面。頂部表單對於此頁面是唯一的,但底部表單已經可以從不同的控制器呈現。我使用下面的代碼來調用其他形式的行動,但不斷收到此錯誤:ZEND控制器 - 如何從不同的控制器調用動作

 
"Message: id is not specified" 

#0 .../library/Zend/Controller/Router/Rewrite.php(441): Zend_Controller_Router_Route->assemble(Array, true, true) 

我的代碼:

第一控制器:

abc_Controller 
public function someAction() 
{ 

    $this->_helper->actionStack('other','xyz'); 

} 

第二個控制器:

xyz_Controller 
public function otherAction() 
{ 
// code 
} 

預期結果:

當調用/ abc/some時,我想渲染「some」內容以及xyz /其他內容。我認爲我正確地關注了文檔(http://framework.zend.com/manual/en/zend.controller.actionhelpers.html),但找不到任何有關發生錯誤的幫助。當我跟蹤代碼(使用XDebug)時,xyz/other動作完成,但當abc/some動作到達末尾時,錯誤在調度或路由過程中被拋出。

任何幫助,非常感謝。

+1

的ActionStack助手允許你將請求推送到ActionStack前端控制器插件,有效地幫助你創建一個在請求期間執行的動作隊列。幫助程序允許您通過指定新的請求對象或操作 - 控制器 - 模塊集來添加操作。 http://framework.zend.com/manual/en/zend.controller.plugins.html#zend.controller.plugins.standard.actionstack – tawfekov 2009-12-06 11:18:06

+0

參數_helper-> actionStack()是這些:public function direct($ action,$ controller = null,$ module = null,array $ params = array()) – max4ever 2012-02-08 10:11:26

回答

1

你可以用第二個控制器創建新的對象並調用它的方法(但它不是最好的方法)。

您可以將第一個控制器擴展到第二個控制器,並調用$this->methodFromSecond(); - 它將使用其模板渲染第二個控制器。

順便說一句 - 你想在兩個控制器中執行什麼類型的代碼?

+0

實際上,從第一個控制器創建第二個控制器是我的第一次嘗試。它返回完全相同的錯誤。 至於執行什麼,第一個控制器呈現一個簡單的表單 - 一個文本框(要購買的項目數量),第二個控制器調用另一個表單(在系統的其他部分使用的信用卡表單)。 – user225195 2009-12-05 22:54:47

+0

你使用Zend_Form嗎?如果是 - 您可以在兩個控制器中創建它們的對象並將它們推送到視圖。這是乾淨的方式。 如果你想以相同的方式處理它們(檢查是否有效,在數據庫中更新等),你應該使用Zend_Controller_Action_Helper_Abstract爲每個helpers擴展。 在他們中你可以做任何你在控制器中做的事情。 我希望我解釋清楚。 ;) – hsz 2009-12-05 23:56:35

+0

是的,我在兩個控制器上都使用Zend_Form。我試圖明確地創建對象,而不是使用_helper-> actionStack,但結果是相同的。我認爲這一定與我的路線有關。我現在正在檢查。 – user225195 2009-12-06 02:00:48

3

你可以在你的phAction中爲someAction完成這個。所以在一些.phtml放<?php echo $this->action('other','xyz');?>這將呈現XyzController的其他行爲中發現的形式

+0

我也試過這個。同樣的確切錯誤。奇怪的是,3種不同的方法都出現了相同的錯誤。我不知道它是否與我的路線配置文件有關: routes.abc.route =「abc/buy /:id/*」 routes.abc.defaults.controller =「deal」 routes.abc.defaults。 action =「buy」 routes.abc.reqs.id =「\ d +」 – user225195 2009-12-06 01:59:29

0

只是一個更新。這個錯誤與第二個控制器調用操作完全沒有關係。事實證明,在第二控制器的佈局,有一個單獨的PHTML呼叫被扔的誤差(佈局/ abc.phtml):

<?php echo $this->render('userNavigation.phtml') ?> 

路線錯誤的:

echo $this->navigation()->menu()->renderMenu(...) 

我將單獨調試,因爲不會渾濁這個線程。

感謝Akeem和hsz的快速響應。我從你的回答中學到了。

總之,有3層不同的方法來從外部控制器調用一個動作:

  1. 實例化從所述第一控制器的第二控制器,並調用的動作。 ?
  2. 使用$這 - > _ helper->動作堆棧
  3. 在第一控制器的PHTML,動作( '其他', 'XYZ');>(如的Akeem上面所指出的)

希望這有助於其他Zend noobs在那裏。

3

這樣做的願望表明你正在以完全錯誤的方式去做這件事。如果您有重複使用內容的衝動,它應該屬於模型。如果它是真正的控制器代碼,它應該被一個動作控制器插件封裝

0

嗯我找不到和想法爲什麼你需要爲一個視圖使用不同的控制器。更好的做法是將所有功能集於一身。我在這個例子中使用這個像

DemoController extends My_Controller_Action() { 
.... 
public function indexAction() { 
    $this->view->oForm = new Form_Registration(); 
} 
} 

My_Controller_Action extends Zend_Controller_Action() { 
    public function init() { 
     parent::init(); 
     $this->setGeneralStuf(); 
    } 

    public function setGeneralStuf() { 
     $this->view->oLoginForm = new Form_Login(); 
    } 
} 
2

在phtml文件中,你可以使用$ this-> action();渲染頁面和響應將被添加到當前響應..

採取行動的語法如下::

public function action($action, $controller, $module = null, array $params = array()) 
0

這種路線定義的:

routes.abc.route = "abc/buy/:id/*" 
routes.abc.defaults.controller = "deal" 
routes.abc.defaults.action = "buy" 
routes.abc.reqs.id = "\d+" 

需要參數才能起作用。爲此,您可以用動作堆棧,但你也可以指定情況下,默認的ID沒有被提供:

$this->_helper->actionStack('Action', 
          'Controller', 
          'Route', 
          array('param' => 'value') 
); 


routes.abc.defaults.id = "1" 
0

對於我這種工作就像一個魅力

class abcController extends Zend_Controller_Action 
    { 
     public function dashBoardAction() 
     { 
      $this->_helper->actionStack('list-User-Data', 'xyz'); 
     } 
    } 

    class XyzController extends Zend_Controller_Action { 
     public function listUserDataAction() 
     { 
      $data = array('red','green','blue','yellow'); 
      return $data; 
     } 
    }