Nieprawidłowy plik szablonu magento2.3.0


13

Niedawno zainstalowałem najnowszą wersję Magento tj. Magento 2.3.0 na lokalnej maszynie wamp z php 7.2.4

Zainstalowałem go za pomocą interfejsu wiersza poleceń.

Ale kiedy jestem zmęczony uruchomieniem, pokaż mi błąd

Exception #0 (Magento\Framework\Exception\ValidatorException): Invalid template file: 'D:/wamp64/www/mage23/vendor/magento/module-theme/view/frontend/templates/page/js/require_js.phtml' in module: '' block's name: 'require.js'

Czy to działa dla ciebie?
— Rohan Hapani

nadal nie działa całe rozszerzenie.
— MageLerner

Odpowiedzi:


37

Tak, to jest problem z Windows. Windows używa „\” jako separatora, tablica „katalogi” zawiera wpisy z „/” jako separatorem, więc sprawdzanie zawsze się nie powiedzie. Musisz to naprawić, zastępując separator w pliku podstawowym:

Magento\Framework\View\Element\Template\File\Validator

funkcja isPathInDirectories zamień poniższy kod w funkcji isPathInDirectories

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));

Jest to bardzo powszechny problem, wiele osób nie zdaje sobie sprawy z faktu, że Magento oficjalnie nie obsługuje serwerów Windows! niektóre hacki i nieoficjalne modyfikacje, takie jak ten, muszą zostać wykonane, aby działały na komputerze z systemem Windows. Jeśli przejdziesz pod poniższym linkiem „Wymagania stosu technologii Magento 2.3.x”, zobaczysz, że jedynym obsługiwanym systemem operacyjnym jest „Linux x86-64”. devdocs.magento.com/guides/v2.3/install-gde/…
— Yacoub Oweis

dla systemu Windows jaki powinien być faktyczny kod? próbuję najpierw linii „\”, ale ten pojedynczy ukośnik jest niedozwolony ...
— Flutterer

Okej, więc rozumiem, że oficjalnie nie obsługują Windowsa, ale czy nie mogą po prostu używać DIRECTORY_SEPARATORtak jak reszta świata i nie mają tego konkretnego problemu, który wydaje się jedyną rzeczą, która działa w systemie Windows?
— ACJ

10

Dla mnie rozwiązaniem było przejście do pliku \ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php i zastąpienie poniższej definicji funkcji, jak poniżej:

> protected function isPathInDirectories($path, $directories) {
>     if (!is_array($directories)) {
>         $directories = (array)$directories;
>     }
>     $realPath = $this->fileDriver->getRealPath($path);
>     $realPath = str_replace('\\', '/', $realPath); // extra code added
>     foreach ($directories as $directory) {
>         if (0 === strpos($realPath, $directory)) {
>             return true;
>         }
>     }
>     return false; }

PS: Jest to problem specyficzny dla systemu Windows.


6

Magento 2.3 nie obsługuje systemu Windows. Moje rozwiązanie znajdziesz tutaj: wpisz opis linku tutaj


2
nie ma sensu, aby nie obsługiwał systemu Windows, ale ma tak prostą „poprawkę”.
— RT

3

Jest to podstawowy problem nie tylko Magento 2.3.0, ale również ten problem pojawiłem się w Magento 2.2.7. Aby kod działał w systemie Windows zamiast ścieżki rzeczywistej, wystarczy użyć argumentu $ path przekazanego do metody

Przejdź do ścieżki /vendor/magento/framework/View/Element/Template/File/Validator.php i zamiast wiersza

if (0 === strpos($realPath, $directory)) {

posługiwać się

if (0 === strpos($path, $directory)) {

Lub śledź tę dyskusję https://github.com/magento/magento2/issues/19480


2

W Magento 2.2.9 zamień /vendor/magento/framework/View/Element/Template/File/Validator.php kod funkcji isPathInDirectories tym kodem

protected function isPathInDirectories($path, $directories)
{
    if (!is_array($directories)) {
        $directories = (array)$directories;
    }
    foreach ($directories as $directory) {
        if (0 === strpos(str_replace('\\', '/', $this->fileDriver->getRealPath($path)), $directory)) {
            return true;
        }
    }
    return false;
}

1

Prawdopodobnie dzieje się tak podczas programowania w systemie Windows.

Przejdź do wiersza 140 w pliku Ścieżka /vendor/magento/framework/View/Element/Template/File/Validator.php Zamień ten kod wiersza

$realPath = $this->fileDriver->getRealPath($path);

Z

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));

Uważaj na ten wiersz kodu

$realPath = str_replace('\', '/', $this->fileDriver->getRealPath($path));

Prawdopodobnie nie zadziała to z powodu phs backslash php. musisz zrobić podwójny odwrotny ukośnik, aby wyraźnie powiedzieć PHP, że nie ma tu do czynienia z nową linią, ale odwrotnym ukośnikiem.


1

Proszę zobaczyć, że powinien to być podwójny ukośnik, tzn. „\\”

$realPath = str_replace('\\\', '/', $this->fileDriver->getRealPath($path));

1

Jak wspomniano, problemem jest zgodność z systemem Windows. Poleciłbym jednak zmienić to nieco inaczej, aby działało nawet podczas migracji systemów, np. Do lokalnego programowania w systemie Windows, a później do wdrożenia na serwerze Linux. Tak więc tylko w przypadku pracy w systemie Windows dostosujesz ścieżkę.

W

\ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php

w

funkcja isPathInDirectories ()

zastąpić

$realPath = $this->fileDriver->getRealPath($path);

z:

a) PHP> = 7.2:

if (PHP_OS_FAMILY === 'Windows')
  $realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
else
  $realPath = $this->fileDriver->getRealPath($path);

b) PHP <7.2:

if (strtolower(substr(PHP_OS, 0, 3)) === 'win')
  $realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
else
  $realPath = $this->fileDriver->getRealPath($path);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.