PrestaShop 9 klaidos
The CSRF token is invalid. Please try to resubmit the form: prekės neišsaugomos PrestaShop administravime
Saugant prekę ar kitą didelę administravimo formą, rodomas šis pranešimas. Po perkėlimo į naują hostingą ar PHP keitimo dažniausia priežastis – max_input_vars. PHP nukerpa formą, o žetonas yra paskutinis jos laukas.
- Klaida
The CSRF token is invalid. Please try to resubmit the form.- Pasirodo
- Saugant prekes ir kitas dideles administravimo formas (1.7 – 9.x)
- Dažniausiai randama
- PHP nustatymai (max_input_vars, sesijos)
Kas nutiko
Kiekviena su Symfony sukurta administravimo forma siunčia paslėptą _token lauką. Serveris jį palygina su žetonu, laikomu PHP sesijoje. Jei laukas neatkeliauja arba sesija prarasta, išsaugojimas sustoja su šiuo pranešimu ir niekas neįrašoma.
Dažniausiai matome tą pačią priežastį – max_input_vars. PHP priima ne daugiau tiek laukų vienoje užklausoje (pagal nutylėjimą 1000), o likusius tyliai išmeta, palikdamas tik įspėjimą žurnale. PrestaShop 9.2 prekės formoje product[_token] yra paskutinis laukas. Todėl kai formoje laukų daugiau nei leidžia riba, žetonas dingsta pirmas.
Išbandėme bandomojoje 9.2 parduotuvėje. Su max_input_vars = 50 prekės išsaugojimas grąžino lygiai šį pranešimą. Grąžinus ribą, tas pats išsaugojimas pavyko (Successful update).
Dažniausiai tai prasideda po perkėlimo į naują hostingą ar PHP versijos keitimo: naujame serveryje lieka numatytoji 1000, o senajame buvo didesnė. Forma auga su kiekviena kalba, savybe ir personalizavimo lauku, taip pat su moduliais, kurie į prekės puslapį prideda savo laukų.
Sprendimas
Padidinkite ribą, pavyzdžiui, iki 10000:
max_input_vars = 10000
Įrašykite ten, kur jūsų PHP ją skaito: php.ini, hostingo valdymo skydelio PHP nustatymuose, .user.ini su PHP-FPM arba php_value max_input_vars 10000 faile .htaccess su Apache mod_php. Tada phpinfo patikrinkite, ar nauja reikšmė galioja.
Kad pamatytumėte, ar forma arti ribos, atidarykite prekės puslapį, naršyklės konsolę (F12) ir paleiskite:
[...new FormData(document.querySelector('form[name=product]')).keys()].length
Jei skaičius arti max_input_vars ar didesnis, priežastį radote.
Kitos to paties pranešimo priežastys
- Sesija neįrašoma. PrestaShop 9 naudoja įprastas PHP sesijas, todėl
session.save_pathaplankas turi egzistuoti, būti įrašomas ir neperpildytas. Jei taip nėra, kiekviena žetono patikra nepavyksta. - Administravimas atidaromas skirtingais adresais. Sesijos slapukas priklauso vienam adresui. Visada naudokite tą patį – su
wwwarba be jo ir visada per https. - JavaScript klaida sustabdo formos skriptus. Taip nutinka, pavyzdžiui, kai PrestaShop veikia su nepalaikoma PHP versija, kaip 1.7.6 su PHP 7.4. Pažiūrėkite raudonas klaidas naršyklės konsolėje ir PrestaShop ir PHP versijų lentelę.