假设我有一对多的关系:
现在,我想在模板中显示公司的所有图片。我也想让theese图片直接可编辑。我想到将一个表单添加到DoctrineArrayCollection的每个实体并将它们传递给模板。在模板中,如果有人点击图片,相应的应该淡入,应该能够编辑图片描述并通过ajax传递给控制器。
在我的实体中,我添加了一个没有注释的字段:
private $form;
public function setForm(MyPictureForm $form)
{
$this->form = $form;
}
public function getForm()
{
return $this->form;
}
现在,在我的控制器中,我将一个表单实例添加到公司的每张图片中:
//office images with forms
$officeImages = array();
foreach($company->getOfficeImages() as $image)
{
$form = $this->get('companybundle.imagedescription.form.factory')->createForm();
$form->setData($image);
$image->setForm($form->createView());
array_push($officeImages, $image);
}
return $this->render('CompanyBundle:Company:Show/show.html.twig', array(
'company' => $company,
'officeImages' => $officeImages
));
}
在我的模板中,我就像这样渲染它:
{% for image in officeImages %}
<a href="#" title="{% if image.description %}{{ company.description }}{% else %}CLICK HERE FOR EDIT{% endif %}">
{% if image.image %}
<img src="{{ vich_uploader_asset(image, 'image') | imagine_filter('company_office_image_thumb') }}"
alt="{% if image.description %}{{ company.description }}{% endif %}"/>
{% else %}
{% image '@UserBundle/Resources/public/img/nopic_logo.jpg' output='/images/nopic_logo.jpg' %}
<img src="{{ asset_url }}" alt="Joblogo"/>
{% endimage %}
{% endif %}
</a>
{{ form(image.form) }}
{% else %}
<p>Es sind noch keine Images vorhanden</p>
{% endfor %}
最后,有很多javascript的东西,它们会淡化/淡出表单并提交。
这是处理我案件的正确方法吗?我认为不是因为传递一张表格看起来像是开销吗?
我使用表单而不是简单地从手动添加的输入字段传递数据的原因是csrf保护和表单组件的智能使用。
答案 0 :(得分:2)
正如你所说,在实体中保留表单对象并不是一个好主意。它应该代表模型数据。
我有两个解决方案:
<强>予。传递以图像ID为键的表格数组
$officeImages = array();
$imageForms = array();
foreach($company->getOfficeImages() as $image)
{
$form = $this->get('companybundle.imagedescription.form.factory')->createForm();
$form->setData($image);
$imageForms[$image->getId()] = $form->createView();
}
return $this->render('CompanyBundle:Company:Show/show.html.twig', array(
'company' => $company,
'officeImages' => $officeImages,
'imageForms' => imageForms
));
并在 show.html.twig
中{% for image in officeImages %}
{# your image display code #}
{{ form(imageForms[image.id]) }}
{% endfor %}
<强> II。为单张图片渲染部分
控制器中的
public function showAndEditImageAction(Image $image)
{
$form = $this->get('companybundle.imagedescription.form.factory')->createForm();
$form->setData($image);
return $this->render(
'CompanyBundle:Company:Show/showAndEditImage.html.twig', array(
'image' => $image,
'imageForm' => $form->createView()
));
}
在树枝上
{# CompanyBundle:Company:Show/showAndEditImage.html.twig #}
{# your image display code #}
{{ form(imageform) }}
{# CompanyBundle:Company:Show/show.html.twig #}
{% for image in officeImages %}
{{ render(controller('CompanyBundle:Company:showAndEditImage',
{ 'image': image })) }}
{% endfor %}