簡體   English   中英

在ZF2中將輸入過濾器添加到fieldset

[英]Adding input filter to fieldset in ZF2

我有一個表單Register ,它有一個fieldset Profile ,后者又有一個fieldset Account 字段集實現InputFilterProviderInterface ,從而實現getInputFilterSpecification方法。 這是我添加通用驗證器和過濾器的地方,每當使用字段集時都應該使用它們。

現在,在我的注冊表單中,我想驗證具有給定用戶名的帳戶是否尚不存在。 因此,我需要添加一個驗證器來補充在Account字段集上定義的驗證器。 這是我遇到麻煩的地方。 在挖掘了一下之后,我找到了一種向字段集添加輸入過濾器的方法 這樣,我想,我可以在我的Account字段集中添加一個額外的輸入過濾器。

class Register extends Zend\InputFilter\InputFilter
{
    public function __construct()
    {
        $this->add(new RegisterProfileFilter(), 'profile');
    }
}

使用上面的代碼,我可以在我的Profile字段集中添加一個輸入過濾器,在該輸入過濾器中,我可以對我的account字段集執行相同的操作。 但是,這種方法看起來有兩個問題:

  1. 似乎我必須為層次結構中的每個字段集創建一個輸入過濾器; 在這種情況下,我必須為Profile字段集創建一個輸入過濾器,以便我可以向Account字段集添加輸入過濾器 - 即使我不需要在Profile字段集中添加任何驗證器或任何內容。 如果我嘗試直接將過濾器添加到account字段集,它不起作用
  2. 似乎向字段集添加輸入過濾器對象會消除我在fieldset的getInputFilterSpecification方法中定義的過濾器,而不是像我想要的那樣合並兩者

有沒有辦法合並我的字段集上定義的輸入過濾器規范與一個額外的規范(或Zend\\InputFilter\\InputFilter實例,這樣我不必將我的字段集規范復制到我的輸入過濾器類?這將是重復的代碼並且不是很難維護。或者我錯過了導致我走錯路的東西?

以下是我的代碼,如果它有任何幫助。

// The code has been altered to be more self-explanatory and shorter

class RegisterForm extends \Zend\Form\Form
{
    public function __construct()
    {
        parent::__construct('register');

        // Elements are added here

        $profileFieldset = new ProfileFieldset();
        $profileFieldset->setUseAsBaseFieldset(true);
        $this->add($profileFieldset);
    }
}


class ProfileFieldset extends \Zend\Form\Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('profile');

        // Elements are added here

        $this->add(new AccountFieldset());
    }

    public function getInputFilterSpecification()
    {
        return array(
            /***** The below is apparently cleared when adding an input filter to this fieldset *****/
            'some_element1' => array(
                'required' => false,
            ),
            'some_element2' => array(
                'required' => false,
            ),
        );
    }
}


class AccountFieldset extends \Zend\Form\Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('account');

        // Elements are added here
    }

    public function getInputFilterSpecification()
    {
        return array(
            /***** This is the element that I want to add an additional validator to in a specific context (form) *****/
            'username' => array(
                'required' => true,
                'validators' => array(
                    new Validator\StringLength(array(
                        'min' => 4,
                        'max' => 15,
                    )),
                    new I18nValidator\Alnum(false),
                ),
            ),

            // Other elements here
        );
    }
}

Zend\\Form組件中沒有很好地涵蓋合並InputFilters。 有人必須真正重構整個事情。

無論如何,什么工作,因此我建議在你的情況下,通過覆蓋表單中的getInputFilter方法創建整個InputFilter后添加驗證器。

class RegisterForm extends \Zend\Form\Form
{
    public function __construct()
    {
        // add stuff
    }

    public function getInputFilter()
    {
        $formInputFilter = parent::getInputFilter();
        $usernameInput = $formInputFilter->get('profile')->get('account')->get('username');

        $myValidator = new Validator\SomeValidator();
        $usernameInput->getValidatorChain()->addValidator($myValidator);

        return $formInputFilter;
    }
}    

作為旁注我建議限定InputFiltersForm基礎而不是每個Fieldset ,因為在元件Fieldset通常具有在不同的上下文(=表)不同“的驗證要求”。 但也許這更像是個人偏好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM