【问题标题】:Symfony2 Multiple form ButtonsSymfony2 多表单按钮
【发布时间】:2016-09-23 17:40:59
【问题描述】:

我有一个订单实体。 我有一个包含许多状态选项的状态实体,即。已提交、已开票、已付款、已发货 (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..

【问题讨论】:

    标签: symfony


    【解决方案1】:

    我建议使用下拉菜单而不是 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) }}
    

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

    【讨论】:

    • 所以,我自己也在辩论这个问题,但是它似乎打开了另一个蠕虫罐......我的状态是我数据库中的一个实体,它具有自引用的多对多关系,它定义接下来允许什么状态。所以我试图为状态而不是选择类型添加一个 EntityType 表单字段,问题是我需要创建一个查询构建器来将实体限制在自引用关系中的实体,我被卡住了......以前我可以只使用 $status->getNextStatues() 但是当我需要给一个查询构建器时,我被卡住了......
    • 在这里提出了一个新问题:stackoverflow.com/questions/39661800/… 我可能会在一切就绪后将您的问题标记为答案。谢谢,希望你能帮助其他部分
    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 2014-03-14
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2013-03-01
    • 2012-04-18
    相关资源
    最近更新 更多