Hola @mateoweb,
Los compañeros han acertado. Tu enfoque en postProcess para asignar una variable Smarty no funcionará en el contexto de una petición AJAX para refrescar atributos, ya que estas peticiones devuelven directamente un JSON. La gestión de un preloader en este escenario debe hacerse principalmente con JavaScript en el frontend.
La forma correcta de inyectar tu script JavaScript y CSS para el preloader, si no quieres modificar directamente los archivos del tema, es a través de un módulo custom y el hook hookActionFrontControllerSetMedia. Aquí te muestro cómo sería la implementación en tu módulo:
// En el archivo principal de tu módulo (ej. mypreloader/mypreloader.php)
public function hookActionFrontControllerSetMedia($params)
{
if ('product' == $this->context->controller->php_self) {
$this->context->controller->addJS($this->_path.'views/js/front.js');
$this->context->controller->addCSS($this->_path.'views/css/front.css');
}
}
Dentro de views/js/front.js, deberías añadir tu lógica JavaScript. Esta lógica debe:
- Seleccionar los elementos de los selectores de atributos (
.js-attribute).
- Añadir un event listener a estos selectores (por ejemplo,
change).
- Cuando se detecta un cambio, mostrar el preloader (añadiendo una clase a un elemento contenedor o mostrando un spinner ya oculto).
- Escuchar el evento
updatedProduct del bus de eventos de PrestaShop (prestashop.on('updatedProduct', function() { ... });). Este evento se dispara una vez que la página de producto ha sido actualizada con los nuevos datos de la combinación.
- Dentro de este listener, ocultar el preloader.
Es importante que el CSS para el preloader también se cargue correctamente. Aunque esto te permite un control total, requiere mantener el código. Para una solución más robusta y fácil de mantener en tiendas en producción, especialmente con futuras actualizaciones de PrestaShop, muchos optan por utilizar un módulo preparado para efecto de carga al que ya gestiona toda esta lógica y las compatibilidades entre versiones.