Symfony2多个表单按钮

时间:2016-09-23 02:06:41

标签: symfony

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

从文档中我知道查看是否单击按钮的唯一方法是使用: $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()会返回“status#”然后我可以做一个substr()来获取名称中的ID .. < / p>

1 个答案:

答案 0 :(得分: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) }}

这一切(通过一些调整)应该可以解决问题