【问题标题】:FormComponent - Pass Entity with Form to TemplateFormComponent - 将带有表单的实体传递给模板
【发布时间】:2014-05-14 08:54:29
【问题描述】:

假设我有一个一对多的关系:

  • 一个公司可以拥有多张图片
  • 我有公司实体和形象实体

现在,我想在模板中显示公司的所有图片。而且我还想让这些图片直接可编辑。我想为 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 保护和表单组件的智能使用。

【问题讨论】:

    标签: symfony symfony-forms symfony-2.3


    【解决方案1】:

    正如您所说,将表单对象保留在实体中并不是一个好主意。它应该代表模型数据。

    我有两个解决方案:

    我。以图像 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 %}
    

    二。为单个图像渲染部分

    在控制器中

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

    【讨论】:

    • 不敢相信 symfony2 还没有添加这样的例子。我想知道其他人如何从实体列表中编辑实体?无论如何,感谢您的回答和出色的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2014-07-17
    • 1970-01-01
    • 2017-07-23
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多