致命错误:使用zend框架2创建表单时,在null上调用成员函数setAttribute()


Fatal error: Call to a member function setAttribute() on null when creating form using zend framework 2

致命错误:尝试使用Zend Framework 创建表单时,在''modules''Admin''view''Admin''index''login.phtml中对null调用成员函数setAttribute()

有人能帮我找出哪里做错了吗。我粘贴了所有的代码。

'module'Admin'src'Admin'Controller'LoginController.php
class LoginController extends AbstractActionController
{
protected  $usersTable = null;
public function indexAction()
{
    return new ViewModel();
}
public function loginAction(){
    $form = new LoginForm();
    $form->get('submit')->setValue('Login');
    $request = $this->getRequest();
    if($request->isPost()){
        $login = new Login();
        $form->setInputFilter($login->getInputFilter());
        $form->setData($request->getPost());
        if($form->isValid()){
            $login->exchangeArray($form->getData());
            $this->getLoginDetails()->saveLoginForm($login);
            // Redirect to list of albums
            return $this->redirect()->toRoute('index');
        }
    }
    return array('form' => $form);
}
}
 'module'Admin'src'Admin'Form
 namespace Admin'Form;
 use Zend'Form'Form;
 class LoginForm extends Form
 {
 public function _construct()
 {
     parent::_construct('admin');
     $this->add(array(
         'name' => 'username',
         'type' => 'Text',
         'options' => array(
             'label' => 'Username',
             'id' => 'txtUsername',
         ),
     ));
     $this->add(array(
         'name' => 'password',
         'type' => 'password',
         'options' => array(
             'label' => 'Password',
             'id' => 'txtPassword',
         ),
     ));
     $this->add(array(
         'name' => 'submit',
         'type' => 'Submit',
         'attributes' => array(
             'value' => 'Login',
             'id' => 'btnSubmit',
         ),
     ));
 }
 }
'module'Admin'src'Admin'Model
namespace Admin'Model;
use Zend'InputFilter'InputFilter;
use Zend'InputFilter'InputFilterAwareInterface;
use Zend'InputFilter'InputFilterInterface;
class Login implements InputFilterAwareInterface{
public $username;
public $password;
protected $inputFilter;
public function exchangeArray($data)
{
    $this->artist = (isset($data['username'])) ? $data['username'] : null;
    $this->title  = (isset($data['password']))  ? $data['password']  : null;
}
public function setInputFilter(InputFilterInterface $inputFilter){
    throw new 'Exception("not used");
}
public function getInputFilter(){
    if(!$this->inputFilter){
        $inputFilter = new InputFilter();
        $inputFilter->add(array(
            'name'     => 'username',
            'required' => true,
            'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min'      => 1,
                        'max'      => 50,
                    ),
                ),
            ),
        ));
        $inputFilter->add(array(
            'name'     => 'password',
            'required' => true,
            'filters'  => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'    => 'StringLength',
                    'options' => array(
                        'encoding' => 'UTF-8',
                        'min'      => 1,
                        'max'      => 50,
                    ),
                ),
            ),
        ));
        $this->inputFilter = $inputFilter;
    }
    return $this->inputFilter;
}
'module'Admin'view'admin'index
<?php

$form = $this->form;
$form->setAttribute('action', $this->url('admin', array('action' => 'login')));
$form->prepare();
echo $this->form()->openTag($form);
echo $this->formRow($form->get('username'));
echo $this->formRow($form->get('password'));
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
echo $this->$form;

$form=$this->表单是什么?是否用于控制器?你把$this->表单上的任何内容传递到哪里。它为null,就像您看到的错误一样。你可以var_dump($form)来检查它。你需要先用创建你的表单

$form = new 'My'Form();

如果$form在login.phtml中为null,这意味着您没有将$form变量传递给phtml脚本(我们在您的代码中看不到它)

当您想要更改元素属性时,您必须使用getElement函数来获取该元素,然后使用zend表单函数。试试下面的代码,它会为你工作。

$form = new LoginForm();
$form->getElement('submit')->setValue('get');