Magento 2.2.0 องค์ประกอบเอกสารไม่ถูกต้อง 'ทรัพยากร': แอตทริบิวต์ 'ชื่อ' เป็นสิ่งจำเป็น แต่ขาดหายไป


12

ฉันพยายามอัพเกรดเว็บไซต์จากMagento 2.1.8 เป็น 2.2.0

ฉันได้กำหนดค่าผู้แต่งสำหรับ 2.2.0และอัปเดตด้วยบรรทัดคำสั่ง

ตอนนี้เมื่อฉันเรียกใช้magento setup:upgradeมันหยุดในการเรียกใช้สคีมาและแสดงบันทึกต่อไปนี้: pfa สำหรับข้อมูลเพิ่มเติม

กำลังเรียกใช้สกีมาซ้ำ ๆ ... 'ทรัพยากร' องค์ประกอบเอกสารไม่ถูกต้อง: ต้องมีแอตทริบิวต์ 'ชื่อ' แต่ขาดหายไป บรรทัด: 12

องค์ประกอบ 'ทรัพยากร': แอตทริบิวต์ 'ชื่อ' เป็นสิ่งจำเป็น แต่ขาดหายไป บรรทัด: 13

ป้อนคำอธิบายรูปภาพที่นี่


ตรวจสอบลิงค์, rakeshjesadiya.com/…
Rakesh Jesadiya

คำตอบ:


22

การเดาที่ดีที่สุดของฉันคือคุณมี<resource>-tag ในetc/acl.xmlไฟล์ใด ๆ ที่มีtitle-attribute หายไป ปกติแล้วสิ่งนี้จะทำให้เกิดปัญหาที่คุณไม่สามารถสร้างหรือแก้ไขบทบาทใหม่ได้ ฉันคาดเดาว่าพวกเขาสร้างการตรวจสอบพิเศษใน 2.2 เพื่อตรวจสอบสิ่งนี้ได้เร็วขึ้น

ตรวจสอบ - acl.xmlไฟล์ของส่วนขยายที่กำหนดเองของคุณเองและ / หรือส่วนขยายของบุคคลที่สาม โปรดทราบ: title-attribute จำเป็นสำหรับ<resource>-node ใหม่เท่านั้น ดังนั้นหากคุณเพิ่ม resource-node ใหม่ไปยังโหนดทรัพยากรที่มีอยู่ (จัดทำโดยโมดูลอื่น) คุณไม่จำเป็นต้องเพิ่มtitle-attribute ไปยังสิ่งเหล่านั้น ตัวอย่างเช่น:

<!-- provided by Magento_Backend, so they already have a title: -->
<resource id="Magento_Backend::stores">
    <resource id="Magento_Backend::stores_settings">
        <!-- provided by Magento_Config: -->
        <resource id="Magento_Config::config">
            <!-- New resource! Title is required: -->
            <resource id="Vendor_Module::config_general" title="Something" translate="title"/> 
        </resource>
    </resource>
</resource>

4
บางครั้งสิ่งนี้อาจเกิดขึ้นได้เมื่อคุณใช้โมดูลที่ขึ้นอยู่กับโมดูลหลักชนิดอื่นเช่นแกนเมกะลลาซาและโมดูลหลักไม่ได้ติดตั้ง
open-ecommerce.org

1
ฉันยังมีปัญหาเดียวกัน แต่โชคไม่ดีที่ฉันไม่สามารถค้นหาไฟล์ etc / acl.xml ที่มีแอตทริบิวต์ชื่อหายไปฉันได้ตรวจสอบส่วนขยายที่กำหนดเองทั้งหมดแล้ว มีวิธีที่ฉันสามารถมองเห็นไฟล์ได้อย่างง่ายดาย
Hari Swaminathan

มีความคิดเห็นเกี่ยวกับวิธีการส่งออกชื่อไฟล์ของ XML ที่เสียหายหรือไม่
David Lambauer

การติดตั้งแกน Mageplaza แก้ไขปัญหานี้ให้ฉัน: github.com/mageplaza/module-core
seanbreeden

29

หากต้องการค้นหาไฟล์ที่มีแอตทริบิวต์หายไปคุณสามารถแก้ไขไฟล์ต่อไปนี้

vendor/magento/framework/Config/Reader/Filesystem.php

เพิ่มรหัสต่อไปนี้

foreach($configMerger->getDom()->getElementsByTagName('resource') as $element ){
    if (!$element->hasAttribute('title')) {
        var_dump($configMerger->getDom()->saveXML($element));
    }
}

