Magento 2.2.0 Недійсний елемент документа 'ресурс': атрибут 'title' потрібен, але відсутній


12

Я намагаюся оновити веб-сайт з Magento 2.1.8 до 2.2.0

Я налаштував композитор для 2.2.0, а також оновив його командним рядком.

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

Запуск схеми, що повторюється ... Недійсний елемент документа 'ресурс': атрибут 'title' обов'язковий, але відсутній. Рядок: 12

Елемент 'ресурс': атрибут 'title' обов'язковий, але відсутній. Рядок: 13

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


Перевір посилання, rakeshjesadiya.com/…
Ракеш Єсадія

Відповіді:


22

Я найкраще здогадуюсь, що у вас є <resource>-таг у будь-якому файлі etc/acl.xmlз відсутнім title-attribute. Зазвичай це призведе до того, що ви не можете створити чи редагувати нову роль. Я здогадуюсь, що вони створили додатковий чек у 2.2, щоб виявити це раніше.

Краще перевірте acl.xmlфайли власних розширень та / або розширень сторонніх розробників. Зверніть увагу: title-attribute потрібен лише для нових <resource>-нод. Отже, якщо при додаванні нового ресурсного вузла до існуючого ресурсного вузла (надається іншим модулем) немає необхідності додавати до них 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 з відсутнім атрибутом заголовка, я перевірив усі спеціальні розширення. Чи є спосіб я легко помітити файл.
Харі Свамінатан

Будь-які ідеї, як вивести ім'я пошкодженого XML?
Девід Ламбауер

Встановлення ядра Mageplaza вирішило цю проблему для мене: github.com/mageplaza/module-core
seanbreeden

30

Щоб знайти файл з відсутнім атрибутом, ви можете змінити наступний файл

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
Ви справжній герой
Пабло

8

У мене ця ж проблема була нещодавно. Пару спостережень та рішення.

1) Неодмінно допоможе, якби замість "Недійсний документ" він сказав вам, який документ недійсний.

2) Процес налаштування: оновлення, ймовірно, повинен зробити кілька перевірок перед польотом, щоб переконатися, що він може зробити оновлення.

У будь-якому випадку, якщо ви застрягли, намагаючись знайти зниклий заголовок у десятках файлів acl.xml, але вам потрібно швидко повернути сайт в Інтернеті, швидкий спосіб вирішити, щоб атрибут заголовка був необов’язковим замість необхідного.

Редагувати постачальника / magento / Framework / Acl / тощо / 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>

**


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.