Pereiti prie turinio
← Visos PrestaShop 9 klaidos

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_path aplankas 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 www arba 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ę.

Vis tiek atnaujinate? Sužinokite, kas lūš toliau

Ši klaida kyla iš serverio ar paties atnaujinimo, ne iš modulių. Kitos dažniausiai kyla iš kodo: modulių, temos ir override failų, kurie vis dar kviečia tai, ką PrestaShop 8 ir 9 pašalino. Mūsų nemokama PrestaShop 9 parengties patikra parodo kiekvieną su failu ir eilute. Ji tik skaito, nieko nekeičia.

Gauti nemokamą patikrą

Nenorite atnaujinti patys? Parduotuves į PrestaShop 9 atnaujiname už fiksuotą kainą. Apie atnaujinimą