2013-03-04 65 views
4

我在創建登記表的過程是:Zend框架2:空的isValid /的getMessages

這裏是我的行動:

public function registrationAction() { 
    $form = new RegistrationForm(); 

    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $users = new Users(); 
     $form->setInputFilter($users->getInputFilter()); 
     $form->setData($request->getPost()); 

     var_dump($form->isValid()); 
     exit; 

     if ($form->isValid()) { 
      $users->exchangeArray($form->getData()); 
      $this->getUsersTable()->addUser($users); 
      $message = 'Регистрирахте се успешно! Можете да влезете в профила си чрез формата за вход на началната страница.'; 
     } 
    } 

    return new ViewModel(array(
       'form' => $form, 
       'message' => $message, 
      )); 
} 

這裏是我的表格:

namespace Main\Form; 

use Zend\Form\Form; 

class RegistrationForm extends Form { 

public function __construct($name = null) { 
    parent::__construct('User'); 

    $this->add(array(
     'name' => 'username', 
     'attributes' => array(
      'type' => 'Zend\Form\Element\Text', 
     ), 
     'options' => array(
      'label' => 'Потребителско име', 
     ), 
    )); 

    $this->add(array(
     'name' => 'email', 
     'attributes' => array(
      'type' => 'Zend\Form\Element\Text', 
     ), 
     'options' => array(
      'label' => 'Email адрес', 
     ), 
    )); 

    $this->add(array(
     'name' => 'password', 
     'attributes' => array(
      'type' => 'Zend\Form\Element\Text', 
     ), 
     'options' => array(
      'label' => 'Парола', 
     ), 
    )); 

    $this->add(array(
     'name' => 'submit', 
     'attributes' => array(
      'type' => 'Zend\Form\Element\Submit', 
     ), 
     'options' => array(
      'label' => 'Регистрация', 
     ) 
    )); 
} 

}

以下是Object \ Model \ Users.php中用戶模型中的inputFilter:

namespace Object\Model; 

use Zend\Validator\StringLength; 
use Zend\Validator\NotEmpty; 
use Zend\Validator\EmailAddress; 
use Zend\Validator\Date; 
use Zend\InputFilter\Factory as InputFactory; 
use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilterInterface; 