กับวิธีการ

protected function _readFiles($fileList)

ดังนั้นควรมีลักษณะดังนี้

protected function _readFiles($fileList)
{
    /** @var \Magento\Framework\Config\Dom $configMerger */
    $configMerger = null;
    foreach ($fileList as $key => $content) {
        try {
            if (!$configMerger) {
                $configMerger = $this->_createConfigMerger($this->_domDocumentClass, $content);
            } else {
                $configMerger->merge($content);
            }
        } catch (\Magento\Framework\Config\Dom\ValidationException $e) {
            throw new \Magento\Framework\Exception\LocalizedException(
                new \Magento\Framework\Phrase("Invalid XML in file %1:\n%2", [$key, $e->getMessage()])
            );
        }
    }
    if ($this->validationState->isValidationRequired()) {
        $errors = [];
        if ($configMerger && !$configMerger->validate($this->_schemaFile, $errors)) {
            foreach($configMerger->getDom()->getElementsByTagName('resource') as $element ){
                if (!$element->hasAttribute('title')) {
                    var_dump($configMerger->getDom()->saveXML($element));
                }
            }
            $message = "Invalid Document \n";
            throw new \Magento\Framework\Exception\LocalizedException(
                new \Magento\Framework\Phrase($message . implode("\n", $errors))
            );
        }
    }

    $output = [];
    if ($configMerger) {
        $output = $this->_converter->convert($configMerger->getDom());
    }
    return $output;
}

ตอนนี้คุณจะสามารถดูดัมพ์ขององค์ประกอบ XML ที่ไม่ถูกต้อง


2
อาสมบูรณ์แบบวิธีการแก้ปัญหาของคุณช่วยฉันได้หลายครั้ง .. เราใช้ส่วนขยายของบุคคลที่สามจำนวนมากในร้านของเรา :)
Xaiamedia

1
สมบูรณ์แบบคุณประหยัดเวลาของฉัน :) หนึ่งในโมดูลของบุคคลที่สามคือการอ้างอิงทรัพยากรที่ไม่ได้กำหนดไว้
Nidheesh

1
คุณเป็นฮีโร่ตัวจริง
Pablo

8

ฉันมีปัญหาเดียวกันนี้เมื่อเร็ว ๆ นี้ ข้อสังเกตสองสามข้อและวิธีแก้ปัญหา

1) มันจะช่วยได้อย่างมากหากแทนที่จะเป็น 'เอกสารที่ไม่ถูกต้อง' มันจะบอกคุณว่าเอกสารใดไม่ถูกต้อง

2) การตั้งค่า: กระบวนการอัปเกรดควรทำการตรวจสอบก่อนการบินเพื่อให้แน่ใจว่าสามารถทำการอัปเกรดได้

อย่างไรก็ตามหากคุณกำลังพยายามหาชื่อที่ขาดหายไปในไฟล์ acl.xml หลายสิบไฟล์ แต่จำเป็นต้องทำให้ไซต์กลับมาออนไลน์อย่างรวดเร็ววิธีแก้ปัญหาด่วนคือการทำให้แอตทริบิวต์ชื่อเป็นตัวเลือกแทนที่จะเป็นสิ่งที่จำเป็น

แก้ไขผู้ขาย / magento / framework / Acl / etc / acl_merged.xsd

ค้นหาบรรทัด

<xs:attribute name="title" type="typeTitle" use="required" />

แทนที่ด้วย

<xs:attribute name="title" type="typeTitle" use="optional" />

เรียกใช้การตั้งค่า magento อีกครั้ง: อัปเกรด

คุณจะต้องค้นหาปลั๊กอินที่มีชื่อหายไปในบางจุด


0

ฉันเปลี่ยน "Adminhtml" เป็น "Backend" ในโค้ดด้านล่างจากนั้นก็ใช้งานได้

แท็กทรัพยากรก่อนการเปลี่ยนแปลง:

**<resource id="Magento_Adminhtml::admin">**

แท็กทรัพยากรหลังจากการเปลี่ยนแปลง:

**<resource id="Magento_Backend::admin">**

รหัสสุดท้ายดังต่อไปนี้

**

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
    <acl>
        <resources>
            <resource id="Magento_Backend::admin">
                <resource id="Neo_Testing::testing" title="testing" sortOrder="100"/>
            </resource>
        </resources>
    </acl>
</config>

**


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