2015-09-22 67 views
1

我遵循官方文档示例,但无法使其正常工作。嵌入表单的集合显示整个表单的字段

总结,我有材料items_budget表。他们两个是相关的一对多和多对一,由idmaterial领域:

Material.orm.yml

oneToMany: 
    itemsBudget: 
     targetEntity: ItemsBudget 
     mappedBy: material 

ItemsBudget.orm.yml

material: 
    targetEntity: Material 
    inversedBy: itemsBudget 
    joinColumn: 
     name: material 
     referencedColumnName: id 

这里,ItemsBudgetType哪里我设置了material字段作为collection

$builder->add('budget', 'entity', array(
      'class' => 'PanelBundle:Budget', 
      'attr' => array(
       'class' => 'form-control', 
      ), 
     )) 
     ->add('material', 'collection', array(
      'type' => new MaterialType(), 
      'allow_add' => true 
     )) 
     ->add('quantity', 'number', array(
      'attr' => array(
       'class' => 'form-control', 
      ), 
     )) 
     ->add('price', 'money', array(
      'attr' => array(
       'class' => 'form-control', 
      ), 
     )); 

只是供参考的MaterialType

$builder->add('name', 'text', array(
      'attr' => array(
       'class' => 'form-control', 
      ), 
     )) 
     ->add('description', 'text', array(
      'attr' => array(
       'class' => 'form-control', 
      ), 
     )) 
     ->add('current_quantity', 'text', array(
      'attr' => array(
       'class' => 'form-control', 
       'required' => false 
      ), 
     )) 
     ->add('price', 'money', array(
      'attr' => array(
       'class' => 'form-control', 
      ), 
     )); 

在这里,我ItemsBudget鉴于index.html.twig

<strong>Materiais</strong> 
<div class="form-group"> 
    <ul class="materials" data-prototype="{{ form_widget(form.material.vars.prototype)|e }}"> 
     {% for material in form.material %} 
      <li>{{ form_widget(form.material.vars.prototype.name) }}</li> 
     {% endfor %} 
    </ul> 
</div> 

在视图中,我也尝试过,因为它是在th例如:{{ form_row(material.name) }},但它仍然显示整个Material窗体。

在哪里,我打电话给他们,在ItemsBudgetController

public function addAction(Request $request) 
{ 
    $form = $this->createForm(new ItemsBudgetType(), new ItemsBudget()); 
    $manager = $this->getDoctrine()->getManager(); 

    if ($request->getMethod() == 'POST') { 
     $form->handleRequest($request); 

     if ($form->isValid()) { 
      $ItemsBudgetEntity = $form->getData(); 
      $manager->persist($ItemsBudgetEntity); 
      $manager->flush(); 

      $BudgetEntity = $form->get('budget')->getData(); 
      $BudgetEntity->addItemsBudget($ItemsBudgetEntity); 

      $manager->persist($BudgetEntity); 
      $manager->flush(); 

      $this->addFlash('success', 'Materiais para o orçamento adicionados'); 

      return $this->redirect($this->generateUrl('panel_budgets')); 
     } 
    } 

    return $this->render('PanelBundle:ItemsBudget:index.html.twig', array(
     'form' => $form->createView(), 
     'budgets' => $manager->getRepository('PanelBundle:Budget')->findAll() 
    )); 
} 

的JavaScript是由太的例子一样:

function addMaterial($collectionHolder, $newLinkLi) { 
    var prototype = $collectionHolder.data('prototype'); 
    var index = $collectionHolder.data('index'); 
    var newForm = prototype.replace(/__name__/g, index); 

    $collectionHolder.data('index', index + 1); 

    var $newFormLi = $('<li></li>').append(newForm); 
    $newLinkLi.before($newFormLi); 
} 

var $collectionHolder; 
var addMaterialLink = $('<a href="#" class="add_material_link">Mais</a>'); 
var $newLinkLi = $('<li></li>').append(addMaterialLink); 

jQuery(document).ready(function() { 
    $collectionHolder = $('ul.materials'); 
    $collectionHolder.append($newLinkLi); 
    $collectionHolder.data('index', $collectionHolder.find(':input').length); 

    addMaterialLink.on('click', function (e) { 
     e.preventDefault(); 
     addMaterial($collectionHolder, $newLinkLi); 
    }); 
}); 

这是问题:不是显示的从Material的形式只有name字段,它是每次单击“Mais”时显示整个表单。我错过了什么吗?

+0

您所期望的,当你在'数据prototype'属性整个形式? – malcolm

回答

1

JavaScript将获取data-prototype属性的内容并将其附加到表单的html中。模板中的属性包含{{ form_widget(form.material.vars.prototype)|e }},它是表单的html原型。

尝试:

<ul class="materials" data-prototype="{{ form_widget(form.material.vars.prototype.name) }}"> 
+0

哦,!@#$。现在我明白了文档。显示它的例子。我以为我不得不放入'for'。谢谢@LorenzSchaef。 :) – mfgabriel92