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'
MageLerner
quelle
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));
Saurabh Dwivedi
quelle
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.

Tejas Vyas
quelle
6

Magento 2.3 unterstützt keine Windows. Meine Lösung finden Sie hier: Geben Sie hier die Linkbeschreibung ein

Vincent
quelle
1
Es macht keinen Sinn, Windows nicht zu unterstützen, hat aber eine so einfache "Lösung".
RT
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

Naveed Abbas
quelle
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;
}
Sanaullah Ahmad
quelle
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.

Mubo
quelle
1

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

$realPath = str_replace('\\\', '/', $this->fileDriver->getRealPath($path));
zuber bandi
quelle
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);
Christian
quelle