Bonjour @julien_69,
@marieweb a tout à fait raison. La manipulation directe des en-têtes avec header() dans un contrôleur frontal PrestaShop 8.1.6 est une mauvaise pratique. Le framework Symfony et PrestaShop lui-même fournissent des méthodes dédiées pour cela, notamment ajaxRender().
En utilisant ajaxRender(), PrestaShop s'assure que les en-têtes appropriés sont envoyés (y compris Content-Type: application/json), gère les éventuels problèmes de cache et permet d'intégrer des mécanismes de sécurité si nécessaire. Voici comment vous pourriez adapter votre snippet en remplaçant les appels header() par ajaxRender():
public function initContent()
{
parent::initContent();
$token = (string) Tools::getValue('token');
$expected = (string) Configuration::get(PscConfig::CRON_TOKEN);
if ($expected === '' || !hash_equals($expected, $token)) {
$this->ajaxRender(json_encode(['error' => 'Invalid token']));
return;
}
$this->ajaxRender(json_encode(['success' => true, 'message' => 'Token valide']));
Notez que j'ai complété la ligne $expected = (string) Configuration::get(PscConfig::CRON_TOKEN); pour que l'exemple soit fonctionnel, en supposant que c'est ce que vous vouliez faire. L'important est d'appeler $this->ajaxRender() avec votre JSON encodé, puis de faire un return ou exit pour arrêter l'exécution.
Pour une gestion optimisée du cache et des performances de votre boutique, et pour éviter ces modifications de code qui peuvent être écrasées lors des mises à jour de modules, il existe des solutions dédiées comme le module Presta Cache pages qui gère ce genre de choses de manière plus robuste et maintenable.