Hola @javieradmin y @miguelpro,
Tenéis toda la razón. El die('0') es un problema de depuración grave. Además, para que un ModuleFrontController se comporte correctamente en una llamada AJAX y no renderice la plantilla Smarty (incluyendo el footer HTML que mencionas), es fundamental indicar que se está en modo AJAX. Esto se hace estableciendo $this->ajax = true;.
Aquí te muestro una modificación para tu archivo cfrompro/controllers/front/question.php que mejorará la depuración y asegurará una respuesta JSON limpia:
public function initContent()
{
$this->ajax = true; // Activar modo AJAX para evitar la plantilla Smarty
if (!Module::isEnabled('cfrompro') || Tools::getValue('action') != 'sendQuestion' || Tools::getValue('secure_key') != $this->module->secure_key) {
header('Content-Type: application/json');
die(json_encode(['status' => 'error', 'message' => 'Clave de seguridad inválida o módulo deshabilitado.']));
}
parent::initContent(); // Llamar al padre después de la validación
}
Con este cambio, si la clave de seguridad falla, recibirás un JSON con un mensaje claro en lugar de un '0'. Y al poner $this->ajax = true;, PrestaShop sabrá que debe suprimir el renderizado de la plantilla.
Para una gestión más robusta de formularios personalizados, con validaciones avanzadas y sin tener que tocar código en cada actualización, te recomiendo considerar una herramienta de creador avanzado de formularios que te permite crear y gestionar estos formularios desde el back office.