Hola @mariaweb y @natalia8994,
@natalia8994 ha dado en el clavo con el análisis. El enfoque en el CartController para generar cupones y la lógica de compartir es bastante problemático por varias razones:
- Gestión de
id_customer: Como se mencionó, un invitado no tiene id_customer. Intentar asignar un cupón a un id_customer vacío o inexistente puede generar errores o comportamientos inesperados.
- Seguridad y consistencia: Crear
CartRules directamente sin una validación adecuada o un flujo de negocio definido puede llevar a la creación de cupones inválidos o abusivos.
- Integración con Facebook: La URL de sharer que estás construyendo es solo para compartir, pero no integra la lógica para que PrestaShop entienda que el cupón debe aplicarse a la llegada. Necesitarías un manejo más sofisticado en el lado del receptor para activar ese cupón.
- Mantenimiento: Los overrides en los controladores son frágiles. Cada actualización de PrestaShop puede anular tus cambios o introducirlos en conflicto.
Para una implementación robusta, necesitarías un módulo que se encargue de:
- Engancharse a un hook adecuado (como
displayShoppingCartFooter o displayProductButtons) para mostrar el botón de compartir.
- Gestionar la creación y el estado de los
CartRules de forma segura, posiblemente vinculándolos a una sesión temporal o un usuario específico cuando se comparta.
- Manejar la lógica de aplicación del cupón cuando el enlace compartido es visitado.
Un módulo bien diseñado puede manejar esto sin tocar el core. Aquí te muestro un ejemplo de cómo un módulo podría engancharse a un pie de carrito para preparar la lógica, dejando la complejidad del cupón a su propia clase:
// Ejemplo simplificado de un hook en un módulo para PrestaShop 1.7.7.3
public function hookDisplayShoppingCartFooter($params)
{
// Solo si el carrito existe y hay productos
if (isset($params['cart']) && $params['cart']->nbProducts()) {
$this->context->smarty->assign([
'cart_id' => $params['cart']->id,
'customer_id' => (int)$this->context->customer->id,
'share_text' => $this->l('¡Mira mi carrito y consigue un descuento!'),
// La URL de Facebook y la generación real del cupón se harían en el módulo
Esta es la forma arquitectónicamente correcta. Dentro de facebook_share_button.tpl tendrías el botón y un script JS que, al hacer clic, llamaría a una acción en tu módulo para generar el cupón y la URL de Facebook. Para evitarte todo este desarrollo y asegurar la compatibilidad con tu PrestaShop 1.7.7.3 (y futuras versiones), existe una solución dedicada que ya incorpora esta lógica. Te recomendaría usar un módulo para compartir carrito de facebook que lo hace de manera nativa y robusta.