Archivo de plantilla no válido magento2.3.0

13

Recientemente instalé la última versión de magento, es decir, Magento 2.3.0 en una máquina de wamp local con php 7.2.4

Lo instalé usando la interfaz de línea de comando.

Pero cuando estoy cansado de correr me muestra un error como

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
fuente
¿Te funciona?
Rohan Hapani
no todavía no funciona toda la extensión están ahí.
MageLerner

Respuestas:

37

Sí, este es el problema con Windows. Windows usa "\" como separador, la matriz "directorios" contiene entradas con "/" como separador, por lo que la comprobación siempre fallará. Por lo tanto, debe solucionar esto reemplazando el separador en el archivo central:

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

La función isPathInDirectories reemplaza el código siguiente en la función isPathInDirectories

$realPath = str_replace('\\', '/', $this->fileDriver->getRealPath($path));
Saurabh Dwivedi
fuente
Este es un problema muy común. ¡Muchas personas no son conscientes del hecho de que Magento no admite oficialmente los servidores de Windows! algunos trucos y modificaciones no oficiales como esta deben realizarse para que funcione en una máquina con Windows. Si visita el siguiente enlace "Requisitos de la pila de tecnología Magento 2.3.x", puede ver que el único sistema operativo compatible es "Linux x86-64". devdocs.magento.com/guides/v2.3/install-gde/…
Yacoub Oweis
para el sistema de Windows, ¿cuál debería ser el código real? Estoy tratando '\' en la primera línea, pero no se permite que esta sola barra invertida ...
Flutterer
De acuerdo, entonces entiendo que oficialmente no son compatibles con Windows, pero ¿no podrían simplemente usarlo DIRECTORY_SEPARATORcomo el resto del mundo y no tener este problema específico que parece ser lo único que funciona en Windows?
ACJ
10

Para mí, la solución trabajada es ir al archivo \ vendor \ magento \ framework \ View \ Element \ Template \ File \ Validator.php y reemplazar la siguiente definición de función como se muestra a continuación:

> 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; }

PD: Este es un problema específico de Windows.

Tejas Vyas
fuente
6

Magento 2.3 no es compatible con Windows. Puede encontrar mi solución aquí: ingrese la descripción del enlace aquí

Vincent
fuente
2
no tiene sentido que no sea compatible con Windows, pero tiene una "solución" tan simple.
RT
3

Es el problema central no solo de Magento 2.3.0, sino que también enfrenté ese problema en Magento 2.2.7. Para que el código funcione en Windows en lugar de usar realpath, solo use el argumento $ path pasado al método

Vaya a la ruta /vendor/magento/framework/View/Element/Template/File/Validator.php y en lugar de la línea

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

utilizar

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

O siga esta discusión https://github.com/magento/magento2/issues/19480

Naveed Abbas
fuente
2

En Magento 2.2.9 reemplace /vendor/magento/framework/View/Element/Template/File/Validator.php el código de función isPathInDirectories con este código

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
fuente
1

Esto probablemente ocurre cuando se desarrolla bajo el sistema Windows.

Vaya a la línea 140 en la ruta del archivo /vendor/magento/framework/View/Element/Template/File/Validator.php Reemplace este código de línea

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

Con

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

Cuidado con esta línea de código

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

Esto probablemente no funcionará debido al escape de barra invertida de php. tienes que hacer una doble barra invertida para decirle explícitamente a PHP que no se trata de una nueva línea aquí sino de una barra invertida.

Mubo
fuente
1

Por favor, vea eso, debe ser una barra doble, es decir, "\\"

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

Como se mencionó, el problema es la compatibilidad de Windows. Pero recomendaría cambiarlo de manera un poco diferente para que funcione incluso cuando se migran sistemas, por ejemplo, para el desarrollo local en Windows y la posterior implementación en un servidor Linux. De modo que solo en caso de que esté operando en Windows, ajustará la ruta.

En

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

en

función isPathInDirectories ()

reemplazar

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

con:

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);
cristiano
fuente