2013-05-14 32 views
1

我有一个Symfony项目与实体:PurchaseOrder,Article,Supplier。 订单可以有多个文章,并且订单可以有多个供应商。 您可以通过ArticleOrderReference(实体)设置每篇文章的数量。相关实体的多个输入字段

我构建了一个表单,我可以在这里添加文章到带有金额(ArticleOrderReference中的条目)的订单。 此外,我还有另一种形式,我可以在订单中添加供应商。

但现在我的问题是,我想创建一个表单,其中我有一个金额输入字段(对于ArticleOrderReference中与此订单相关的每篇文章),该表单适用于与订单相关的每个供应商。 例如:

Order 1: 

Article1  [amount InputField for Supplier1] [amount InputField for Supplier2] ... 
Article2  [amount InputField for Supplier1] [amount InputField for Supplier2] ... 

所以我建一个实体命名ArticleOrderSupplierReference,其中包括supplier_id,ArticleOrderReference_id和金额。

我没有线索,如何实现这一点。有些人告诉我使用嵌入式收藏,但我不知道如何在这种情况下使用它们。有任何想法吗?

ArticleOrderReference:

class ArticleOrderReference 
{ 
    ... 

/** @ORM\ManyToOne(targetEntity="Article", inversedBy="articles") */ 
protected $article; 

/** @ORM\ManyToOne(targetEntity="PurchaseOrder", inversedBy="purchaseOrders") */ 
protected $purchaseOrder; 

/** 
* @var integer 
* 
* @ORM\Column(name="amount", type="integer") 
*/ 
private $amount; 
... 
} 

文章:

class Article 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

    /** @ORM\OneToMany(targetEntity="ArticleOrderReference", mappedBy="article") */ 
    protected $articles; 

    public function __construct() { 
     $this->articles = new ArrayCollection(); 
    }... 

订单:

class PurchaseOrder 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date", type="datetime") 
    */ 
    private $date; 

    /** @ORM\OneToMany(targetEntity="ArticleOrderReference", mappedBy="purchaseOrder") */ 
    protected $purchaseOrders; 

    /** 
    * @ORM\ManyToMany(targetEntity="Supplier", inversedBy="purcaseOrders") 
    * @ORM\JoinTable(name="purchaseOrders_suppliers") 
    */ 
    private $suppliers; 

    public function __construct() 
    { 
     $this->purchaseOrders = new ArrayCollection(); 
     $this->suppliers = new ArrayCollection(); 
    }... 

供应商:

class Supplier 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 


    /** 
    * @ORM\ManyToMany(targetEntity="purchaseOrder", mappedBy="suppliers") 
    */ 
    private $purchaseOrders; 

    public function __construct() { 
     $this->purchaseOrders = new ArrayCollection(); 
    } 

ArticleOrderSupplierReference:

class AOSupplierReference 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
    private $id; 

/** @ORM\ManyToOne(targetEntity="ArticleOrderReference", inversedBy="articleOrderReferences") */ 
protected $articleOrderReference; 

/** @ORM\ManyToOne(targetEntity="Supplier", inversedBy="suppliers") */ 
protected $supplier; 

/** 
* @var integer 
* 
* @ORM\Column(name="amount", type="integer") 
*/ 
private $amount; 
+0

你的实体是如何设计的支持这个功能? – cheesemacfly

+0

我想可以使用嵌套集合来实现,但我还没有尝试过..:) – ihsan

+0

cheesemacfly:订单<->产品多对多关系和订单<->供应商多对多关系 ihsan:我会尝试thx – ChrisS

回答

0

我用双嵌入式集合解决了它。

首先,我建立了三个FormTypes:

与第一个我收集所有相关ArticleOrderReferences: 在我的控制器我称之为:$形式= $这个 - >的CreateForm(新AmountOrderType(),$顺序) ;并将其返回到我的树枝文件。

$builder->add('purchaseOrders', 'collection', array('type' => new AmountOrderArticleType())); 

随着第二个我搜集所有相关ArticleOrderSupplierReferences:

$builder->add('articleOrderReferences', 'collection', array('type' => new AmountOrderSubArticleType())); 

并与第三个我设置了金额:

$builder->add('amount'); 

树枝文件:

{% for purchaseOrder in form.purchaseOrders %} 
         <span class="articleOrderReferences"> 
          {% for articleOrderReference in purchaseOrder.articleOrderReferences %} 
           {{ form_errors(articleOrderReference.amount) }} 
           {{ form_widget(articleOrderReference.amount, { 'attr': {'class': 'input-mini'} }) }} 
          {% endfor %}<br> 
         </span> 

{% endfor %}