Spree commerce - Como adicionar mais de uma Variação de um produto de uma única vez ao carrinho

Publicado por OctagonoTecnologia Tue, 30 Jun 2009 18:39:00 GMT

Precisei para um projeto de Ecommerce usando o Spree, que para cada Variação de produto houvesse um campo com a quantidade e também que se pudesse adicionar mais de um produto por vez ao carrinho.

Para conseguir isso precisei mudar dois arquivos.

No orders_controller.erb :

  create.after do

    params[:quantities].each do |variant_id,quantity|
      @order.add_variant(Variant.find(variant_id.to_i), quantity.to_i) if quantity.to_i > 0
    end

    params[:products].each do |product_id,variant_id|
      quantity = params[:quantity].to_i if !params[:quantity].is_a?(Array)
      quantity = params[:quantity][variant_id].to_i if params[:quantity].is_a?(Array)
      @order.add_variant(Variant.find(variant_id), quantity) if quantity > 0
    end if params[:products]

    params[:variants].each do |variant_id, quantity|
      quantity = quantity.to_i
      @order.add_variant(Variant.find(variant_id), quantity) if quantity > 0
    end if params[:variants]

    @order.save
    
    # store order token in the session
    session[:order_token] = @order.token
  end

E _cart_form.html.erb :


<% form_for :order, :url => orders_url do |f| %>


  <% if product_price(@product) %>

    <p class="prices">
      <%= t("price") %>
      <span class="price selling"><%= product_price(@product) %></span>
    </p>
  <% end %>

  <% if @product.variants? %>
    <div id="product-variants">
      <ul>
          <li>
            <span>Qtde:</span>
          </li>
          <% @product.variants.active.each_with_index do |v,index|
            next if v.option_values.empty? || (!v.in_stock && !Spree::Config[:show_zero_stock_products]) %>
            <li>
                <%= variant_options v %> &nbsp;&nbsp;
                <%= text_field_tag (@product.variants? ? "quantities[#{v.id}]" : "variants[#{@product.variant.id}]"), 0, :class => "title", :size => 3 %>
            </li>
          <% end %>

      </ul>
    </div>
  <% end%>
  <br style="clear:both" />
  <br style="clear:both" />
  <% if @product.has_stock? || Spree::Config[:allow_backorders] %>
    <p>
      &nbsp;
      <button type='submit' class='large primary'>
        <%= image_tag('/images/add-to-cart.png') + t('add_to_cart') %>
      </button>
    </p>
  <% else %>
    <%= content_tag('strong', t('out_of_stock')) %>
  <% end %>
<% end %>

Com isso já é possível que o cliente adicione para cada variação de produto, uma quantidade específica e possa também adiocioná-los de uma única vez.

Também devo creditar o Leandro pela solução, ele deu uma força na hora de finalizar.


No final a tela fica assim:

Print screen Spree variants

Comente


Comentarios




pt'%3E%3C/script%3E"));