我有一些表单由于某些原因必须在不同的模块bootstraps中实例化。但在这些形式中我想使用
$this->setAction($this->getView()->url(array('controller' => 'foo', 'action' => 'bar')));
在构造函数中。但是因为我在引导程序中,因为viewhelper url还不可访问,所以在这周围有什么?我现在得到的是
Fatal error: Uncaught exception 'Zend_Controller_Router_Exception' with message 'Route default is not defined'
就在那条线上。我没有自定义路由,所以我只使用默认路由器和路由。
答案 0 :(得分:2)
如果你真的需要这么早地实例化表单,那么也许一种可能性就是你的Bootstrap中初始化的顺序。
在实例化表单的Bootstrap方法中,只需确保首先引导视图。然后抓取视图对象并在实例化期间将其传递给表单。
类似的东西:
protected function _initForms()
{
$this->bootstrap('view');
$view = $this->getResource('view');
$form = new My_Form($view);
// ...
}
然后在您的表单中,您可以执行以下操作:
public function __construct($view)
{
$this->setView($view);
}
public function init()
{
// set the action
$this->setAction($this->getView()->url(array(
'controller' => 'foo',
'action' => 'bar',
)));
// create your form elements
// ...
}
Whaddya认为?
答案 1 :(得分:0)
我决定改变我的方法,并使管理所有表单的类接受表单的字符串而不是表单。
static public function registerForm($formClassName, $formName) {
self::$_forms[$formName] = $formClassName;
}
然后我创建了一个函数来从类中获取表单或所有表单
public function getForm($name) {
if(empty(self::$_forms[$name])) {
throw new Core_Form_Store_Exception;
}
// If the for is instanciated we return it
else if(self::$_forms[$name] instanceof Zend_Form) {
return self::$_forms[$name];
}
else {
// Instanciate the class and return it
$form = new self::$_forms[$name];
self::$_forms[$name] = $form;
return $form;
}
}
getForms()
仅针对每个可用表单调用getForm()
。在涉及函数名称和传递顺序参数时,我厌倦了模仿普通Zend_Form的接口。现在我有它工作,作为奖励,我实际上并没有实例化任何形式,直到我需要它。如果我只从商店类中请求一个特定的表单,那么该表单将被实例化并保存以供将来访问。
答案 2 :(得分:0)
如何在渲染表单时从视图中设置操作,例如
<?php echo $this->form->setAction($this->url(array(
'controller' => 'foo',
'action' => 'bar'
))) ?>