Недійсний файл шаблону magento2.3.0


13

Нещодавно я встановив останню версію magento, тобто Magento 2.3.0 в локальну машину wamp 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

Відповіді:


37

Так, це проблема з Windows. Windows використовує "\" як роздільник, масив "каталогів" містить записи з "/" як роздільник, тому перевірка завжди буде невдалою. Тож вам потрібно це виправити, замінивши роздільник в основному файлі:

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/…
Yacoub Oweis

для системи 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. Для того щоб змусити код працювати у Windows, а не використовувати 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/isissue/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.

Перейдіть до рядка 140 у файлі Шлях /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, що тут мова не йде про нову лінію, а проділ.


1

Будь ласка, дивіться це, це має бути подвійний косою рисою, тобто "\\"

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

1

Як згадувалося, проблема полягає в сумісності Windows. Але я б рекомендував змінити його дещо інакше, щоб він працював навіть під час міграції систем, наприклад, для локальної розробки в Windows та пізніше розгортання на сервері Linux. Так що лише у випадку, коли ви працюєте в Windows, ви будете коригувати шлях.

В

\ vendor \ magento \ Framework \ Перегляд \ Елемент \ Шаблон \ Файл \ 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.