Я хотел бы добавить другие элементы, отредактировав профиль в FOSUserBundle.
Я пытался решить эту проблему с помощью коллекции форм.
Сущность/Информация.php
namespace My\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="My\UserBundle\Repository\UserRepository")
*/
class Information
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column @ORM\Column(type="string", length=255, nullable=true)
*/
protected $website;
// .... and other information
/**
* @ORM\OneToOne(targetEntity="User", mappedBy="information", cascade={"persist", "merge"})
*/
protected $user;
// ....
}
Сущность/User.php
// ...
public function __construct()
{
parent::__construct();
$this->information = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
/**
* @ORM\OneToOne(targetEntity="Information", inversedBy="user")
* @ORM\JoinColumn(referencedColumnName="id")
*/
protected $information;
/**
* Add information
*
* @param My\UserBundle\Entity\Information $information
* @return User
*/
public function addInformation(Information $information)
{
$this->information[] = $information;
return $this;
}
/**
* Remove information
*
* @param My\UserBundle\Entity\Information $information
*/
public function removeInformation(\My\UserBundle\Entity\Information $information)
{
$this->information->removeElement($information);
}
/**
* Get information
*
* @return Doctrine\Common\Collections\Collection
*/
public function getInformation()
{
return $this->information;
}
Контроллер/профилеконтроллер
public function editAction()
{
$em = $this->container->get('doctrine')->getManager();
$own = $this->container->get('security.context')->getToken()->getUser();
$user = $em->getRepository('MyUserBundle:User')->find_one_with_info($own); //=> Left join information table
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
if (count($user->getInformation()) == 0)
$user->addInformation(new Information());
$form = $this->container->get('fos_user.profile.form');
$formHandler = $this->container->get('fos_user.profile.form.handler');
$process = $formHandler->process($user);
// ...
Форма/Тип/Тип Информации
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('website', 'text', array('required' => false))
// ... and other information
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\UserBundle\Entity\Information',
));
}
// ...
Форма/Тип/ПрофильФормаТип
// ...
protected function buildUserForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
->add('information', 'collection', array(
'type' => new InformationType(),
))
;
}
// ...
Вид/Профиль/edit_content.html.twig
// ...
{% for info in form.information %}
<div class="_errors">
{{ form_errors(info.website) }}
</div>
<div class="_form_bar">
{{ form_widget(info.website) }}
</div>
// ... and other information
{% endfor %}
<div class="_errors">
{{ form_errors(form.current_password) }}
</div>
<div class="_form_bar">
{{ form_widget(form.current_password) }}
{{ form_label(form.current_password) }}
</div>
{{ form_widget(form) }}
// ...
Ошибка возникает, когда я отправил это.
Предупреждение: spl_object_hash() ожидает, что параметр 1 будет объектом, массивом, указанным в /path/to/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php, строка 1375.
точка ошибки: FOSUserBundle/Form/Handler/ProfileFormHandler.php
protected function onSuccess(UserInterface $user)
{
$this->userManager->updateUser($user); //=> error point
}
Правильно ли использовать передачу данных, как систему приглашений?
Возможно ли это с формой сбора?