martes, 30 de julio de 2013

Pedido del carro de compras con CodeIgniter

Seguimos con el Tema 5 de la creación de un carrito de compras con CodeIgniter, con el tema de hoy daremos por finalizado lo relacionado con las funciones que presentamos a los clientes para que puedan ver los productos, añadirlos al carro de compras, llenar sus datos en un formulario y posteriormente enviar su pedido; el pedido que hace la persona debe llegar a su correo y al del administrador del sitio.
Ver como enviar un email con codeIgniter

Empecemos por cargar las librerías que necesitaremos para enviar el correo y validar los formularios, además nos ayudaremos con la librería Table; verificamos que todas las librerias y helpers que necesitamos esten cargadas en en el método constructor del controlador products.php

function __construct() {
 parent::__Construct(); $this ->load->model('Products_Model');
 $this->load->library(array('pagination', 'cart', 'form_validation','email', 'table'));
 $this->load->helper('text');
 }

ahora añadimos el último método que va a tener el controlador products.php Método checkout
unction checkout(){
       
      $data['title'] = 'Solicitar Pedido';
     
       $this->form_validation->set_rules('name', 'Nombre', 'required');
       $this->form_validation->set_rules('phone', 'Celular', 'required|numeric');
       $this->form_validation->set_rules('address', 'Ciudad y dirección', 'required');
       $this->form_validation->set_rules('email', 'Email', 'required|valid_email');  
     
       $this->form_validation->set_message('required', 'el campo %s es requerido');
       $this->form_validation->set_message('valid_email', 'El email no es válido');
        
           $this -> form_validation -> set_error_delimiters('<ul><li>', '</li></ul>');
      
      
    if ($this->form_validation->run() == FALSE)
        {
            $this->load->view('front/header', $data); 
            $this->load->view('front/checkout');
            $this->load->view('front/footer');
          
            }else{
                      
            $name = $this->input->post('name');
            $mobil = $this->input->post('phone');
            $email = $this->input->post('email');
                      
if($cart=$this->cart->contents()){
$this->table->set_heading('Portatil', 'Detalle','Cantidad','Precio', 'Total'); // la tabla que irá en el correo


    foreach($cart as $item){
        $selected = '';      
     if ($this->cart->has_options($item['rowid'])) {
            foreach ($this->cart->product_options($item['rowid']) as $option => $value) {
                                $selected = $option . ": <em>" . $value . "</em>";
                          }
                      }
             
              $price = ($item['price']*$item['qty']);
               $this->table->add_row($item['name'], $selected, $item['qty'], $price);
                                  
             } // fin del foreach
        
 $this->table->add_row('Total', '', '', '', $this->cart->format_number($this->cart->total()));
            
    $message = 'Señor(a): '.$name.br(1).'Celular: '.$mobil.br(1).'Email: '.$email.br(2).'Detalles del pedido';                                    
    $pedido = $message.$this->table->generate();  // concatenamos el mensaje con la tabla que contiene el pedido
          
    $config = array('protocol'=>'smtp',
                    'smtp_host'=>'ssl://smtp.googlemail.com',
                    'smtp_user'=>'mi-correo@gmail.com', // colocamos nuestra propia cuenta de Gmail
                    'smtp_pass'=>'mi-password', // contraseña de la cuenta Gmail                  
                    'smtp_port'=>'465',
                    'smtp_timeout'=>'6',
                    'mailtype'=>'html',                  
                    );
                  
   $this->email->initialize($config);
  
            // Datos para enviar el correo
            $this->email->from('admin-tienda@gmail.com', 'Tienda virtual');
            $this->email->to($email);
            $this->email->subject('Pedido de Computador(es) Portatil(es)');              
            $this->email->message($pedido);
            $this->email->send(); // envia el correo
          
            $data['title']='Detalles del Pedido';
            $data['pedido']=$pedido;
                   //  echo $this->email->print_debugger(); exit;                          
             $this->load->view('front/header', $data);
             $this->load->view('front/success');
             $this->load->view('front/footer');
            
            }
        } // fin del else
    } // fin del método
enseguida necesitamos crear 2 vistas, una la vamos a llamar checkout.php, la guardamos en cart/application/views/; aquí es donde crearemos el formulario para que el cliente pueda enviar sus datos con el pedido. Código de checkout.php
<?php if($this->cart->contents()){ // el formulario se puede ver solo si existe el carrito?>
<?=heading($title, 2).'Por favor llene el formulario que muy pronto le contactaremos para enviar su pedido.';?>
<?php if(validation_errors()): ?>
  
    <div id="error"><?=validation_errors();?></div>
  
<?php endif ?>

<?php $attributes = array('id' => 'form_checkout'); ?>
<div id="checkout">
<?=form_open('products/checkout', $attributes);

       $name = array('name'=>'name', 'id'=>'name','placeholder'=>'Nombre y apellidos','value'=>set_value('name'), 'size'=> '35',);
       $phone = array('name'=>'phone', 'id'=>'phone','placeholder'=>'Teléfono o celular','value'=>set_value('phone'), 'size'=> '35',);
       $address = array('name'=>'address','id'=>'address','placeholder'=>'Ciudad y dirección','value'=>set_value('address'), 'size'=> '48',);
       $email = array('name'=>'email', 'id'=>'email','placeholder'=>'Correo electronico', 'value'=>set_value('email'), 'size'=> '48',);
 ?>
      <div><?=form_label('Nombre');?></div>               
      <div><?=form_input($name);?></div>
      <div><?=form_label('Celular');?></div>
      <div><?=form_input($phone);?></div>
      <div><?=form_label('Ciudad y direccción');?></div>
      <div><?=form_input($address);?></div>
      <div><?=form_label('Email');?></div>  
      <div><?=form_input($email);?></div>
    
<div id='button'>
    <?=form_submit('submit', 'Enviar');?>
</div>
<?=form_close();?>

</div> 
<?php }

else{
      redirect('products');
}
?>       
La otra vista la llamamos success.php, también la gurdamos en cart/application/views/; en esta vista es donde se informa que se ha enviado el pedido satisfactoriamente. Código de la vista success.php

<?=heading($title, 3).'Hemos enviado el pedido a su email; gracias por la solicitud, pronto le contactaremos.'.br(2);
  echo $pedido
 ?>
Por últimos vamos a cart/assets/template/ añadimos unos estilos a style.css

/****************************/

#checkout{
    width:500px;
    margin: 3em auto;
}
#form_checkout{   
    border: 1px solid #E5E5E5;
    box-shadow: 0 2px 3px #C8C8C8;
    border-radius: 11px;
    margin-top: 20px;
    padding: 16px;
    width: 420px;
   
}
#form_checkout input, label {
      padding: 3px;
   
}
#button{
    margin-top: 3px;
}
#error{
    border: 1px solid #bf0100;
    background-color: #FFEBE8;
    margin: 5px 30px 10px 30px;

}
#error p{
    color: #bf0100;
    margin-left:30px;   
}

Descargar archivos