symfony形式:在客户端设置实体

时间:2015-08-05 09:08:55

标签: javascript forms symfony submit

我对symfony2很新,所以在处理表单时我可能不了解一些重要细节...... 如何在页面呈现后在客户端为表单设置实体?

在我的页面上,我有几种产品和表格。我需要通过点击选择我要编辑的产品。所以我需要修改客户端的表单数据。这是我的简化模板代码:

<div class="product" onclick="editFormProduct({
        id: '{{ product1.id }}',
        name: '{{ product1.name }}'
        price: '{{ product1.price }}'
    })">
    <span>{{ product1.name }}</span>
    <span>{{ product1.price }}</span>
</div>

<div class="product" onclick="editFormProduct({
        id: '{{ product2.id }}',
        name: '{{ product2.name }}'
        price: '{{ product2.price }}'
    })">
    <span>{{ product2.name }}</span>
    <span>{{ product2.price }}</span>
</div>

{{ form_start(form, {'attr': {'id': 'form-product'}}) }}

    {{ form_widget(form.name) }}
    {{ form_widget(form.price) }}

{{ form_end(form) }}

<script type="text/javascript">
    function editFormProduct(product) {
        $('#form-product').find('input[id=form_id]').val(product.id);
        $('#form-product').find('div[name=name] input').val(product.name);
        $('#form-product').find('div[name=price] input').val(product.price);
    }
</script>

但是当我尝试提交时,我收到一个错误:&#34;属性&#34; id&#34;也不是其中一种方法&#34; addId()&#34; /&#34; removeId()&#34;,&#34; setId()&#34;,&#34; id()&# 34;,&#34; __ set()&#34;或&#34; __ call()&#34;在课堂上存在并拥有公共访问权限#34; AppBundle \ Entity \ Product&#34;

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

好吧,我至少找到了解决方案。不确定它是否是最干净的,但它确实有效。要在客户端选择动态编辑对象,您需要执行以下简单步骤:

  1. 在表单中创建一个隐藏字段,该字段将保留您当前选择进行编辑的对象的ID。
  2. 使用javascript在客户端点击(或任何你喜欢的方式)将对象的ID保存到此字段中。
  3. 表单提交后,使用此字段中的id从DB获取所需对象并对其应用更改。 这是一个控制器样本:

    class DefaultController extends Controller
    {
        public function indexAction(Request $request)
        {
            $repository = $this->getDoctrine()->getRepository('AppBundle:Product');
    
            //when the form is submitted, get edit_id
            //probably there is a better way to get the form data 
            //before creating the $form object...
            if ($request->request->get('form') != null)
                $editedProduct = $repository->find($request->request->get('form')['edit_id'] - 1);
            else
                $editedProduct = new Product();
    
            $form = $this->createFormBuilder($editedProduct)
                ->add('name', 'text')
                ->add('price', 'text')
                //hidden field that will store the id of the edited object
                //must not to be mapped, as it doesn't belong to the entity
                ->add('edit_id', 'hidden', array('mapped' => false));
    
            $form->handleRequest($request);
    
            ...
        }
    }
    

    相应的模板样本几乎等于原始样本:

    <div class="product" onclick="editFormProduct({
            id: '{{ product1.id }}',
            name: '{{ product1.name }}'
            price: '{{ product1.price }}'
       })">
       <span>{{ product1.name }}</span>
       <span>{{ product1.price }}</span>
    </div>
    
    <div class="product" onclick="editFormProduct({
            id: '{{ product2.id }}',
            name: '{{ product2.name }}'
            price: '{{ product2.price }}'
        })">
        <span>{{ product2.name }}</span>
        <span>{{ product2.price }}</span>
    </div>
    
    {{ form_start(form, {'attr': {'id': 'form-product'}}) }}
    
        {{ form_widget(form.name) }}
        {{ form_widget(form.price) }}
    
    {{ form_end(form) }}
    
    <script type="text/javascript">
        function editFormProduct(product) {
            //fill the edit_id field with the chosen product id
            $('#form-product').find('#form_edit_id').val(product.id);
            $('#form-product').find('#form_name').val(product.name);
            $('#form-product').find('#form_price').val(product.price);
        }
    </script>