3

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

“消息:未指定 id”

 #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 操作结束时,在调度或路由期间的某个地方会抛出错误。

任何帮助是极大的赞赏。

4

8 回答 8

3

做这样的事情的冲动表明你正在以完全错误的方式去做。如果您有重用内容的冲动,它应该属于模型。如果它是真正的控制器代码,它应该被一个动作控制器插件封装

于 2009-12-06T03:16:13.570 回答
3

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

于 2009-12-05T17:09:58.247 回答
2

在 phtml 文件中,您可以使用 $this->action() ;呈现页面并且该响应将被添加到当前响应中..

动作的语法如下:

public function action($action, $controller, $module = null, array $params = array())
于 2010-09-15T04:44:32.707 回答
1

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

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

顺便说一句 - 你想在两个控制器中执行什么类型的代码?

于 2009-12-05T17:08:12.277 回答
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();
   }
}
于 2010-09-14T21:05:01.513 回答
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" 
于 2012-04-28T13:48:40.170 回答
0

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

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

错误行:

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

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

感谢 Akeem 和 hsz 的及时回复。我从你的回答中了解到。

总而言之,从外部控制器调用动作有 3 种不同的方式:

  1. 从第一个控制器实例化第二个控制器并调用动作。
  2. 使用 $this->_helper->actionStack
  3. 在第一个控制器的 phtml 中, action('other','xyz');?> (正如 Akeem 上面指出的)

希望这可以帮助其他 Zend 新手。

于 2009-12-06T03:06:31.277 回答
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;
        }
    }
于 2013-06-03T15:27:04.567 回答