symfony2中的复选框字段

时间:2013-05-31 06:22:38

标签: forms symfony doctrine-orm

大家早上好!是一种形式。

Class ReleasesType:

$builder
    ->add('doid', 'text')
    ->add('dourl', 'text')
     ->add('artists', 'entity', array(
        'class' => 'MReleaseCoreBundle:Artists',
        'property' => 'name',
        'expanded' => true ,
        'multiple' => true                
    ));

与他们一对多的联系:

班级'艺术家':

/**
 * @ORM\OneToMany(targetEntity="ReleasesArtists" , mappedBy="artists" , cascade={"all"})
 * */
private $da;

public function __construct() {
    $this->da = new \Doctrine\Common\Collections\ArrayCollection();
} 

班级'发布艺术家':

/**
 * @ORM\ManyToOne(targetEntity="Releases", inversedBy="da")
 * @ORM\JoinColumn(name="releases_id", referencedColumnName="id")
 * */ 
private $releases;

/**
 * @ORM\ManyToOne(targetEntity="Artists", inversedBy="da")
 * @ORM\JoinColumn(name="artists_id", referencedColumnName="id")
 * */
private $artists;

当然,实体'发布':

/**
 * @ORM\OneToMany(targetEntity="ReleasesArtists" , mappedBy="releases", cascade={"all"} , orphanRemoval=true)
 */
private $da;

public function getArtists() {

    $artists = new ArrayCollection();

    foreach($this->da as $p) {
        $artists[] = $p->getArtists()->getName();
    }

    return $artists;

}    

public function addDa($da) {
    $this->da[] = $da;
}

public function setArtists($artists) {

    foreach($artists as $p) {
        $po = new \MRelease\CoreBundle\Entity\ReleasesArtists();

        $po->setReleases($this);
        $po->setArtists($p);

        $this->addDa($po);
    }

}

连接正常,所有输出。但不“检查”。可能是什么问题? 谢谢!

1 个答案:

答案 0 :(得分:0)

在构建和输出表单的控制器中,你必须做这样的事情

public function myFooAction(Request $request, $releasesId)
{
  $repo = $this->getDoctrine()->getManager()->getRepository('YourBundleName:Releases');
  $releasesObject = $repo->findOneById($releasesId);
  $form = $this->createForm(new ReleasesType(), $releasesObject);
  return $this->render('YourBundle::TemplateToRender, array('form'=>$form);
}



这里发生了什么,为什么有效?

我做了一些假设,因为你没有提供任何控制器代码。首先,我假设您有myFooAction()之类的操作,您可以在其中执行表单操作,我想,您也可以将来自数据库的加载对象的id传递给此操作并将其绑定到您的操作形式 - 如果我理解你的问题。
因此,第一行是针对此对象的检索存储库。一旦你有了回购,你可以获取你的对象(第二行)。在第三行,我使用Symfony2表单的工具和“连接”对象到他的表单类型:这样,包含在此对象中的所有值都将报告到您的表单中(因此复选框将具有正确的值)。最后一行是渲染形式。

显然,你的行动逻辑可能不同,但这里表达的概念可以在任何地方以“不同”的实施方式复制。