Symfony2嵌入式表格

时间:2013-06-07 07:55:23

标签: forms symfony

我试图理解symfony2中的嵌入表单。

我有两个实体iconasset它们之间存在多对多关系,OneToOne$icon->imageLarge上有icon->imageThumb

注意:(资产是类名,但在图标内引用为$image...

我最终想要的是一个与图标相关的图像库和图标上的两列,以反映哪个图像是主缩略图和主要大图像......

我创建了一个IconType:

class IconType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options){
    $builder->add('name');
    $builder->add('imageThumb', new AssetType());
    $builder->add('imageLarge', new AssetType());
}

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


public function setDefaultOptions(OptionsResolverInterface $resolver){
    $resolver->setDefaults(array(
        'data_class' => 'SixString\PearBundle\Entity\Icon',
    ));
}
} 

和AssetType:

class AssetType extends AbstractType{

public function buildForm(FormBuilderInterface $builder, array $options){
    $builder->add('file');
}

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


public function setDefaultOptions(OptionsResolverInterface $resolver){
    $resolver->setDefaults(array(
            'data_class' => 'SixString\PearBundle\Entity\Asset',
        ));
}
}

我在控制器中创建了我的表单:

$icon = new Icon;
$form = $this->createForm(new IconType(), $icon);

if($request->isMethod('POST')) {
    $form->bind($request);
    if ($form->isValid()) {
      ....
    }
}
return $this->render('SixStringPearBundle:Icon:form.html.twig', array("form" => $form->createView()));

到目前为止,所有内容似乎都在互动,我在模板中创建了我的表单,它显示了图标名称字段以及两个资产文件上传者。

我迷路的地方是如何访问上传的assets。我需要将这两个assets持久保存到db,然后将$icon->addImage($asset1); $icon->addImage($asset2);设置为多对多,并$icon->setImageThumb($asset1); $icon->setImageLarge($asset2);

我不确定这一切是否有意义,但任何帮助搞清楚逻辑或只是如何访问这些资产都将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以按如下方式访问上传的资源:

$imageThumbFile = $form->get('imageThumb')->get('file')->getData();
$imageLargeFile = $form->get('imageLarge')->get('file')->getData();

如果您计划将这些存储在数据库中作为blob,那么您可能会发现此SO问题有用:How do I persist Images with Doctrine

或者,您可以将上传的文件存储在文件系统中,并按照菜谱条目How to handle File Uploads with Doctrine

将文件上传集成到您的实体生命周期中

编辑:

如果使用cookbook条目中的生命周期回调方法:

  1. 与示例中的Document类似地实施Asset类
  2. 修改Icon类以从Icon :: setImageThumb()和Icon :: setImageLarge()
  3. 调用$ this-> addImage($ asset)
  4. 对于Icon类,将cascade持久化添加到$ images关系
  5. 从控制器调用仅持续$ icon,其他一切都应该自行处理。