在Zend_Form中访问视图url函数

时间:2010-12-09 12:29:22

标签: zend-framework zend-form zend-view

我有一些表单由于某些原因必须在不同的模块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'

就在那条线上。我没有自定义路由,所以我只使用默认路由器和路由。

3 个答案:

答案 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'
      ))) ?>