невозможно отрендерить Zend_Form - PullRequest
2 голосов
/ 24 февраля 2012

Я пытаюсь создать форму для входа в систему с помощью Zend_Form, я хочу, чтобы она отображалась по адресу www.site.com/login или www.site.com/account/login, но после того, как я выполнил все шаги ниже и я пытаюсь позвонить / войти или / account / login из моего браузера, я получаю HTTP 500 (Внутренняя ошибка сервера) .. даже если остальная часть сайта работает отлично. Пожалуйста, помогите мне понять, где я не прав ..

(обратите внимание, что я использую Zend Framework 1.11)

(1) Создать модель с помощью ZF

zf создать модель FormLogin

(2) Отредактируйте новую созданную модель в приложении / models / FormLogin.php

class Application_Model_FormLogin extends Zend_Form
{
     public function __construct($options = null)
    {

         parent::__construct($options);

         $this->setName('login');
         $this->setMethod('post'); // GET O POST

         $this->setAction('/account/login'); // form action=[..]

         $email = new Zend_Form_Element_Text('email');
         $email->setAttrib('size', 35);

         $pswd = new Zend_Form_Element_Password('pswd');
         $pswd->setAttrib('size', 35);

         $submit = new Zend_Form_Element_Submit('submit'); // submit button

         $this->setDecorators( array( array('ViewScript', array('viewScript' => '_form_login.phtml'))));
         $this->addElements(array($email, $pswd, $submit));

       } 

}

(3) Добавить loginAction к контроллеру аккаунта

class AccountController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {

    }

    public function loginAction()
    {
        $form = new Application_Model_FormLogin();

          $this->view->form = $form;

    }


}

(4) Создать представление в приложении / views / scripts / account / login.phtml

<?php echo $this->form; ?>

(5) Создайте страницу application / views / scripts / _form_login.phtml, вызываемую setDecorators () в точке (2)

<form id="login" action="<?php echo $this->element->getAction(); ?>"
method="<?php echo $this->element->getMethod(); ?>">
<p>
    E-mail Address<br />
    <?php echo $this->element->email; ?>
</p>
<p>
    Password<br />
    <?php echo $this->element->pswd; ?>
</p>
<p>
    <?php echo $this->element->submit; ?>
</p>
</form>

(6) А это мой Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initRoutes()
    {

        $frontController = Zend_Controller_Front::getInstance();
        $router = $frontController->getRouter();


        $route = new Zend_Controller_Router_Route_Static (
            'login',
            array('controller' => 'Account', 'action' => 'login')
        );

        $router->addRoute('login', $route);

        $route = new Zend_Controller_Router_Route (
            'games/asin/:asin/',
            array('controller' => 'Games',
                  'action'     => 'view',
                   'asin'       => 'B000TG530M' // default value
                 )
        );
        $router->addRoute('game-asin-view', $route);



    }
}

Ответы [ 2 ]

4 голосов
/ 24 февраля 2012

Измените определение класса для Application_Model_FormLogin на следующее:

<?php

class Application_Model_FormLogin extends Zend_Form
{
    public function init()
    {
        $this->setName('login');
        $this->setMethod('post'); // GET O POST

        $this->setAction('/account/login'); // form action=[..]

        $email = new Zend_Form_Element_Text('email');
        $email->setAttrib('size', 35);

        $pswd = new Zend_Form_Element_Password('pswd');
        $pswd->setAttrib('size', 35);

        $submit = new Zend_Form_Element_Submit('submit'); // submit button

        $this->setDecorators( array( array('ViewScript', array('viewScript' => '_form_login.phtml'))));
        $this->addElements(array($email, $pswd, $submit));
    }
}

Вы должны настроить свою форму, используя метод init() вместо использования __construct()

Когда вывызовите parent::__construct($options); в конструкторе вашего Zend_Form, который в конечном итоге вызывает метод init() формы, а затем ничего не выполняется, поэтому инициализация формы и создание элемента никогда не вызывались.

500внутренний сервер был вызван тем, что вы вызывали parent::__construct(), а ваша форма не имела метода init().

1 голос
/ 25 февраля 2012

drew010 имеет смысл настроить вашу форму в init(), а не __construct().

Я просто часами боролся с методом viewScript, и вот как я заставил его работать (пока).

  • $this->view->form = $form присваивает виду

  • , то, по вашему мнению, вам нужно визуализировать партиал с чем-то вроде
    <?php echo $this->render('_form_login.phtml')

  • если вы используете этот метод, то вы получите доступ к своим элементам, используя
    <?php echo $this->form->email; ?>

  • При использовании этого метода я не использовал строку кода $this->setDecorators( array( array('ViewScript', array('viewScript' => '_form_login.phtml'))));.

Правильный способ сделать это - использовать декоратор viewScript, однако я пока не смог заставить его работать. Я обнаружил, что с помощью этого декоратора мне нужно было получить доступ к элементам, используя $this->element->elementname, но я не смог найти доступ к методу или действию. getMethod() и getAction() обе вернули ошибки.

[EDIT] хорошо, я получил его на работу:

  • Создайте форму как обычно, используя init()

  • $form->setDecorators(array( array('ViewScript', array('viewScript' => '_yourScript.phtml')) )); Мне нравится добавлять это в контроллер.

  • в вашем viewScript доступ к объекту формы, используя $this->element вместо $this->form

  • назначьте вашу форму обычному виду $this->view->form = $form

  • нормально отображать форму <?php echo $this->form ?>

это пример, который я получил на работу ... наконец-то

<form action="<?php echo $this->element->getAction() ?>"
      method="<?php echo $this->element->getMethod() ?>">
    <table>
        <tr>
            <td><?php echo $this->element->weekend->renderLabel() ?></td>
            <td><?php echo $this->element->weekend->renderViewHelper() ?></td>
            <td><?php echo $this->element->bidlocation->renderLabel() ?></td>
            <td><?php echo $this->element->bidlocation->renderViewHelper() ?></td>
            <td><?php echo $this->element->shift->renderLabel() ?></td>
            <td><?php echo $this->element->shift->renderViewHelper() ?></td>
        </tr>
        <tr>
            <td colspan="6"><?php echo $this->element->submit ?></td>
        </tr>
    </table>
</form>

Я думаю, мое копыто во рту на данный момент излечено.

...