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'
MageLerner
źródło
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));
Saurabh Dwivedi
źródło
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.

Tejas Vyas
źródło
6

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

Vincent
źródło
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

Naveed Abbas
źródło
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;
}
Sanaullah Ahmad
źródło
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.

Mubo
źródło
1

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

$realPath = str_replace('\\\', '/', $this->fileDriver->getRealPath($path));
zuber bandi
źródło
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);
chrześcijanin
źródło