/ / nie można renderować Zend_Form - zend-framework, zend-form

nie można renderować Zend_Form - zend-framework, zend-form

Próbuję renderować formularz logowania za pomocąZend_Form, chcę, żeby to było renderowane, dzwoniąc na www.site.com/login lub www.site.com/account/login, ale gdy wykonałem wszystkie poniższe czynności i próbowałem zadzwonić / zalogować się lub / konto / zalogować się z moja przeglądarka otrzymuje komunikat HTTP 500 (błąd wewnętrznego serwera), nawet jeśli reszta strony działa idealnie. Pomóż mi dowiedzieć się, gdzie się mylę ..

(zauważ, że używam Zend Framework 1.11)

(1) Utwórz model za pomocą ZF

zf utworzyć model FormLogin

(2) Edytuj nowy stworzony model w aplikacji / 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) Dodaj loginAction do kontrolera konta

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) Utwórz widok w aplikacji / views / scripts / account / login.phtml

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

(5) Utwórz aplikację strony / views / scripts / _form_login.phtml wywoływaną przez setDecorators () w punkcie (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) A to jest mój 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);



}
}

Odpowiedzi:

4 dla odpowiedzi № 1

Zmień definicję klasy dla Application_Model_FormLogin do następujących:

<?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));
}
}

Powinieneś ustawić swój formularz za pomocą init() metoda zamiast używania __construct()

Kiedy zadzwonisz parent::__construct($options); w konstruktorze dla twojego Zend_Form, która kończy się wywołaniem formularza "s init() metoda, a następnie nic nie jest wykonywane, więc inicjalizacja formularza i tworzenie elementów nigdy nie były wywoływane.

Wewnętrzny serwer 500 był, ponieważ dzwoniłeś parent::__construct() a twoja forma nie miała init() metoda.


1 dla odpowiedzi nr 2

drew010 ma dobry punkt na temat konfiguracji swojego formularza init() niż__construct().

Spędziłem wiele godzin walcząc z metodą viewScript i to jest sposób, w jaki udało mi się ją uruchomić (do tej pory).

  • $this->view->form = $form przypisuje do widoku

  • wtedy w twoim widoku musisz renderować częściowe z czymś podobnym
    <?php echo $this->render("_form_login.phtml")

  • jeśli użyjesz tej metody, to uzyskasz dostęp do swoich elementów za pomocą
    <?php echo $this->form->email; ?>

  • Korzystając z tej metody, nie skorzystałem z $this->setDecorators( array( array("ViewScript", array("viewScript" => "_form_login.phtml")))); linia kodu.

Odpowiedni sposób to wykorzystuje dekorator viewScript, jednak nie udało mi się go jeszcze uruchomić. Zauważyłem, że używając tego dekoratora, musiałem uzyskać dostęp do elementów za pomocą $this->element->elementname, ale nie mogłem znaleźć ani dostępu do metody ani działania. getMethod() i getAction() zarówno zwrócone błędy.

[EDYTOWAĆ] ok, mam to do pracy:

  • Za pomocą formularza dostosuj formę init()

  • $form->setDecorators(array( array("ViewScript", array("viewScript" => "_yourScript.phtml")) )); Chciałbym dodać to do kontrolera.

  • w twoim viewScript dostęp do obiektu formularza za pomocą $this->element zamiast $this->form

  • w normalny sposób przypisuj formularz do widoku $this->view->form = $form

  • renderuj formularz normalnie <?php echo $this->form ?>

to jest przykład, na który mam pracować ... w końcu

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

Myślę, że moje kopyto w ustach jest na razie wyleczone.