我想显示一个包含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动作到达结尾时,错误会在调度或路由期间的某处抛出。
非常感谢任何帮助。
答案 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的快速响应。我从你的回答中学到了。
总而言之,有三种不同的方法可以从外部控制器调用操作:
希望这有助于其他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;
}
}