Magento 2.2.0 Недопустимый элемент документа 'ресурс': атрибут 'заголовок' является обязательным, но отсутствует

12

Я пытаюсь обновить сайт с Magento 2.1.8 до 2.2.0

Я настроил composer для 2.2.0, а также обновил его с помощью командной строки.

Теперь, когда я запускаю magento setup:upgradeсвою остановку при запуске схемы и показываю следующее примечание: pfa для дополнительной информации.

Повторяющаяся схема выполнения ... Неверный элемент документа 'ресурс': атрибут 'заголовок' является обязательным, но отсутствует. Линия: 12

Элемент 'resource': атрибут 'title' является обязательным, но отсутствует. Линия: 13

введите описание изображения здесь

Йогеш Триведи
источник
Проверьте ссылку, rakeshjesadiya.com/…
Ракеш Джесадия,

Ответы:

22

Мое лучшее предположение, что у вас есть <resource>-tag в любом etc/acl.xml-файле с отсутствующим titleатрибутом. Обычно это приводит к тому, что вы не можете создать или отредактировать новую роль. Я предполагаю, что они создали дополнительную проверку в 2.2, чтобы обнаружить это раньше.

Лучше проверьте acl.xml-файлы ваших собственных расширений и / или расширений сторонних производителей. Обратите внимание: -attribute titleтребуется только для новых <resource>-nodes. Таким образом, если вы добавляете новый ресурсный узел к существующему ресурсному узлу (предоставленному другим модулем), нет необходимости добавлять 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 с отсутствующим атрибутом title, я проверил все пользовательские расширения. Есть ли способ, которым я могу легко определить файл.
Хари Сваминатан
Любые идеи о том, как вывести имя файла поврежденного XML?
Дэвид Ламбауэр
Установка ядра Mageplaza устранила эту проблему для меня: github.com/mageplaza/module-core
seanbreeden
28

Чтобы найти файл с отсутствующим атрибутом, вы можете изменить следующий файл

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
Отлично, вы сэкономили мое время :) Один из сторонних модулей ссылался на ресурс, который не был определен.
Нидиш
1
Вы настоящий герой
Пабло
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 setup: обновить

Вам все равно нужно будет найти плагин с отсутствующим названием в какой-то момент.

Шон Мюррей
источник
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>

**

Джитендра Патель
источник