2016-09-23 34 views
0

我有一个Order实体。 我有一个状态实体,其中包含一些状态选项,即。已提交,已开票,付费,已发货(ID 1-4)。我有一个页面,我想列出它上面提到的每个对应于某个状态的多个按钮。基本上多个按钮的原因是,我希望用户能够通过点击他们想要的基本上跳过某些状态记录...我有一些逻辑,将确定按钮来呈现但是我的问题是能够告诉提交表单时点击了哪个按钮。Symfony2的多个表单按钮

从文档我知道,看是否被点击一个按钮的唯一方法是使用: $form->get('buttonName')->isClicked();

路上,我现在正在考虑这个权利是我的按钮将被statusId命名它对应于。即:$form->add('status1', SubmitType::class)#是状态记录的ID。

了这个问题,这是在页面上生成的按钮将是动态的。因此,它会像在这一点上,我需要查询我的数据库为所有的状态和遍历所有的可能性:

foreach ($statuses as $status) 
{ 
    if($form->get('status' . $status->getId())->isClicked()){ 
    { 
     //Do Something 

     break; 
    } 
} 

我觉得必须有一个更好的办法... IE:$form->getSubmitButtonName()这将返回“状态#”,然后我可以做一个SUBSTR()来获取ID出了名的..

回答

0

我会建议使用,而不是4个按钮的下拉菜单,只是一个简单的提交按钮保存。它应该解决你的问题,并且看起来好多了,然后有4个相同的按钮,只保存不同的值,例如下面的代码:

该实体应该看起来像这样:(我们的toString方法显示实际的名称,而不是(0,1,2,3)

abstract class OrderStatus{ 
const submitted    = 0; 
const Ivoiced    = 1; 
const Paid     = 2; 
const Shipped    = 3; 
} 

/** 
* @ORM\Column(type="integer") 
*/ 
protected $order_status; // see OrderStatus enum above 

/** 
* Set orderStatus 
* 
* @param integer $orderStatus 
* 
* @return Order 
*/ 
public function setOrderStatus($orderStatus) 
{ 
    $this->order_status = $orderStatus; 

    return $this; 
} 

/** 
* Get orderStatus 
* 
* @return integer 
*/ 
public function getOrderStatus() 
{ 
    return $this->order_status; 
} 

public function getOrderStatusToString() 
{ 
    switch ($this->getOrderStatus()) { 
     case 0: return "submitted"; break; 
     case 1: return "invoiced"; break; 
     case 2: return "paid"; break; 
     case 3: return "Shipped"; break; 
    } 
} 

在控制器补充一点:

//在形式(可以放在一个formType代替控制器,如果你想)方面的下拉菜单

$form = $this->createFormBuilder(your.entity.name) 
     ->add('orderStatus', 'choice', array(
      'choices' => array(
       'submitted' => 0, 
       'invoiced' => 1, 
       'paid' => 2, 
       'Shipped' => 3, 
      ), 
      'choices_as_values' => true, 
      'label'=>false 
     )) 

    $form->add('save', 'submit', array('label' => 'Save')); 
    $form = $form->getForm(); 

    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 
     $em=$this->getDoctrine()->getManager(); 
     $em->persist(your.entity.name); 
     $em->flush(); 
    } 

像HTML文件水木清华:(与任何CSS你想要的)

 {{ form_start(form) }} 
     {{ form_widget(form) }} 
     {{ form_end(form) }} 

这一起(一些调整)应该做的伎俩

+0

所以,我也讨论这个自己,但它似乎打开另一罐蠕虫......我的状态是我的数据库中的一个实体,它具有自我引用的多对多关系,它定义了接下来允许的状态。所以我试图添加一个EntityType表单字段的状态而不是选择类型,问题是我需要创建一个查询生成器来限制实体只是在自我引用关系的实体,我卡住了......以前我可以只使用$状态 - > getNextStatues(),但是当我需要给一个QueryBuilder的我被困... – snoop168

+0

问在这里一个新的问题: http://stackoverflow.com/questions/39661800/many-to-many -self-referencing-query-builder 一旦我完全正常工作,我可能会将你标记为答案。谢谢,希望你能帮助其他部分 – snoop168