Jump to content

Problema al agregar campos personalizados [Solucionado]


CarlosKaya

Recommended Posts

Buenas tardes a toda la comunidad. Tengo ya algún tiempo trabajando con Prestashop y unos meses desarrollando módulos para un proyecto específico.

En esta oportunidad estoy desarrollando un módulo que permite pagar unos prestamos mas o menos el funcionamiento es así:

  • Desde la adminitración de módulo se carga un archivo .txt con las cuentas a pagar
  • Esa informacion es guardada en una tabla la cual sirve para que los cliente se busquen a través de su ID (cédula) o el número de prestamo.
  • Una vez el cliente ha hecho la consulta se le retorna los datos del pago a realizar
  • Al ejecutar el POST de añadir al carrito el módulo asigna un precio al producto genérico "prestamo" (precio que viene de la tabla que se cargo con el .txt) y añade información (que tambien viene de la tabla) en unos campos personalizados.

 

Ok hasta aqui vamos bien, sin embargo, tengo un comportamiento curioso en el sistema, cuando un usuario entra a consultar su deuda, el sistema efectivamente devuelve la información, pero al hacer click en añadir al carrito, añade el producto sin los campos personalizados, pero si la persona borra el producto del carrito y los añade nuevamente (hace todo el proceso) entonces si lo hace con los campos personalizados. ¿Por qué puede ocurrir esto? es decir, la primera vez falla y la segunda, osea que en parte el código del módulo esta haciendo lo que debe ya que si agrega el producto con los campos personalizados, pero solo en el segundo intento.

Acá dejo el código del controlador del módulo que ejecuta la acción a ver si alguien me puede ayudar con lo que puede estar pasando.

La versión del Prestashop es 1.6.1.7

 

public function postProcess()

{

$id_customer = $this->context->customer->id;

$productInfo = Configuration::get("MIEXITO_PROD");

$id_currency = $this->context->currency->id;

 

if (Tools::isSubmit('enviar_pago'))

{

$nombre = trim(Tools::getValue('nombre'));

$cedula = trim(Tools::getValue('cedula'));

$prestamo = trim(Tools::getValue('prestamo'));

$amount = trim(Tools::getValue('montopagar'));

$saldo = trim(Tools::getValue('saldop'));

 

if ($id_customer)

{

if (!$amount) {

                    $this->context->controller->errors[] = Tools::displayError('El monto no puede ir nulo');

                } elseif (!Validate::isPrice($amount)) {

                    $this->context->controller->errors[] = Tools::displayError('El monto no es válido');

}

if (!count($this->errors))

{

// Personalización del precio del producto

$id_product = $productInfo;

$obj_specific = new SpecificPrice();

$isSpecificExist = SpecificPrice::getSpecificPrice($id_product, 0, $id_currency, 0, 3, 1, null, $id_customer);

 

if (!empty($isSpecificExist)) {

                        $obj_specific = new SpecificPrice($isSpecificExist['id_specific_price']);

}

$obj_specific->id_customer = $id_customer;

                    $obj_specific->id_specific_price_rule = 0;

                    $obj_specific->id_cart = 0;

                    $obj_specific->id_product = $id_product;

                    $obj_specific->id_shop = 0;

                    $obj_specific->id_shop_group = 0;

                    $obj_specific->id_currency = $id_currency;

                    $obj_specific->id_country = 0;

                    $obj_specific->id_group = 3;

                    $obj_specific->id_product_attribute = 0;

                    $obj_specific->price = $amount;

                    $obj_specific->from_quantity = 1;

                    $obj_specific->reduction = 0;

                    $obj_specific->reduction_tax = 0;

                    $obj_specific->reduction_type = 'amount';

                    $obj_specific->from = date('Y-m-d', time() - 86400);

$obj_specific->to = date('Y-m-d', time() + 86400);

if ($obj_specific->save()) {

                        $idSpecific = $obj_specific->id;

 

$this->product = new Product((int)$id_product, true, $this->context->language->id, $this->context->shop->id);

$this->product->customization_required = true;

 

$id_category = (int)$this->product->id_category_default;

             $this->category = new Category((int)$id_category, (int)$this->context->cookie->id_lang);

         $customization_fields = $this->product->customizable ? $this->product->getCustomizationFields($this->context->language->id) : false;

$campos_personales = array('Nombre del titular de la cuenta' => $nombre, 'Número de Cédula' => $cedula, 'Número de Prestamo' => $prestamo);

 

foreach ($customization_fields as $field_id)

{

if ($field_id['type'] == Product::CUSTOMIZE_TEXTFIELD)

$authorized_text_fields[(int)$field_id['id_customization_field']] = trim($field_id['name']);

$indexes = array_flip($authorized_text_fields);

foreach ($campos_personales as $field_name => $value)

{

if (in_array($field_name, $authorized_text_fields) && !empty($value))

{

if (!Validate::isMessage($value))

$this->errors[] = Tools::displayError('Invalid message');

else

$this->context->cart->addTextFieldToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_TEXTFIELD, $value);

}

else if (in_array($field_name, $authorized_text_fields) && empty($value))

$this->context->cart->deleteCustomizationToProduct((int)$this->product->id, $indexes[$field_name]);

}

}

                    Tools::redirect('index.php?controller=cart&add=1&id_product='.$id_product.'&token='.Tools::getToken(false));

                    } else {

                        Tools::redirect($this->context->link->getModuleLink('miexito', 'prestamos'));           

                    }

}

}

else

{

                Tools::redirect($this->context->link->getPageLink('my-account'));

            }

}

parent::postProcess();

}

 

Edited by CarlosKaya (see edit history)
Link to comment
Share on other sites

He conseguido una Solución a este problema. La dejo por si ha alguien se le presenta en otra oportunidad. Resulta que el problema se daba a que no existía el objeto Cart en el contexto, simplemente agregue un condicional que verifica si existe el objeto, de no existir lo crea. En esta dirección se puede encontrar mas a detalle la solución y el orden de como agregar los valores a los campos de personalización del producto. Espero le pueda ayudar a alguien en un futuro.

 

https://stackoverflow.com/questions/24610116/prestashop-add-customized-product-to-cart

 

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...