我想通过在FOSUserBundle中编辑个人资料来添加其他项目 我试图通过使用表单集来解决。
实体/ information.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;
}
控制器/ ProfileController可
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',
));
}
// ...
窗体/类型/ ProfileFormType
// ...
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为object,array 给定的 /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
}
使用数据传输的正确方法是否像邀请系统一样? 是否可以使用收集表格?
答案 0 :(得分:1)
<强>解决。强>
我似乎不应该使用收集表格
我似乎应该使用“->add('profile', new ProfileType())
”。
希望这会有所帮助
实体/ Profile.php
namespace My\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="My\UserBundle\Repository\UserRepository")
*/
class Profile
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $website;
// .... and other profile
/**
* @ORM\OneToOne(targetEntity="User", mappedBy="profile", cascade={"persist", "merge", "remove"})
*/
protected $user;
// ....
}
实体/ user.php的
// ...
/**
* @ORM\OneToOne(targetEntity="Profile", inversedBy="user", cascade={"persist", "merge", "remove"})
* @ORM\JoinColumn(referencedColumnName="id")
*/
protected $profile;
public function setProfile(Profile $profile)
{
$this->profile = $profile;
}
public function getProfile()
{
return $this->profile;
}
控制器/ ProfileController可
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 profile table
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
if (! $user->getProfile())
$user->setProfile(new Profile());
$form = $this->container->get('fos_user.profile.form');
$formHandler = $this->container->get('fos_user.profile.form.handler');
$process = $formHandler->process($user);
// ...
窗体/类型/ ProfileType
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('website', 'text', array('required' => false))
// ... and other profile
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\UserBundle\Entity\Profile',
));
}
// ...
窗体/类型/ ProfileFormType
// ...
protected function buildUserForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username', null, array('label' => 'form.username', 'translation_domain' => 'FOSUserBundle'))
->add('profile', new ProfileType())
;
}
// ...
查看/资料/ edit_content.html.twig
// ...
<div>
{{ form_errors(form.profile.website) }}
</div>
<div>
<label>Website:</label>
{{ form_widget(form.profile.website) }}
</div>
// ... and other profile
<div>
{{ form_errors(form.current_password) }}
</div>
<div>
{{ form_label(form.current_password) }}
{{ form_widget(form.current_password) }}
</div>
{{ form_widget(form) }}
// ...
答案 1 :(得分:0)
看起来您编辑的用户没有填充information
,因此无法显示任何内容。阅读How to Embed a Collection of Forms文章。您可能必须使用某个值初始化此字段。