我想首先说这个购物车不是由我创建的,但它以我需要的方式改变,我理解大部分代码及其工作方式,所有功能和方法都是我的。我不明白的事情我希望和你们一起学习。这将是一个漫长而深入的帖子,但我希望你能像我在向你学习一样教我。
背景
我有一个电子商务项目,我需要在其中为要存储的产品创建购物车。过程如下: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"
}
]
答案 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
希望这会有所帮助。干杯!