class Users { 

public $user_id; 
public $username; 
public $name; 
public $email; 
public $password; 
public $sex; 
public $birthday; 
public $avatar; 
public $user_level; 
public $date_registered; 
public $is_active; 
public $is_banned; 

public function exchangeArray($data) { 
    $this->user_id = (isset($data['user_id'])) ? $data['user_id'] : null; 
    $this->username = (isset($data['username'])) ? $data['username'] : null; 
    $this->name = (isset($data['name'])) ? $data['name'] : null; 
    $this->email = (isset($data['email'])) ? $data['email'] : null; 
    $this->password = (isset($data['password'])) ? $data['password'] : null; 
    $this->sex = (isset($data['sex'])) ? $data['sex'] : null; 
    $this->birthday = (isset($data['birthday'])) ? $data['birthday'] : null; 
    $this->avatar = (isset($data['avatar'])) ? $data['avatar'] : null; 
    $this->user_level = (isset($data['user_level'])) ? $data['user_level'] : null; 
    $this->date_registered = (isset($data['date_registered'])) ? $data['date_registered'] : null; 
    $this->is_active = (isset($data['is_active'])) ? $data['is_active'] : null; 
    $this->is_banned = (isset($data['is_banned'])) ? $data['is_banned'] : null; 
} 

public function setInputFilter(InputFilterInterface $inputFilter) { 
    throw new \Exception('Not used'); 
} 

public function getInputFilter() { 
    if (!$this->inputFilter) { 
     $inputFilter = new InputFilter(); 

     $factory = new InputFactory(); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'user_id', 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'username', 
        'filters' => array(
         array('name' => 'StripTags'), 
         array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
         array(
          'name' => 'NotEmpty', 
          'options' => array(
           'messages' => array(
            NotEmpty::IS_EMPTY => 'Моля въведете потребителско име!', 
           ), 
          ), 
         ), 
         array(
          'name' => 'StringLength', 
          'options' => array(
           'encoding' => 'UTF-8', 
           'min' => 1, 
           'max' => 50, 
           'messages' => array(
            StringLength::TOO_SHORT => 'Потребителското име трябва да бъде минимум 1 символ', 
            StringLength::TOO_LONG => 'Потребителското име не може да надвишава 50 символа', 
           ), 
          ), 
         ), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'name', 
        'filters' => array(
         array('name' => 'StripTags'), 
         array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
         array(
          'name' => 'StringLength', 
          'options' => array(
           'encoding' => 'UTF-8', 
           'max' => 255, 
           'messages' => array(
            StringLength::TOO_LONG => 'Вашите име и фамилия не може да надвишават 255 символа', 
           ), 
          ), 
         ), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'email', 
        'filters' => array(
         array('name' => 'StripTags'), 
         array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
         array(
          'name' => 'NotEmpty', 
          'options' => array(
           'messages' => array(
            NotEmpty::IS_EMPTY => 'Моля въведете email адрес!', 
           ), 
          ), 
         ), 
         array(
          'name' => 'EmailAddress', 
          'options' => array(
           'encoding' => 'UTF-8', 
           'min' => 1, 
           'max' => 50, 
           'messages' => array(
            EmailAddress::INVALID => 'Email адресът е невалиден.', 
           ), 
          ), 
         ), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'password', 
        'filters' => array(
         array('name' => 'StripTags'), 
         array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
         array(
          'name' => 'NotEmpty', 
          'options' => array(
           'messages' => array(
            NotEmpty::IS_EMPTY => 'Моля въведете парола!', 
           ), 
          ), 
         ), 
         array(
          'name' => 'StringLength', 
          'options' => array(
           'encoding' => 'UTF-8', 
           'min' => 4, 
           'max' => 90, 
           'messages' => array(
            StringLength::TOO_SHORT => 'Паролата трябва да бъде минимум 4 символ', 
            StringLength::TOO_LONG => 'Паролата не може да надвишава 90 символа', 
           ), 
          ), 
         ), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'sex', 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'birthday', 
        'filters' => array(
         array('name' => 'StripTags'), 
         array('name' => 'StringTrim'), 
        ), 
        'validators' => array(
         array(
          'name' => 'Date', 
          'options' => array(
           Date::INVALID_DATE => 'Въведената дата е грешна.', 
          ), 
         ), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'avatar', 
        'filters' => array(
         array('name' => 'StripTags'), 
         array('name' => 'StringTrim'), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'user_level', 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'date_registered', 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'is_active', 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
       ))); 

     $inputFilter->add($factory->createInput(array(
        'name' => 'is_banned', 
        'filters' => array(
         array('name' => 'Int'), 
        ), 
       ))); 

     $this->inputFilter = $inputFilter; 
    } 

    return $this->inputFilter; 
} 

}

當我嘗試訪問的isValid()或$形式對象的getMessages()方法,它們是空的。當他們在var_dump中調用它們時,它們總是布爾錯誤...可能有人幫助我?提前致謝。這隻發生在這個模塊中。在我的另一個模塊中,一切都很好,形式。有時這個ZF2非常複雜......:|

+0

請提供編輯主帖的'InputFilter' – Sam 2013-03-05 07:07:42

+0

。 – 2013-03-05 08:42:52

+0

你在哪裏試圖getMessages()? isValid之後對不對? – Andrew 2013-03-07 09:32:00

回答

0

這是正常的你寫(控制器)?

var_dump($form->isValid()); 
exit; 

也許這是關於「消息」只是顯示如果發生錯誤,是不是?

6

檢查字段名稱的拼寫是否與輸入過濾器中的名稱匹配 - 我做了同樣的事情。

+0

MerC。我有同樣的問題,你的答案幫助了我。 – 2014-02-02 05:45:06

0

我找不到錯誤,但這裏有一些提示:

你並不需要使用InputFactory設置元素的輸入過濾,ZF2會自動執行(ZF2 Docs

最後,默認的InputFilter實現由Factory支持。這意味着在調用add()時,您可以提供一個Factory可以理解的規範,並且它將創建適當的對象。您可以用這種方式創建Input或InputFilter對象。

所以不是

$inputFilter->add($factory->createInput(array(
       'name' => 'user_id', 
       'filters' => array(
        array('name' => 'Int'), 
       ), 
      ))); 

你可以做

$inputFilter->add(array(
    'name' => 'user_id', 
     'filters' => array(
      array('name' => 'Int'), 
     ), 
    )); 

另一件事,如果你調用$形式 - > isValid()的兩次對同一個實例,第二個則導致一些看不見的錯誤,其餘的代碼將不會被執行。我不知道發生了什麼錯誤,但是您可以爲每個$ form實例調用isValid一次。

9

我和你有同樣的問題,isValid()會返回false,而getMessages()會是一個空數組。

我的問題是我已經定義了一個字段(例如電子郵件)的輸入驗證器,但該字段不存在於我正在驗證的表單中。看起來Zend Framework 2中有一個錯誤,在這種情況下不打印錯誤消息:bug report on github

所以解決方案是將缺少的字段添加到表單對象。

+0

我們必須輸入應該驗證的setValidationGroup中的字段。 – 2015-04-02 12:16:39

2

我有同樣的問題,這是因爲表單和過濾器沒有相同數量的屬性。

您的註冊表單具有較少的屬性,那麼您的過濾器。