FormComponent - 将实体与表单传递给模板

时间:2014-04-02 20:22:35

标签: symfony symfony-forms symfony-2.3

假设我有一对多的关系:

  • 公司可以拥有多张图片
  • 我有公司实体和图片实体

现在,我想在模板中显示公司的所有图片。我也想让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保护和表单组件的智能使用。

1 个答案:

答案 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 %}