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.