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

Javascript Symfony2需要一些关于购物车的清晰和指导(关于数量),javascript,php,jquery,ajax,symfony,Javascript,Php,Jquery,Ajax,Symfony,所以我有一辆购物车。我可以添加、删除和查看购物车中的产品。现在的问题是数量的增加和减少。例如,如果用户想要购买多个相同的产品 背景: 关于如何增加数量,有两种方法: 每次从详细信息页面添加产品时,都可以增加该值。这一部分很有效,我的做法如下: if( isset($cart[$id]) ) { $qtyAvailable = $product->getStock(); if ( $qtyAvailable > $cart[

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

背景:

关于如何增加数量,有两种方法:

每次从详细信息页面添加产品时,都可以增加该值。这一部分很有效,我的做法如下:

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;
        }
这里的$cart是什么

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

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

我猜这里有两种方法可以增加数量,一种是使用javascript,另一种是编写类似于上面的函数(我更喜欢这个)。因为我不习惯使用javascript,所以我认为我能做到这一点的唯一方法是编写以下内容:

<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文件并使用assetic添加它,所以我这样做:

{% block javascripts %}

            {# Le Javascript #}         
                {% javascripts 


                    'bundles/mpFrontend/assets/js/jquery-1.11.2.min.js'         
                    'Mp/ShopBundle/Resources/js/scripts.js'   
                    %}      
                    <script src="{{ asset_url }}"></script>       
                {% endjavascripts %}
我已将jquery库和ajax脚本文件添加到我的base.twig.html文件中的资产中,如下所示:

{% block javascripts %}

            {# Le Javascript #}         
                {% javascripts 


                    'bundles/mpFrontend/assets/js/jquery-1.11.2.min.js'         
                    'Mp/ShopBundle/Resources/js/scripts.js'   
                    %}      
                    <script src="{{ asset_url }}"></script>       
                {% endjavascripts %}
{%block javascripts%}
{#lejavascript}
{%javascripts
'bundles/mpFrontend/assets/js/jquery-1.11.2.min.js'
'Mp/ShopBundle/Resources/js/scripts.js'
%}      
{%endjavascripts%}
然后我在我想要使用ajax的小树枝中扩展base.html.twig。 然而,当我按下按钮时,什么也没有发生。所以ajax代码的添加可能是错误的?

您可以使用,要拾取值并将其发布到服务器,必须首先包含库才能使用

示例标记将是每个项目都有自己的容器一个输入文本或隐藏如果您使用任何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>
在您的服务器端操作中,如果您想到可以在减量场景中实现相同的操作,那么只需要一个增量数量的示例代码

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;
}

要更新整个购物车,我建议您构建一个表单并为用户提供一个提交按钮一旦用户设置了物品数量,他/她就应该在服务器端提交表单代码验证每个物品并相应地更新它们的数量,这听起来更好,但如果我有一个特定的模板,我需要以我的方式增加数量,该怎么办如我的帖子所述?如果您需要更改用户操作的数量(如加号单击),则每次用户按下+/-键时,您需要进行ajax调用,此ajax请求将在服务器端将项目id和数量发布到服务器上使用您的登录名或重用您现有的编码您可以用代码将我推向正确的方向吗?我以前从未使用过ajax。您需要先包含jquery库,然后是包含ajax代码的js文件。请参见演示中的js示例演示。它成功地选择了产品id及其数量,这是一个第三方站点,因此我无法提供ajax演示
$('.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;
}