Встроенная форма отображает неверный тип ввода - PullRequest
0 голосов
/ 23 октября 2019

Чтобы разрешить настройку регистрационной формы, некоторые поля формы генерируются из информации базы данных и формы, встроенной в регистрационную форму.

Хотя каждое поле встроенной формы по какой-то причине набирается, когдаЯ отображаю их с помощью ветки, некоторые типы, такие как url или number, отображаются как тип ввода text.

Тем не менее все поля основной формы (nom, prenom, email, plainPassword) отображаютсяс назначенным типом.

Как вы можете видеть из фрагментов кода, я правильно использую form_widget и form_widget для рендеринга каждого ввода, поэтому обработка типов выполняется Symfony.

Когда я выкидываю каждое formView для каждого поля, в пределах field.vars.block_prefixes (массив) я могу найти тип ввода, как и должно быть.

Например, это содержимое text input:

"block_prefixes" => array:3 [▼
  0 => "form"
  1 => "text"
  2 => "_security_extraDataCollection_datum-30"
]

Содержимое url input:

"block_prefixes" => array:4 [▼
  0 => "form"
  1 => "text"
  2 => "url"
  3 => "_security_extraDataCollection_datum-31"
]

И содержимое number input:

"block_prefixes" => array:3 [▼
  0 => "form"
  1 => "number"
  2 => "_security_extraDataCollection_datum-33"
]

Atво-первых, я думал, что это потому, что я использовал material-component-web, но даже без CSS, эта проблема возникает.

Любая идея о том, почему url и number тип превращаются в text тип, когда я отрисовываю их из зашифрованной формы?

Регистрационная форма

public function buildForm(FormBuilderInterface $builder, array $options) {
    /** @var array $extraData */
    $extraData=$options['extra_data'];

    $builder->add('nom')
            ->add('prenom')
            ->add('email', EmailType::class)
            ->add('plainPassword', PasswordType::class, array(
                'mapped'=>false,
                'constraints'=>array(
                    new NotBlank(array(
                        'message'=>'Please enter a password',
                    )),
                    new Length(array(
                        'min'=>6,
                        'max'=>4096,
                    )),
                ),
            ));

    if($extraData !== null && is_array($extraData) && count($extraData)) {
        $builder->add('extraDataCollection', UnmappedMixedType::class, array(
            'mapped'=>false,
            'data'=>$extraData,
        ));
    }
}

Форма UnmappedMixedType

public function buildForm(FormBuilderInterface $builder, array $options) {
    /** @var array $extraData */
    $extraData=$options['data'];

    /** @var ExtraData $extraDatum */
    foreach($extraData as $extraDatum) {
        if($extraDatum->getType() == 'text') {
            $builder->add('datum-'.$extraDatum->getId(), TextType::class, array(
                'mapped'=>false,
                'required'=>$extraDatum->getIsObligatoire(),
                'label'=>$extraDatum->getLabel(),
            ));
        } elseif($extraDatum->getType() == 'url') {
            $builder->add('datum-'.$extraDatum->getId(), UrlType::class, array(
                'mapped'=>false,
                'required'=>$extraDatum->getIsObligatoire(),
                'label'=>$extraDatum->getLabel(),
            ));
        } elseif($extraDatum->getType() == 'number') {
            $builder->add('datum-'.$extraDatum->getId(), NumberType::class, array(
                'mapped'=>false,
                'required'=>$extraDatum->getIsObligatoire(),
                'label'=>$extraDatum->getLabel(),
            ));
        } elseif($extraDatum->getType() == 'checkbox') {
            $builder->add('datum-'.$extraDatum->getId(), CheckboxType::class, array(
                'mapped'=>false,
                'required'=>$extraDatum->getIsObligatoire(),
                'label'=>$extraDatum->getLabel(),
            ));
        } elseif($extraDatum->getType() == 'choice' && $extraDatum->getChoix() !== null && count($extraDatum->getChoix()) >= 1) {
            $builder->add('datum-'.$extraDatum->getId(), ChoiceType::class, array(
                'mapped'=>false,
                'required'=>$extraDatum->getIsObligatoire(),
                'label'=>$extraDatum->getLabel(),
                'multiple'=>$extraDatum->getIsChoixMultipleUtilisateur(),
                'choices'=>array_combine($extraDatum->getChoix(), $extraDatum->getChoix()),
            ));
        }
    }
}

Просмотр веток

{% if form.extraDataForm is defined %}
    <div class="app-auth-left-frame-extra">
        <div class="app-form-container">
            <div class="app-form_field-container">
                {% for field in form.extraDataForm %}
                    {{ dump(field) }}
                    {% if field.vars.block_prefixes[1] == 'text' or field.vars.block_prefixes[1] == 'number' %}
                        <div class="mdc-text-field mdc-text-field--outlined">
                            {{ form_widget(field, {'attr': {'class': 'mdc-text-field__input'}}) }}
                            <div class="mdc-notched-outline">
                                <div class="mdc-notched-outline__leading"></div>
                                <div class="mdc-notched-outline__notch">
                                    {{ form_label(field, null, {'label_attr': {'class': 'mdc-floating-label'}}) }}
                                </div>
                                <div class="mdc-notched-outline__trailing"></div>
                            </div>
                        </div>
                    {% elseif field.vars.block_prefixes[1] == 'checkbox' %}
                        <div class="mdc-form-field">
                            <div class="mdc-checkbox">
                                {{ form_widget(field, {'attr': {'class': 'mdc-checkbox__native-control'}}) }}
                                <div class="mdc-checkbox__background">
                                    <!--suppress HtmlUnknownAttribute -->
                                    <svg class="mdc-checkbox__checkmark" viewBox="0 0 24 24">
                                        <path class="mdc-checkbox__checkmark-path" fill="none" d="M1.73,12.91 8.1,19.28 22.79,4.59"></path>
                                    </svg>
                                </div>
                            </div>
                            {{ form_label(field, null, {'label_attr': {'class': 'app-txt-light-emphasis'}}) }}
                        </div>
                    {% elseif field.vars.block_prefixes[1] == 'choice' %}
                        <div>{{ form_widget(field) }}</div>
                    {% endif %}
                {% endfor %}
            </div>
        </div>
    </div>
{% endif %}

1 Ответ

1 голос
/ 24 октября 2019

Поле UrlType , как сказано в документации:

Поле UrlType является текстовым полем, в котором передается переданное значение с заданным протоколом (например, http://), если переданное значениееще не имеет протокола.

Если вы хотите, чтобы ввод с типом url создал свой собственный тип поля формы, например:

class MyUrlType extends AbstractType {

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['type'] = 'url';
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return __NAMESPACE__.'\TextType';
    }
}

Отсюда https://symfony.com/doc/current/form/create_custom_field_type.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...