@EvgeniiR
https://github.com/EvgeniiR

Password_widget в Symfony ложит всю систему?

Итак. Как всё происходило:
1. Я разбирался с кастомизацией форм в Symfony https://symfony.com/doc/current/form/form_customization .
Дошел до таких примеров
{% block text_widget %}
    <div class="form-control">
        {{ block('form_widget_simple') }}
    </div>
{% endblock %}

2. Так как в Symfony как всегда очень хорошая документация, я так и не смог найти что нужно указать в block('...'); чтобы у меня был input с текстом для ввода пароля. Зато там написано что все эти шаблоны хранятся по пути
FrameworkBundle/Resources/views/Form
Собственно, по этому пути я нашел файл "password_widget.html.php",
3. Ну, недолго думая, я создал такой вот код:
{% block password_widget %}
    <div class="form-control">
        {{ block('password_widget') }}
    </div>
{% endblock %}


4. Попытался перезагрузить страницу. Что из этого вышло:
- Страница бесконечно загружается. Терпимо. Нужно искать ошибку. Но сначала попытался оставить её и посмотреть что прогрузит через пол минуты.
- Прилагаю скрин, чтобы было яснее:
Скрин
5b3bee0cb0c02778561551.png

Конкретно: CPU компьютера стало загружено на 100%. Когда я первый раз пытался загрузить эту страницу, она ещё и умудрилась как то забить всю оперативную память. Обычно swap у меня не используется.

Итак, пара вопросов:
1. Как сделать поле для ввода пароля
2. password_widget то где-то используется, или я залез куда не нужно?

Используется Symfony 4 и PHP 7. Систему грузит php-fpm

Upd: такой код, например, работает
{% block password_row %}
    <div>
        {{ block('form_label') }}
        <div class="form-control">
            {{ block('password_widget') }}
        </div>
    </div>
{% endblock %}


Класс формы(брал из документации)
UserType.php
<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class)
            ->add('username', TextType::class)
            ->add('plainPassword', RepeatedType::class, array(
                'type' => PasswordType::class,
                'first_options'  => array('label' => 'Password'),
                'second_options' => array('label' => 'Repeat Password'),
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }
}

Вид:
register.html.twig
{% extends 'base.html.twig' %}

{% form_theme form _self %}
{% block password_widget %}
    <div class="form-control">
        {{ block('password_widget') }}
    </div>
{% endblock %}
{% block body %}
    <div class="form-control col-md-6">
        {{ form_start(form) }}
        <div>
            {{ form_label(form.username) }}:
            {{ form_errors(form.username) }}
            {{ form_widget(form.username) }}
            {{ form_help(form.username) }}
        </div>
        {{ form_row(form.email) }}
        {{ form_row(form.plainPassword.first) }}
        {{ form_row(form.plainPassword.second) }}

        <button type="submit">Register!</button>
        {{ form_end (form) }}
    </div>
{% endblock %}

  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Поздравляю, теперь вы знаете что такое рекурсия :)
{% block password_widget %}
    <div class="form-control">
        {{ block('password_widget') }}
    </div>
{% endblock %}


Уберите код
{% form_theme form _self %}
{% block password_widget %}
    <div class="form-control">
        {{ block('password_widget') }}
    </div>
{% endblock %}


и все должно заработать

Если очень хочется кастомизировать, то
{% block password_widget %}
    <div class="form-control">
        {%- set type = type|default('password') -%}
        {{ block('form_widget_simple') }}
    </div>
{% endblock %}

либо, как вы написали, через password_row, либо как сказано в очень хорошей документации

Базовые реализации лежат в form_div_layout.html.twig, в FrameworkBundle/Resources/views/Form лежат шаблоны для php-форм
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы