【问题标题】:Handling forms of the same type处理相同类型的表格
【发布时间】:2018-05-29 18:48:29
【问题描述】:

我需要在一个页面上创建和处理同一实体的几种形式。另外,我需要为每个按钮设置单独的提交按钮。

目前,在一个循环中,我为每个实体创建了一个表单数组,但是当我尝试处理它时 - 它崩溃了。

主要问题是,当我提交表单时,一切似乎都很好 - 但产品始终是第一个生成的。

转储表格的结果是,它们与适当的产品实体相关联,但处理后会崩溃。

我的代码sn-ps:

控制器:

foreach ($products as $product) {
    $counter = 0;
    $date = $comparativeDate;

    $tempCart = new Cart();
    $tempCart->setProduct($product['product']);
    $tempCart->setUserId($user);
    $tempCart->setQuantity(0);
    $tempCartForm = $this->createForm('AppBundle\Form\CartType',$tempCart, array('kind' => 'myProducts'));
    $tempCartForm->handleRequest($request);

    if($tempCartForm->isSubmitted() && $tempCartForm->isValid())
    {
        $data = $tempCartForm->getData();       
        $query = $em->createQueryBuilder()
          ->select('c','p')
          ->from('AppBundle:Cart','c')
          ->join('c.product','p')
          ->where("p = :product")
          ->andWhere("c.userId = :user")
          ->setParameter('product',$product['product'])
          ->setParameter('user',$user->getId())
          ->getQuery();

        $foundCart = $query->getResult();

        if(is_null($foundCart) || empty($foundCart))
        {
            $em->persist($data);
        }else{

          $foundCart = $foundCart[0];
          $foundCart->setQuantity($foundCart->getQuantity()+$data->getQuantity());
          $em->persist($foundCart);
        }

        $em->flush();

        return $this->redirectToRoute('my_products');
    }

    foreach ($products as $secondProduct) {

        if($product['product'] === $secondProduct['product'])
        {
            $counter++;

            if($date<$secondProduct['date'])
            {
                $date = $secondProduct['date'];
            }

            unset($secondProduct);
        }

        $productId = $product['product']->getId();

        //szykujemy tablice z danymi gotowymi do wyswietlenia
        $groupedProducts[$productId]['count']=$counter;
        $groupedProducts[$productId]['product']=$product['product'];
        $groupedProducts[$productId]['last_date']=$date;
        $groupedProducts[$productId]['form_view']=$tempCartForm->createView();
    }
}

购物车类型:

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

use Symfony\Component\OptionsResolver\OptionsResolver;

class CartType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder->add('quantity', IntegerType::class, [
           'label' => false
         ]);

         if($options['kind']=='myProducts'){
            $builder->add('save', SubmitType::class, [
           'label' => 'SLIJ'
         ])
                     ->add('product', EntityType::class, [
                        'class' => 'AppBundle:Product',
         ]);
         }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Cart',
            'kind'      => null
        ));
    }

}

?>

购物车字段:

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="carts")
     */
    private $userId;

    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="carts")
     */
    protected $product;

    /**
     * @ORM\Column(type="integer")
     */
    private $quantity;

表格是在模板中为每个 groupedProducts 行生成的。

【问题讨论】:

  • 你能添加 html/twig 吗?另外,您是如何提交表单的?
  • “主要问题是,当我提交表单时,一切看起来都很好——但产品总是第一个生成的。”是什么意思?你的意思是来自主 foreach 循环的产品?
  • @LioraHaydont 不需要输入代码 - 只需 form_start、form_widget(form) 和 form_end。即使我将保存和产品字段添加到 Carttype.php 它也不起作用
  • @FranckGamess 完全正确。但请记住 - 表单已连接到正确的购物车实体(我的意思是使用正确的产品),但在提交后出现该错误

标签: php symfony symfony-forms


【解决方案1】:

主要问题是,当我提交表单时,一切似乎都很好 - 但产品始终是第一个生成的。

如果你提交表单,下面的代码应该被执行

if($tempCartForm->isSubmitted() && $tempCartForm->isValid())
{
    // code ...
    return $this->redirectToRoute('my_products');
}

那么它不会到达处理第二个产品的代码,不是吗?

【讨论】:

  • 那么我应该如何处理这一堆表格呢?我认为这是一个好方法 - 在同一个控制器的另一种方法中,我做了类似的事情,一切都很完美。
  • 在这种情况下尝试在测试表单提交之前执行第二个 foreach 或在处理第二个产品后转到 my_products 路由
猜你喜欢
  • 2015-06-12
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
相关资源
最近更新 更多