Неверный файл шаблона magento2.3.0

13

Я недавно установил последнюю версию magento, т.е. Magento 2.3.0, на локальный компьютер с php 7.2.4

Установил его с помощью интерфейса командной строки.

Но когда я устал, чтобы запустить его, покажи мне ошибку, как

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
источник
Это работает для вас?
Рохан Хапани
нет до сих пор не работает все расширения есть.
MageLerner

Ответы:

37

Да, это проблема с окнами. Windows использует «\» в качестве разделителя, массив «directoryies» содержит записи с «/» в качестве разделителя, поэтому проверка всегда будет неудачной. Так что вам нужно исправить это, заменив разделитель в основном файле:

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

функция isPathInDirectories заменяет приведенный ниже код в функции isPathInDirectories

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
Саураб Двиведи
источник
Это очень распространенная проблема. Многие люди не знают о том, что Magento официально не поддерживает серверы Windows! некоторые взломы и неофициальные модификации, такие как эта, необходимо выполнить, чтобы она работала на компьютере с Windows. Если вы перейдете по ссылке ниже «Требования к стеку технологий Magento 2.3.x», вы увидите, что единственная поддерживаемая ОС - это "Linux x86-64". devdocs.magento.com/guides/v2.3/install-gde/...
Якуб Овейсу
для системы Windows, какой должен быть реальный код? сначала я пробую строку '\', но этот одиночный слеш не разрешен ...
Флаттерер
Итак, я понял, что они официально не поддерживают Windows, но разве они не могут просто использовать, DIRECTORY_SEPARATORкак и весь остальной мир, и не имеют этой конкретной проблемы, которая, кажется, единственная вещь, работающая в Windows?
ACJ
10

Для меня решение сработало, перейдя в файл \ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php и заменив приведенное ниже определение функции следующим образом:

> 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: Это проблема Windows.

Теджас Вьяс
источник
3

Это основная проблема не только Magento 2.3.0, но я столкнулся с этой проблемой и в Magento 2.2.7. Чтобы заставить код работать на окнах вместо использования realpath, просто используйте аргумент $ path, переданный методу

Перейдите по пути /vendor/magento/framework/View/Element/Template/File/Validator.php и вместо строки

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

использование

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

Или следите за этим обсуждением https://github.com/magento/magento2/issues/19480

Навид Аббас
источник
2

В Magento 2.2.9 замените /vendor/magento/framework/View/Element/Template/File/Validator.php isPathInDirectories функциональным кодом на этот код

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

Это, вероятно, происходит при разработке под Windows System.

Перейти к строке 140 в файле Path /vendor/magento/framework/View/Element/Template/File/Validator.php Заменить этот код строки

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

С

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

Остерегайтесь этой строки кода

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

Это, вероятно, не будет работать из-за php обратной косой черты. вы должны сделать двойную обратную косую черту, чтобы явно указать PHP, что он имеет дело не с новой строкой, а с обратной.

Mubo
источник
1

Пожалуйста, смотрите, это должно быть двойной слеш то есть "\\"

$realPath = str_replace('\\\', '/', $this->fileDriver->getRealPath($path));
Zuber Bandi
источник
1

Как уже упоминалось, проблема заключается в совместимости Windows. Но я бы порекомендовал изменить его немного по-другому, чтобы он работал даже при миграции систем, например, для локальной разработки в Windows и последующего развертывания на сервере Linux. Так что только в том случае, если вы работаете в Windows, вы скорректируете путь.

В

\ Поставщика \ Magento \ рамки \ Вид \ Element \ Template \ File \ Validator.php

в

Функция isPathInDirectories ()

замещать

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

с:

а) PHP> = 7.2:

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

б) PHP <7.2:

if (strtolower(substr(PHP_OS, 0, 3)) === 'win')
  $realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
else
  $realPath = $this->fileDriver->getRealPath($path);
Кристиан
источник