prudkovski
@prudkovski

FosUserBundle: редактирование профайла в разных формах?

Всем доброго времени суток!

Подскажите как реализовать редактирование атрибутов профайла в разных формах? Т.е. мне нужно иметь несколько форм для редактирования например "имя", "телефон и адрес" и так далее.

Нашел, что-то похожее в документации symfony.com/doc/current/cookbook/form/form_collect...
Но может есть попроще алгоритм?
  • Вопрос задан
  • 2283 просмотра
Решения вопроса 1
benbor
@benbor
Помог ответ - не забудь лайкнуть
То, что вы нашли, это коллекции сущностей, то есть с помощью этого механизма можно добавлять сразу несколько новых сущностей, на одной форме (например сразу несколько новых тегов)
Насколько я понял, Вам именно нужно редактирование одной сущности, но в разных местах приложения с разными наборами атрибутов. Просто используйте несколько форм.
class FirstEditForm extends ..... 
{
   public function build($builder) {
      $builder->add('username');
  }
}

class SecondEditForm extends ..... 
{
  public function build($builder) {
    $builder->add('location');
    $builder->add('number');
  }
}

и отображайте их в разных местах, и она Вам поменяют разные части вашего профиля
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
prudkovski
@prudkovski Автор вопроса
Сделал так:

Создал форму
// ProfileFormPhoneType.php
namespace Pet\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ProfileFormPhoneType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('phone');
    }

    public function getName()
    {
        return 'formPhone';
    }

}


В show action контроллера

public function showAction()
{
...
$formPhone = $this->container->get('form.factory')->create(new ProfileFormPhoneType(), $user); 
...
}


В контроллере создал отдельный action для обработки
/**
    * Edit user phone
    */
    public function editPhoneAction()
    {
        $user = $this->container->get('security.context')->getToken()->getUser();
        if (!is_object($user) || !$user instanceof UserInterface) {
            throw new AccessDeniedException('This user does not have access to this section.');
        }

        $formPhone = $this->container->get('form.factory')->create(new ProfileFormPhoneType(), $user);         

        $request = $this->container->get('request');
        if ($request->getMethod() == 'POST')
        {
            $formPhone->bind($request);

            if ($formPhone->isValid())
            {
                $em = $this->container->get('doctrine')->getEntityManager();
                $em->persist($user);
                $em->flush();
                $this->setFlash('pet_user_success', 'profile.flash.updated');
                return new RedirectResponse($this->getRedirectionUrl($user));
            }
        }
    }


Вроде бы работает, ничего криминального не наворотил?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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