Доступ к URL-адресам просмотров в Zend_Form - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть несколько форм, которые по некоторым причинам должны быть созданы в различных загрузочных модулях модулей.Но в этих формах я хочу использовать

$this->setAction($this->getView()->url(array('controller' => 'foo', 'action' => 'bar')));

в конструкторе.Но так как URL viewhelper еще не доступен, так как я в начальной загрузке, есть ли что-нибудь вокруг этого?Теперь я получаю

Fatal error: Uncaught exception 'Zend_Controller_Router_Exception' with message 'Route default is not defined'

на этой строке.У меня НЕТ пользовательских маршрутов, поэтому я использую только маршрутизатор и маршруты по умолчанию.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Если вам действительно нужно создавать экземпляры форм так рано, то, возможно, одной из возможностей является порядок инициализации в вашей 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
    // ...

}

Что ты думаешь?

0 голосов
/ 10 декабря 2010

Как насчет установки действия из представления при рендеринге формы, например,

<?php echo $this->form->setAction($this->url(array(
          'controller' => 'foo',
          'action'     => 'bar'
      ))) ?>
0 голосов
/ 09 декабря 2010

Я решил изменить свой подход и сделал класс, который управляет всеми формами, принимает строки форм вместо форм.

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, когда дело доходит до имен функций и аргументов порядка. Теперь у меня это работает, и в качестве бонуса я фактически не создаю ни одной формы, пока она мне не понадобится. И если я только запрашиваю конкретную форму из класса хранилища, то только эта форма создается и сохраняется для последующего доступа.

...