Magento 2.2.0无效的文档元素“资源”:属性“标题”为必填项,但缺少


12

我正在尝试网站从Magento 2.1.8 升级到2.2.0

我已经为2.2.0配置了composer,并且还通过命令行对其进行了更新。

现在,当我magento setup:upgrade在运行模式中停止运行并显示以下注释时:pfa了解更多信息。

正在重复执行模式...无效的文档元素“资源”:属性“标题”是必需的,但缺少。行:12

元素“资源”:属性“标题”是必需的,但缺少。行:13

在此处输入图片说明


Answers:


22

我最好的猜测是,<resource>任何etc/acl.xml-file中都有-tag 且缺少title-attribute。通常,这会引发您无法创建或编辑新角色的问题。我猜想他们在2.2中创建了一个额外的检查来更早地检测到这一点。

最好检查acl.xml自己的自定义扩展名和/或第三方扩展名的-files。请注意:title-attribute仅对于新的<resource>-nodes 是必需的。因此,如果将新资源节点添加到现有资源节点(由另一个模块提供),则无需title在这些资源节点上添加- 属性。例如:

<!-- 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
有时,当您使用依赖于其他类型的父模块(如megaplaza核心)的模块并且未安装父模块时,可能会发生这种情况
open-ecommerce.org

1
我也遇到了同样的问题,但是不幸的是我无法找到缺少title属性的etc / acl.xml文件,我已经检查了所有自定义扩展名。有什么办法可以方便地发现文件。
哈里Swaminathan

关于如何输出损坏的xml文件名的任何想法吗?
David Lambauer

安装Mageplaza核心为我解决了这个问题:github.com/mageplaza/module-core
seanbreeden 18-11-8

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)setup:upgrade过程可能应该进行一些飞行前检查,以确保它可以进行升级。

无论如何,如果您一直试图在数十个acl.xml文件中查找丢失的标题,但又需要快速使网站重新联机,则快速的解决方法是将title属性设置为可选,而不是必需。

编辑供应商/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>

**


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.