Symfony2深入帮助整个购物车

时间:2015-04-27 14:02:46

标签: php arrays magento symfony twig

我想首先说这个购物车不是由我创建的,但它以我需要的方式改变,我理解大部分代码及其工作方式,所有功能和方法都是我的。我不明白的事情我希望和你们一起学习。这将是一个漫长而深入的帖子,但我希望你能像我在向你学习一样教我。

背景

我有一个电子商务项目,我需要在其中为要存储的产品创建购物车。过程如下:indexpage(包含所有产品) - > detailspage(所选产品的详细信息) ) - >摘要(包含所选产品的购物车)。

问题:

我的代码中有一些问题,只是关于我没有创建的购物车的简单问题。我希望你能帮助我理解它们。

问题:

代码有一些问题,但是一旦解决了最大的问题,我可能会搞清楚所有问题:

当我将第一个产品添加到购物车时,它就像一个魅力,我能够显示价格,折扣和我需要的一切,我甚至可以删除它。添加第二个产品后,循环加倍。这意味着我将获得Product1,Product2,Product1,Product2,而不是Product1,Product2。同样适用于3种产品等。这是最大的问题。还有一件奇怪的事情。在购物车和产品上进行转储(稍后您将了解它们)我按照预期的方式在数组中只获得2个值。这意味着问题就在树枝的某个地方?

现在有了代码。这是我的索引页面的控制器。在这里,我简单地获取所有产品并通过会话获取我的购物车:

public function indexAction()
    {

            $em = $this->getDoctrine()->getManager();
            $products = $em->getRepository('MpShopBundle:Product')->findAll();  // I get the products

            $session = $this->getRequest()->getSession();

            if (!$session->get('cart')) {           
                 $session->set('cart', array()); // QUESTION#1 : I am checking if the cart is empty? If ith empty I am making it empty again?
            }

               return $this->render('MpShopBundle:Frontend:index.html.twig',  array(
               'products'=>$products       
               ));

    }

第二个控制器用于我的产品详细信息页面。这是有趣的开始:

public function viewAction($id)
    {

        // fetch the cart   
        $em = $this->getDoctrine()->getManager();
        $product = $em->getRepository('MpShopBundle:Product')->find($id);  // I am getting the product based on the id.

        $session = $this->getRequest()->getSession();

        $cart = $session->get('cart', array()); // I am getting the cart

        // check if the $id already exists in it.
        /**if ( $product == NULL ) {  // QUESTION#2: I am checking if the 

        return $this->redirect($this->generateUrl('cart'));
        }
        else { **/
        if( isset($cart[$id]) ) { // Checking if the product is already in the cart. If so, increase the product by 1

            $qtyAvailable = $product->getStock(); // I am getting the quantity of that prouct

            if( $qtyAvailable >= $cart[$id] = $cart[$id] + 1 ) {
                $cart[$id] = $cart[$id] + 1;; 
            } else {

                return $this->redirect($this->generateUrl('cart'));
            }
        } 
        /**else {
            // if it doesnt make it 1
            $cart = $session->get('cart', array()); // IF not just 
            $cart[$id] = 1;
        }
            **/

        $session->set('cart', $cart);
        return $this->render('MpShopBundle:Frontend:product_details.html.twig',  array(
               'product'=>$product
        ));
    }

最终控制器是所有选定产品的摘要:

public function summaryAction()
    {
            $session = $this->getRequest()->getSession();
            $cart = $session->get('cart', array());

            // fetch the information using query and ids in the cart
            if( $cart != '' ) {

             $em = $this->getDoctrine()->getEntityManager();
                foreach( $cart as $id => $quantity ) {  //QUESTION#3 For each product in the cart I am setting a new key and a value?
                                                        // and then im creating a new array where I store the products ids?
                          $productIds[] = $id;

                } 
            if( isset( $productIds ) ) // QUESTION#4 What am I checking here?
                {
                    $em = $this->getDoctrine()->getEntityManager();
                    $product = $em->getRepository('MpShopBundle:Product')->findById( $productIds ); // I am getting all of the products in the cart by their id?
                } else {
                    return $this->render('MpShopBundle:Frontend:product_summary.html.twig', array(
                        'empty' => true,
                    ));
                }  //QUESTION#5 What is going on with these renders?

               return $this->render('MpShopBundle:Frontend:product_summary.html.twig',     array(
            'product' => $product,
                    ));
                } else {
                    return $this->render('MpShopBundle:Frontend:product_summary.html.twig',     array(
                        'empty' => true,
                    ));
                }
            }

