Zend Form: использовать результат поля, введенного пользователем в другом поле - PullRequest
1 голос
/ 07 мая 2019

Я хочу использовать поле, введенное пользователем в форму, в другом поле с помощью обычной функции:

Я хочу использовать результат function addAppId() в регулярном выражении другого поля addDbName()

Итак, я хочу знать, возможно ли сохранить результат первой функции в переменной и использовать его во второй функции (моей формы).

protected function addAppId()
{
    $this->add(array(
        'name' => 'app_id',
        'type' => 'Zend\Form\Element\Select',
        'options' => array(
            'label' => 'App Name',
            'label_size' => 4,
            'elm_size' => 8,
            'empty_option' => __('---Selectionner une Application---'),
            'value_options' => array()
        ),
        'input_filter' => array(
            'required' => true,
            'filters' => array(
                new \Zend\Filter\StripTags(),
                new \Zend\Filter\StringTrim(),
            ),
            'validators' => array(
                new \Zend\Validator\GreaterThan(array(
                    'min' => 0,
                )),
                new \Zend\I18n\Validator\IsInt(),
            ),
        ),
    ));
}

protected function addDbName()
    {

        $this->add(array(
            'name' => 'db_name',
            'type' => 'Zend\Form\Element\Text',
            'options' => array(
                'label' => 'Database Name',               
            ),
.............

                    new \Zend\Validator\Regex(array(
                        'pattern'=> '/^[I_WANT_TO_ADD_THE_VARIABLE_HERE]/',

            ),
        ));
    }

1 Ответ

0 голосов
/ 07 мая 2019

Если я правильно понял, вы хотите проверить поле db_name, используя выражение регулярного выражения, которое должно содержать значение app_id.

Если да, то ответом будет использование Callback валидатор.Это пример:

/**
 * This must be populated in the constructor or in the init function,
 * however before calling addAppId()
 *
 * @var array
 */
protected $appId = array(
    1 => array(
        'name' => 'Wordpress',
        'dbPrefix' => 'wp'
    ),
    2 => array(
        'name' => 'Magento',
        'prefix' => 'magento'
    ),
    3 => array(
        'name' => 'My wonderful app',
        'prefix' => 'my_wonderful_app'
    )
);

protected function addAppId() {
    $valueOptions = [];
    foreach($this->appId as $appId => $app){
        $valueOptions[$appId] = $app['name'];
    }
    $this->add(array(
        'name' => 'app_id',
        'type' => 'Zend\Form\Element\Select',
        'options' => array(
            'label' => 'App Name',
            'value_options' => $valueOptions
        )
    ));

}

protected function addDbName() {
    $prefixes = [];
    foreach($this->appId as $appId => $app){
        $prefixes[$appId] = $app['prefix'];
    }
    $this->add(array(
        'name' => 'db_name',
        'type' => 'Zend\Form\Element\Text',
        'options' => array(
            'label' => 'Database Name',
        ),
        'validators' => array(
            array(
                'name' => 'Callback',
                'options' => [
                    'callback' => function($value, $context) use ($prefixes) {
                        if(!isset($context['app_id'])){
                            return false;
                        }
                        $appId = $context['app_id'];
                        if(!isset($prefixes[$appId])){
                            return false;
                        }

                        // If you want to check that the app_id name is the
                        // prefix of the db, pattern should be:
                        // $pattern = '/^'.$appId.'.*/';
                        $pattern = '/^' . $prefixes[$appId] . '/';

                        $status = preg_match($pattern, $value);
                        return $status !== '' && $status === false;
                    },
                    'messages' => [
                        \Zend\Validator\Callback::INVALID_VALUE => "Database name doesn't match the App name"
                    ]
                ]
            )
        )
    ));
}
}
...