0

いくつかの理由で、さまざまなモジュールのブートストラップでインスタンス化する必要があるフォームがいくつかあります。しかし、それらの形式で私は使用したい

$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'

その行に。カスタムルートがないので、デフォルトのルーターとルートのみを使用します。

4

3 に答える 3

2

本当に早い段階でフォームをインスタンス化する必要がある場合、おそらく1つの可能性は、ブートストラップでの初期化の順序です。

フォームをインスタンス化する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
    // ...

}

ファディアは思いますか?

于 2010-12-09T14:02:54.400 に答える
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のインターフェイスを少し模倣するのに疲れました。これで動作しました。ボーナスとして、必要になるまで実際にはフォームをインスタンス化しません。また、ストアクラスから特定のフォームのみをリクエストした場合、そのフォームのみがインスタンス化され、将来のアクセスのために保存されます。

于 2010-12-09T15:23:18.887 に答える
0

フォームをレンダリングするときにビューからアクションを設定するのはどうですか。

<?php echo $this->form->setAction($this->url(array(
          'controller' => 'foo',
          'action'     => 'bar'
      ))) ?>
于 2010-12-10T01:59:41.583 に答える