1

私が現在開発している ZF2 アプリケーションはアピジリティ ドリブンですが、一部のInputFilter設定を からmodule.config.php別のInputFilterファイル/クラスに移動する必要がありました。

今、私は(とりわけ)フィールドCompanyIdUserId. そのうちの 1 つ (1 つだけ) を設定する必要があります。以下を参照してCallbackください。しかし、うまくいきません。両方のフィールドが欠落している場合、検証は実行されません。

この問題はどのように解決できますか?

class AddressPostRequestInput implements ArraySerializableInterface {

    ...

    public function __construct() {
        $this->dataSet = [
            'CompanyId' => null,
            'UserId'    => null,
            'Type'      => null,
        ];
    }

    ...

    public function getInputFilter() {

        if (!$this->inputFilter) {

            $inputFilter = new InputFilter();
            $factory     = new InputFactory();

            ...

            $inputFilter->add($factory->createInput(array(

            ...

            $inputFilter->add($factory->createInput(array(
            'name' => 'CompanyId',
            'required' => false,
            'filters' => array(
                ...
            ),
            'validators' => array(
                array(
                    'name' => 'Callback',
                    'options' => array(
                    'callback' => function ($value, $context = array()) {
                        $isValid =
                            (isset($context['UserId']) && !isset($context['CompanyId'])) ||
                            (!isset($context['UserId']) && isset($context['CompanyId']))
                        ;
                        return $isValid;
                    },
                ),
            ),

            $inputFilter->add($factory->createInput(array(
            'name' => 'UserId',
            'required' => false,
            'filters' => array(
                ...
            ),
            'validators' => array(
                array(
                    'name' => 'Callback',
                    'options' => array(
                    'callback' => function ($value, $context = array()) {
                        $isValid =
                            (isset($context['UserId']) && !isset($context['CompanyId'])) ||
                            (!isset($context['UserId']) && isset($context['CompanyId']))
                        ;
                        return $isValid;
                    },
                ),
            ),
        )));

        $this->inputFilter = $inputFilter;
    }

    ...

}
4

1 に答える 1

0

これらの設定のどの組み合わせが必要かはまったく覚えていませんが、次のようになります。

    $inputFilter->add($factory->createInput(array(
        'name' => 'CompanyId',
        'required' => false,
        'allow_empty' => true,
        'continue_if_empty' => true,
        'filters' => array(
            ...
        ),

少し調整する必要があるかもしれませんが、それを行うことができるはずです

continue_if_empty と allow_empty の設定と、実装したコールバック バリデータ

于 2014-09-26T12:21:41.313 に答える