我想在Sonata周围创建我的应用程序,但我遇到了一些问题...
我扩展了BaseUser以创建自己的用户,我为UserAdmin做了同样的事情。 我创建了一个其他实体,用户在该实体上有一个关系OneToOne但我不希望用户可以通过链接到该实体的Admin来管理该实体。
我希望用户填写这些实体的唯一方法是UserAdmin,我试过这样的事情:
protected function configureFormFields(FormMapper $formMapper){
parent::configureFormFields($formMapper);
$formMapper
->tab('Client details')
->with('Client Identity', array('class' => 'col-md-6'))
->add("test", EntityType::class, array(
"class" => "AppBundle:PersonDetails",
"property_path" => "details.test"
))
->end()
->end();
}
这是我的用户类:
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="PersonDetails")
* @ORM\JoinColumn(name="details_id", referencedColumnName="id")
*/
private $details;
public function __construct()
{
parent::__construct();
$this->details = new PersonDetails();
}
/**
* @return PersonDetails
*/
public function getDetails()
{
return $this->details;
}
/**
* @param PersonDetails $details
*/
public function setDetails($details)
{
$this->details = $details;
}
}
我唯一能找到的是一个选择,希望我选择现有的PersonDetails(我想)。
我怎样才能做到这一点?并且,如果它可以轻松实现,为什么它不会出现在文档中?我认为这种情况并不罕见..
感谢您的帮助
答案 0 :(得分:1)
Sonata将尝试解析传递给add("test")
的字符串,因此我们可以通过简单的add("details.test")
访问我们的实体不受任何Sonata管理的驱动。
我们不需要任何其他配置来使关系工作。 只是不要忘记Cascade Persist和Deletion的Doctrine配置:
在班级用户中:
public class User extends BaseUser{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToOne(targetEntity="PersonDetails", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="details_id", referencedColumnName="id")
*/
private $details;
// The rest of the class
}
并在UserAdmin类中:
protected function configureFormFields(FormMapper $formMapper)
{
parent::configureFormFields($formMapper);
$formMapper
->tab('Client details')
->with('Client Identity', array('class' => 'col-md-6'))
->add("details.test")
->end()
->end();
}