Tệp mẫu không hợp lệ magento2.3.0


12

Gần đây tôi đã cài đặt magento phiên bản mới nhất, ví dụ Magento 2.3.0 trong máy làm sạch cục bộ với php 7.2.4

Cài đặt nó bằng giao diện dòng lệnh.

Nhưng khi tôi mệt mỏi để chạy nó cho tôi thấy lỗi như

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'

Nó có làm việc cho bạn không?
Rohan Hapani

không vẫn không làm việc tất cả mở rộng đang ở đó.
MageLerner

Câu trả lời:


35

Vâng, đây là vấn đề với windows. Windows sử dụng "\" làm dấu phân cách, mảng "thư mục" chứa các mục có "/" làm dấu phân cách, do đó kiểm tra sẽ luôn thất bại. Vì vậy, bạn cần khắc phục điều này bằng cách thay thế dấu phân cách trong tệp lõi:

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

Hàm isPathInDirectories thay thế mã bên dưới trong hàm isPathInDirectories

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

Đây là một vấn đề rất phổ biến, Nhiều người không biết thực tế là Magento không chính thức hỗ trợ máy chủ Windows! Một số hack và sửa đổi không chính thức như cái này cần phải được thực hiện để làm cho nó hoạt động trên máy Windows, Nếu bạn truy cập vào liên kết bên dưới "Yêu cầu ngăn xếp công nghệ Magento 2.3.x", bạn có thể thấy rằng hệ điều hành được hỗ trợ duy nhất là "Linux x86-64". devdocs.magento.com/guides/v2.3/install-gde/ từ
Yacoub Oweis

Đối với hệ thống windows, mã thực tế phải là gì? Tôi đang thử dòng '\' trong lần đầu tiên nhưng dấu gạch chéo ngược này không được phép ...
Flutterer

9

Đối với tôi, giải pháp hoạt động là bằng cách đi tới tệp \ eller \ magento \ framework \ View \ Element \ Template \ File \ Validator.php và thay thế định nghĩa hàm dưới đây như sau:

> 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: Đây là vấn đề cụ thể của windows.


6

Magento 2.3 không hỗ trợ windows. Bạn có thể tìm thấy giải pháp của tôi ở đây: nhập mô tả liên kết ở đây


1
không có nghĩa là nó không hỗ trợ các cửa sổ nhưng có một "sửa chữa" đơn giản như vậy.
RT

3

Đây là vấn đề cốt lõi của không chỉ Magento 2.3.0, mà tôi còn gặp phải vấn đề đó trong Magento 2.2.7. Để làm cho mã hoạt động trên windows thay vì sử dụng realpath, chỉ cần sử dụng đối số $ path được truyền cho phương thức

Đi tới đường dẫn /vendor/magento/framework/View/Euity/Template/File/Validator.php và thay vì dòng

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

sử dụng

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

Hoặc theo dõi cuộc thảo luận này https://github.com/magento/magento2/issues/19480


2

Trong Magento 2.2.9, thay thế /vendor/magento/framework/View/Euity/Template/File/Validator.php mã chức năng isPathInDirectories bằng mã này

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

Điều này có thể xảy ra khi phát triển trong Windows System.

Chuyển đến dòng 140 trong tệp Đường dẫn /vendor/magento/framework/View/Euity/Template/File/Validator.php Thay thế mã dòng này

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

Với

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

Coi chừng dòng mã này

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

Điều này có thể sẽ không hoạt động vì scape dấu gạch chéo ngược. bạn phải thực hiện dấu gạch chéo kép để nói rõ với PHP rằng nó không xử lý dòng mới ở đây mà là dấu gạch chéo ngược.


1

Xin vui lòng xem rằng, nó phải là dấu gạch chéo kép, tức là "\\"

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

1

Như đã đề cập vấn đề là khả năng tương thích của Windows. Nhưng tôi khuyên bạn nên thay đổi nó một chút khác nhau để hoạt động ngay cả khi di chuyển các hệ thống, ví dụ như để phát triển cục bộ trên Windows và sau đó triển khai trên máy chủ Linux. Vì vậy, chỉ trong trường hợp bạn đang hoạt động trên Windows, bạn sẽ điều chỉnh đường dẫn.

Trong

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

trong

hàm isPathInDirectories ()

thay thế

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

với:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.