Ungültige Vorlagendatei magento2.3.0


12

Ich habe vor kurzem Magento neueste Version, dh Magento 2.3.0 in lokalen Wamp-Maschine mit installiert php 7.2.4

Installierte es über die Kommandozeilenschnittstelle.

Aber wenn ich müde bin zu rennen, zeige ich Fehler wie

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'

Funktioniert es für dich?
Rohan Hapani

Nein, es funktioniert immer noch nicht. Alle Erweiterungen sind da.
MageLerner

Antworten:


35

Ja, das ist das Problem mit Windows. Windows verwendet "\" als Trennzeichen. Das Array "Verzeichnisse" enthält Einträge mit "/" als Trennzeichen, sodass die Prüfung immer fehlschlägt. Sie müssen dies also beheben, indem Sie das Trennzeichen in der Kerndatei ersetzen:

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

Die Funktion isPathInDirectories ersetzt den folgenden Code in der Funktion isPathInDirectories

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

Dies ist ein sehr häufiges Problem. Vielen Menschen ist nicht bewusst, dass Magento Windows-Server nicht offiziell unterstützt! Einige Hacks und inoffizielle Änderungen wie diese müssen durchgeführt werden, damit es auf einem Windows-Computer funktioniert. Wenn Sie den folgenden Link "Magento 2.3.x-Technologie-Stack-Anforderungen" besuchen, können Sie sehen, dass das einzige unterstützte Betriebssystem ist "Linux x86-64". devdocs.magento.com/guides/v2.3/install-gde/…
Yacoub Oweis

Für Windows-System, was sollte der eigentliche Code sein? Ich versuche zuerst '\' Zeile in, aber dieser einzelne Back-Slash ist nicht erlaubt ...
Flutterer

9

Für mich besteht die Lösung darin, in die Datei \ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php zu wechseln und die folgende Funktionsdefinition wie folgt zu ersetzen:

> 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: Dies ist ein Windows-spezifisches Problem.



2

Es ist das Kernproblem von nicht nur Magento 2.3.0, sondern ich habe dieses Problem auch in Magento 2.2.7 gesehen. Verwenden Sie einfach das an die Methode übergebene Argument $ path, damit der Code unter Windows funktioniert, anstatt realpath zu verwenden

Gehen Sie zu Pfad /vendor/magento/framework/View/Element/Template/File/Validator.php und anstelle der Zeile

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

verwenden

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

Oder folgen Sie dieser Diskussion https://github.com/magento/magento2/issues/19480


2

In Magento 2.2.9 ersetzen Sie den Funktionscode /vendor/magento/framework/View/Element/Template/File/Validator.php isPathInDirectories durch diesen Code

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

Dies geschieht wahrscheinlich bei der Entwicklung unter Windows-System.

Gehen Sie zu Zeile 140 in der Datei Path /vendor/magento/framework/View/Element/Template/File/Validator.php. Ersetzen Sie diesen Zeilencode

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

Mit

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

Achten Sie auf diese Codezeile

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

Dies wird wahrscheinlich wegen der PHP-Backslash-Landschaft nicht funktionieren. Sie müssen einen doppelten Backslash ausführen, um PHP explizit mitzuteilen, dass es sich hier nicht um eine neue Zeile handelt, sondern um einen Backslash.


1

Bitte beachten Sie, dass es ein doppelter Schrägstrich sein sollte, dh "\\"

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

1

Wie bereits erwähnt, ist das Problem die Windows-Kompatibilität. Ich würde jedoch empfehlen, es etwas anders zu ändern, damit es auch bei der Migration von Systemen funktioniert, z. B. für die lokale Entwicklung unter Windows und die spätere Bereitstellung auf einem Linux-Server. Damit Sie den Pfad nur anpassen, wenn Sie unter Windows arbeiten.

Im

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

im

Funktion isPathInDirectories ()

ersetzen

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

mit:

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.