ZEND控制器 - 如何从不同的控制器调用操作

时间:2009-12-05 14:18:13

标签: zend-framework zend-controller

我想显示一个包含2个表单的页面。顶部表单对于此页面是唯一的,但底部表单已经可以从不同的控制器呈现。我正在使用以下代码来调用其他表单的操作,但不断收到此错误:

 "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 / other内容。我认为我正确地遵循了文档(http://framework.zend.com/manual/en/zend.controller.actionhelpers.html),但找不到有关错误发生原因的任何帮助。当我跟踪代码(使用XDebug)时,xyz / other操作就完成了,但是当abc / some动作到达结尾时,错误会在调度或路由期间的某处抛出。

非常感谢任何帮助。

8 个答案:

答案 0 :(得分:3)

您可以在phtml中为someAction完成此操作。所以在some.phtml中放置<?php echo $this->action('other','xyz');?>这将呈现在XyzController的otherAction中找到的表单

答案 1 :(得分:3)

做这样的事情的冲动表明你正以错误的方式解决这个问题。如果您有重复使用内容的冲动,它应该属于模型。如果它是真正的控制器代码,它应该由动作控制器插件封装

答案 2 :(得分:2)

在phtml文件中你可以使用$ this-&gt; action();渲染页面,该响应将添加到当前响应..

动作的语法如下::

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

答案 3 :(得分:1)

您可以使用第二个控制器创建新对象并调用其方法(但这不是最好的方法)。

您可以使用第二个控制器扩展第一个控制器并调用$this->methodFromSecond(); - 它将使用其模板呈现第二个形式。

BTW - 你想在两个控制器中执行什么类型的代码?

答案 4 :(得分:0)

只是一个更新。该错误与从第二个控制器调用操作的方式完全无关。事实证明,在第二个控制器的布局中,有一个单独的phtml调用抛出了错误(layout / abc.phtml):

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

错误行:

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

我将单独调试它,以免混淆这个线程。

感谢Akeem和hsz的快速响应。我从你的回答中学到了。

总而言之,有三种不同的方法可以从外部控制器调用操作:

  1. 从第一个控制器实例化第二个控制器并调用该操作。
  2. 使用$ this-&gt; _helper-&gt; actionStack
  3. 在第一个控制器的phtml中,动作('其他','xyz');?&gt; (正如Akeem上面指出的那样)
  4. 希望这有助于其他Zend noobs。

答案 5 :(得分: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();
   }
}

答案 6 :(得分:0)

这种路线定义:

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

需要一个参数才能运行。您可以使用actionStack执行此操作,但如果未提供任何内容,您还可以指定默认ID:

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

<小时/>

routes.abc.defaults.id = "1" 

答案 7 :(得分: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;
        }
    }