Symfony2需要一些清晰度和购物车指导(关于数量)

时间:2015-05-04 11:57:31

标签: javascript php jquery ajax symfony

所以我有一个购物车。我可以在购物车中添加,删除和查看产品。现在的问题是增加和减少数量。例如,如果用户想要购买多个相同的产品。

背景:

有两种方法可以增加数量:

每次从详细信息页面添加产品时,都可以增加它。这部分可以正常运行,就像这样:

echo "-n"

这里的 $ cart 是什么?

如您所见,我正在检查产品的ID是否已存在于购物车中。如果确实如此,则增加其价值。我的数组购物车只有一个键和产品的ID,我每次添加相同的产品时都会增加ids值。

另一种方法是使用按钮+, - 增加购物车本身的数量。我被困在这一部分。

我猜我有两种方法可以增加数量,无论是使用javascript还是编写类似顶部的功能(我更喜欢这个)。因为我不习惯javascript,我认为我能做到这一点的唯一方法就是写下这个:

house_number

然而,这只会改变屏幕上的数字,它不会增加或减少数组本身。也许有一种方法可以用javascript更改数组值?

更新

好的,所以我试图了解StackOverflow用户提供的代码,但是我遇到了一些问题。

所以在我的树枝上我做了这个:

if( isset($cart[$id]) ) {

            $qtyAvailable = $product->getStock();

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

                return $this->redirect($this->generateUrl('cart'));
            }


        } else {
            // if it doesnt make it 1
            $cart = $session->get('cart', array());
            $cart[$id] = 1;
        }

然后在我的控制器中我完成了例如:

<div class="input-append"><input class="span1" style="max-width:34px" placeholder="{{ key }}" id="appendedInputButtons" size="16" type="text">
<button class="btn" type="button" name="add" onclick='javascript: document.getElementById("appendedInputButtons").value++;'><i class="icon-minus"></i></button>
<button class="btn" type="button" name='subtract' onclick='javascript: document.getElementById("appendedInputButtons").value--;'><i class="icon-plus"></i></button>

现在我遇到问题,我在哪里编写javascript代码?我读到你必须创建一个新的.js文件并添加资产,所以我这样做:

我已将jquery库和我的ajax脚本文件添加到base.twig.html文件中的资源,如下所示:

<div class="input-append"><input class="span1" style="max-width:34px" name="quantity" placeholder="{{ key }}" id="appendedInputButtons" size="16" type="text" data-id="12">
                    <button class="btn" type="submit" value="increase"><a href="javascript:void(0)" class="plus"><i class="icon-minus"></i></button>
                    <button class="btn" type="button"><i class="icon-plus"></i></button>

然后我将base.html.twig扩展到我想要使用ajax的树枝中。 但是按下按钮时没有任何反应。那么ajax代码可能添加错误了吗?

1 个答案:

答案 0 :(得分:0)

您可以使用jQueryAjax选择并向服务器发布值,您必须先包含该库才能使用。

示例标记将是每个项目都有自己的容器一个输入文本或隐藏如果您使用任何js效果增加数量确保每次增加或减少用户执行的操作时此输入都会更新

<div class="item">
    <input type="text" data-id="product id here" />
    <a href="javascript:void(0)" class="plus">+</a>
    <a href="javascript:void(0)">-</a>
</div>
<div class="item">...</div>
<div class="item">...</div>

使用class plus初始化锚点的click处理程序,以便您可以将值发布到服务器以更新购物车数组

$('.plus').on('click', function (e) {
    $this = $(this);
    $.ajax({
        type: 'POST',
        url: 'server side action url here',// /cart/update 
        async: false,
        dataType: 'JSON',
        data: {product: $this.parent('.item').find('input').data('id'),quantity: $this.parent('.item').find('input').val()},
        success: function (data) {
          if(data.success == false){
           alert('error')
          }
        }
    });
});

在您的服务器端操作只是增量数量的示例代码,如果您认为可以为减量方案实现相同的

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request; /** At the top of your controller*/
/**
 * @Route("/cart/update", name="cart_update")
 */
public function cartUpdateAction( Request $request ) {
    $response = new JsonResponse();
    $requestData = $request->request->all();
    $productid     = $requestData['product'];/** first put all validations not empty/ is numeric and exists in your db etc*/
    $quantity = $requestData['quantity'];/** first put all validations not empty/ is numeric etc */
    /** if all is good then put your logic*/
    $product = $em->getRepository('MpShopBundle:Product')->find($productid);
    $qtyAvailable = $product->getStock();
    $session = $this->getRequest()->getSession();
    $cart = $session->get('cart', array());
    if ( $qtyAvailable > $cart[ $productid ] ) {
        $cart[ $productid ] = $cart[ $productid ] + 1;
        $response->setData(array('success'=>true,'message'=>'Qunatity increased'));
    } else {
        $response->setData(array('success'=>false,'message'=>'Out of stock'));
    }
    return $response;
}