ไฟล์เทมเพลตไม่ถูกต้อง 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'

มันทำงานให้คุณได้ไหม?
Rohan Hapani

ยังไม่มีการใช้การขยายทั้งหมดที่มี
MageLerner

คำตอบ:


37

ใช่นี่เป็นปัญหากับ windows Windows ใช้ "\" เป็นตัวคั่นอาร์เรย์ "ไดเรกทอรี" มีรายการที่มี "/" เป็นตัวคั่นดังนั้นการตรวจสอบจะล้มเหลวเสมอ ดังนั้นคุณต้องแก้ไขสิ่งนี้โดยแทนที่ตัวคั่นในไฟล์ core:

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

ฟังก์ชั่นisPathInDirectoriesแทนที่รหัสด้านล่างในฟังก์ชั่นisPathInDirectories

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

นี่เป็นปัญหาที่พบบ่อยมากหลายคนไม่ทราบว่า Magento ไม่สนับสนุนเซิร์ฟเวอร์ Windows อย่างเป็นทางการ! การแฮ็กและการแก้ไขที่ไม่เป็นทางการเช่นนี้จำเป็นต้องทำเพื่อให้มันทำงานบนเครื่อง Windows ได้หากคุณไปที่ลิงค์ด้านล่าง "Magento 2.3.x technology stack stack requirements" คุณจะเห็นว่าระบบปฏิบัติการที่รองรับเท่านั้นคือ "Linux x86-64" devdocs.magento.com/guides/v2.3/install-gde/…
Yacoub Oweis

สำหรับระบบ windows สิ่งที่ควรเป็นรหัสจริง? ฉันกำลังลองบรรทัด '\' ในตอนแรก แต่ไม่อนุญาตให้ใช้
แบ็

โอเคฉันเข้าใจแล้วว่าพวกเขาไม่สนับสนุน Windows อย่างเป็นทางการ แต่พวกเขาใช้ไม่ได้DIRECTORY_SEPARATORเหมือนส่วนที่เหลือของโลกและไม่มีปัญหาเฉพาะนี้ซึ่งดูเหมือนว่ามีเพียงสิ่งเดียวที่ทำงานบน Windows ได้ใช่ไหม
ACJ

10

สำหรับฉันวิธีแก้ปัญหาคือไปที่ไฟล์ \ seller \ 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/issues/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 ในไฟล์ Path /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 คุณจะต้องปรับเปลี่ยนเส้นทาง

ใน

\ ผู้ขาย \ วีโอไอพี \ Framework \ ดู \ ธาตุ \ Template \ ไฟล์ \ Validator.php

ใน

ฟังก์ชั่น isPathInDirectories ()

แทนที่

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

ด้วย:

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.