我正在尝试将网站从Magento 2.1.8 升级到2.2.0
我已经为2.2.0配置了composer,并且还通过命令行对其进行了更新。
现在,当我magento setup:upgrade
在运行模式中停止运行并显示以下注释时:pfa了解更多信息。
正在重复执行模式...无效的文档元素“资源”:属性“标题”是必需的,但缺少。行:12
元素“资源”:属性“标题”是必需的,但缺少。行:13
我正在尝试将网站从Magento 2.1.8 升级到2.2.0
我已经为2.2.0配置了composer,并且还通过命令行对其进行了更新。
现在,当我magento setup:upgrade
在运行模式中停止运行并显示以下注释时:pfa了解更多信息。
正在重复执行模式...无效的文档元素“资源”:属性“标题”是必需的,但缺少。行:12
元素“资源”:属性“标题”是必需的,但缺少。行:13
Answers:
我最好的猜测是,<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>
要查找具有缺少属性的文件,可以修改以下文件
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元素的转储。
我最近有同样的问题。一些观察和解决方法。
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设置:升级
您仍然需要在某些时候找到缺少标题的插件。
我在下面的代码中将“ 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>
**
无效的文档元素资源Magento 2x中需要属性标题
没用