最后,我尝试在树枝上展示购物车:

更新

我发现问题加倍了但是我不知道如何解决它。所以问题出在我的树枝上。如果我删除循环{{ for key in cart }},它会修复加倍,所以这个循环很糟糕。但是我需要那个循环才能从购物车中删除物品...也许还有其他方法??:

{% if product is defined %}

            {% for key in cart %}  /// this loop causes the problem.

              {% for info in product %}


                <tr>

                  <td> <img width="60" src="" alt=""/></td>

                  <td>{{ info.model }}</td>
                  <td>
                    <div class="input-append"><input class="span1" style="max-width:34px" placeholder="1" id="appendedInputButtons" size="16" type="text">
                    <button class="btn" type="button"><i class="icon-minus"></i></button>
                    <button class="btn" type="button"><i class="icon-plus"></i></button>
                    <button class="btn btn-danger" type="button"><a href="{{ path('cart_remove', {'id': key}) }}"><i class="icon-remove icon-white"></i></button>
                    </div>
                  </td>

                  <td>{{ info.price }}</td>
                  <td>{{ info.discount }}</td>
                  <td>{{ info.value }}</td>


                  <td>{{ info.getFinal }}</td>


                </tr>

 {% endfor %}
 {% endfor %}
{% endif %}

购物车转储:

array:3 [▼
  12 => 3
  10 => 1
  11 => 1
]

产品转储:

array:3 [▼
  0 => Product {#668 ▼
    -id: 10
    -model: "Test1"

  }
  1 => Product {#757 ▼
    -id: 11
    -model: "Test2"

  }
  2 => Product {#858 ▼
    -id: 12
    -model: "Test3"
   }
]

1 个答案:

答案 0 :(得分:0)

我想就您的代码中的某些方面提出我的建议/意见。这可能有助于您进一步调查问题的原因(重复),并希望扩大您对Symfony 2的理解程度。

问题1: 是的,您通过调用cart将会话变量$session->set('cart', array())设置为空。 (实际上它会从会话存储中删除cart会话变量)

问题2: 是的,您正在检查实体$product是否返回任何结果。 if ( $product == NULL ) {。 (我使用===而不是==)。您也可以这样做if (!$product) {并且它有效。

不是问题:我在您的函数if( $cart != '' ) {内使用if($session->has('cart') && count($session->get('cart')) > 0 ) {更改此summaryAction()

只是来自经验的建议。如果您正在执行此$cart[$id] = $cart[$id] + 1之类的操作,请不要使用$cart表的id填充Product数组。因为当您使用Product数组中填充的值访问$cart表中的产品时,您将遇到意外情况,例如找不到产品。只是因为您在代码中将id增加1并且该值可能不存在于表中。 (希望我在这里没有遗漏任何内容。我之所以这样认为,您使用相同的$id来访问Product实体的记录以及填写cart会话变量)

问题3:这种情况与我上面的解释完全一致。在这里,您正在迭代$cart数组,假设$cart数组中的值反映了product表中可能没有的id。否则,迭代没有问题。

foreach( $cart as $id => $quantity ) {  //QUESTION#3 For each product in the cart I am setting a new key and a value?
                                                    // and then im creating a new array where I store the products ids?
                      $productIds[] = $id;
            } 

问题4:在这里,if( isset( $productIds ) )检查$productIds变量是否已设置且不为NULL。由于仅在$productIds会话变量中存储了id时才设置cart变量(这是一个数组),因此如果{(1}})不会被声明/设置$productIds会话变量为空。 (http://php.net/manual/en/function.isset.php

问题5:在这里,

cart

你要做的就是给响应返回一个树枝,这样它就可以呈现树枝文件中的内容。 return $this->render('MpShopBundle:Frontend:product_summary.html.twig', array( 'product' => $product, ));是树枝文件(product)所需的树枝变量。因此,在这种情况下,它使用它来迭代产品,正如您现在可能已经理解的那样。

我希望这至少可以在一定程度上帮助你。如果有任何其他Symfony 2开发人员可以在必要时进一步加强我的回复,我更愿意。非常感谢。干杯!!!

更新:我想我在这里发现了这个问题。在树枝中你有一个嵌套的for循环。首先,它将遍历MpShopBundle:Frontend:product_summary.html.twig会话中的所有项目,并且对于每次迭代(购物车中的项目),它会迭代cart中将导致重复的内容。所以,在执行操作之前,你可以做的就是这样一个简单的检查。

product

希望这会有所帮助。干杯!