Añadir varios items al carrito codeigniter

Iniciado por marko1985, 16 Junio 2014, 20:01 PM

0 Miembros y 1 Visitante están viendo este tema.

marko1985

A ver os explico:

Tengo un jquery que coge los datos de un formulario en el que aparecen las variedades de sabor de un producto.
Imaginaos
Fanta -> añadir al carrito. Al darle al boton se abre un dialog con el formulario para que agregues la cantidad de cada variedad. el código es este.

 
Código (javascript) [Seleccionar]
('.get_flavors_cart').click(function(){
   product = $(this).attr('rel');
   $('.dialog').dialog("open");
  $.get('http://distribucion.nutrifrog.com/products/box_flavors_helper/'+product, function(data){
       $('.dialog').html(data);
       $('.add_items').click(function(){
                   //alert('Pulsaste en añadir carrito');
                   var flavorValues = new Array();
                   $('input[type="number"]').each(function(){
                      index = $(this).attr("rel");
                      value = $(this).val();
                      flavorValues[index] = value;
                   });
                   data_flavors = JSON.stringify(flavorValues);
                   $.post('http://distribucion.nutrifrog.com/products/add_cart_item',{id:product, cart_items:data_flavors}, function(data){
                      $('.dialog').html(data);
                   });
               });
   
   
});


En PHP trabajo con el framework Codeigniter  y recogo los datos JSON y hago un foreach para agregar al carrito cada item.

Código (php) [Seleccionar]
public function add_cart_item(){    
   $id = $this->input->post('id');                
$values = json_decode($this->input->post('cart_items'));
       $msg = '';
       $valores = count($values);
       $format= $this->products_model->format_name($this->products_model->get_product_property($id, 'id_format'));
       $price = $this->products_model->get_product_property($id, 'pvd');
       $weight                 = $this->products_model->get_product_property($id, 'weight');
       $img                    = $this->products_model->get_product_property($id, 'img_path');
       $name                   = $this->products_model->get_product_property($id, 'name');
       $quantity               = $this->products_model->get_product_property($id, 'quantity');
       foreach($values as $flavor => $cantidad){
               if(!is_null($cantidad)){                
                   $cart_data = array(
                      'id'         => strtoupper(random_string('alnum', 8)),
                      'qty'        => $cantidad,
                      'price'      => $price,
                      'name'       => $name,
                      'product_id' => $id,
                      'img'        => $img,
                      'format'     => $format,                  
                      'weight'     => $weight,
                      'quantity'   => $quantity,
                      'flavor'     => $flavor
                   );  
                   if($this->cart->insert($cart_data)){
                       $msg .="Insertadas $quantity_fl unidades de sabor $flavor<br />";
                       
                   }  
                   else {
                       echo "Error: no se ha insertado el sabor $flavor";
                   }                                  
               }    
       }
           
   }


Si el producto solo tiene una variedad no hay problema pero cuándo hay varios sabores, no carga en el carrito nada. Ya le he dado 10000 vueltas, pero no hay manera.

¿Alguna idea?

Gracias de antemano.

EFEX

Utiliza la consola segun el navegador que uses y fijate los valores que envia..

Una cosa que veo es que estas definiendo ese array(flavorValues) y tratas de definir un index en js no se puede, definilo como objeto.

Código (javascript) [Seleccionar]
var flavorValues = new Object();
//O mas simple
var flavorValues = {};
GITHUB 

JorgeEMX

Imprime éste valor en tu php, en los dos escenarios (con una variedad y con 10,000):


Código (php) [Seleccionar]
var_dump($this->input->post())

Quizá entonces te podremos ayudar en algo.