PrestaShop 1.6 – problem z zapisem tłumaczeń

Wielokrotnie przy pracy z PrestaShop napotykałem dziwny problem powodujący że zapisanie w panelu dowolnych tłumaczeń zapisywało je do plików jednak po odświeżeniu wciąż w edytorze widoczna widniała stara fraza.

Przez ten problem nie można było korzystać w "Zapisz i zostań" co sprawiało że tłumaczenie było kłopotliwe i zajmowało dużo czasu. Nie udało mi się znaleźć rozwiązania w sieci więc musiałem sam się tym zająć 🙂

Problem zdawał się występować losowo na różnych wersjach PS i serwerach co sprawiało że debugowanie było trudne.

Cała magia dzieje się w pliku /controllers/admin/AdminTranslationsController.php w metodzie findAndWriteTranslationsIntoFile(). Szybki debug i postawienie delay(3); na początku metody całkowicie rozwiązuje problem...

Problem kojarzy się z cache, ale co cachuje pliki *.php? (tłumaczenia są zapisywane w plikach php jako tablica fraz i includowane przy ładowaniu).

Problemem okazał się opcache, jak czytamy w doc:

OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

This extension is bundled with PHP 5.5.0 and later, and is » available in PECL for PHP versions 5.2, 5.3 and 5.4.

Opcache cachuje opcode pliku z tłumaczeniem i kiedy zmienimy plik i zaincludujemy jego zawartość dostaniemy stary plik z cache zamiast zaktualizowanej wersji.

Rozwiązanie:

Możemy wyłączyć opcache ale lepiej wyczyścić cache przy zapisie tłumaczeń, wystarczy dodać override aby pozbyć się problemu:

<?php
class AdminTranslationsController extends AdminTranslationsControllerCore
{
    public function postProcess()
    {
        if (function_exists('opcache_reset')) {
            opcache_reset();
        }
        return parent::postProcess();
    }

Wystarczy utworzyć plik w katalogu /override/controllers/admin/AdminTranslationsController.php i usunąć cache klas PS /cache/class_index.php.

Linki:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *