Magento 2.2.0 Niepoprawny element dokumentu „zasób”: atrybut „tytuł” ​​jest wymagany, ale go brakuje


12

Próbuję zaktualizować witrynę z Magento 2.1.8 do 2.2.0

Mam skonfigurowane kompozytora do 2.2.0 , a także zaktualizowane go z linii poleceń.

Teraz, kiedy magento setup:upgradezatrzymuję się na uruchomieniu schematu i wyświetleniu następującej notatki: pfa, aby uzyskać więcej informacji.

Uruchamianie schematu cyklicznego ... Nieprawidłowy zasób elementu dokumentu: atrybut „tytuł” ​​jest wymagany, ale go brakuje. Linia: 12

Element „zasób”: atrybut „tytuł” ​​jest wymagany, ale go brakuje. Linia: 13

wprowadź opis zdjęcia tutaj


Odpowiedzi:


22

Domyślam się, że masz <resource>-tag w dowolnym etc/acl.xmlpliku z brakującym titleatrybutem. Zwykle powoduje to problem, którego nie można utworzyć ani edytować nowej roli. Zgaduję, że stworzyli dodatkową kontrolę w 2.2, aby wykryć to wcześniej.

Lepiej sprawdź acl.xmlpliki własnych rozszerzeń i / lub rozszerzeń innych firm. Uwaga: titleatrybut jest wymagany tylko dla nowych <resource>węzłów. Jeśli więc dodajesz nowy węzeł zasobów do istniejącego węzła zasobów (dostarczonego przez inny moduł), nie ma potrzeby dodawania do nich titleatrybutu. Na przykład:

<!-- 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
czasami może się tak zdarzyć, gdy używasz modułu zależnego od innego rodzaju modułu nadrzędnego, takiego jak rdzeń megaplazy, a moduł nadrzędny nie jest zainstalowany
— open-ecommerce.org

1
Mam również ten sam problem, ale niestety nie mogłem znaleźć pliku etc / acl.xml z brakującym atrybutem tytułu, sprawdziłem wszystkie niestandardowe rozszerzenia. Czy jest jakiś sposób, aby łatwo zlokalizować plik.
— Hari Swaminathan

Wszelkie pomysły, jak wyprowadzić nazwę pliku uszkodzonego pliku XML?
— David Lambauer

Zainstalowanie rdzenia Mageplaza naprawiło dla mnie ten problem: github.com/mageplaza/module-core
— seanbreeden

29

Aby znaleźć plik z brakującym atrybutem, możesz zmodyfikować następujący plik

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

dodaj następujący kod

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

do metody

protected function _readFiles($fileList)

więc powinno to wyglądać

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;
}

Teraz będziesz mógł zobaczyć zrzut niewłaściwego elementu XML.


2
Ach idealnie, twoje rozwiązanie pozwoliło mi zaoszczędzić mnóstwo czasu .. używamy wielu rozszerzeń innych firm w naszym sklepie :)
— Xaiamedia

1
Idealnie, zaoszczędziłeś mój czas :) Jeden z modułów zewnętrznych polecał zasób, który nie został zdefiniowany.
— Nidheesh

1
Jesteś prawdziwym bohaterem
— Pablo

8

Ostatnio miałem ten sam problem. Kilka uwag i obejście.

1) Ogromnie pomogłoby to, gdyby zamiast „Nieprawidłowego dokumentu” podano ci, który dokument jest nieważny.

2) Proces instalacji: aktualizacja powinna prawdopodobnie wykonać kilka kontroli przed lotem, aby upewnić się, że można ją wykonać.

W każdym razie, jeśli utkniesz, próbując znaleźć brakujący tytuł w dziesiątkach plików acl.xml, ale musisz szybko przywrócić witrynę do trybu online, szybkie obejście polega na ustawieniu atrybutu tytułu na opcjonalny zamiast wymaganego.

Edytuj vendor / magento / framework / Acl / etc / acl_merged.xsd

Znajdź linię

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

zamienić

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

uruchom ponownie instalację Magento: uaktualnij

W dalszym ciągu będziesz musiał znaleźć wtyczkę z brakującym tytułem.


0

Zmieniłem „Adminhtml” na „Backend” w poniższym kodzie, to działa.

Tag zasobów Przed zmianą:

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

Tag zasobów Po zmianie:

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

Ostateczny kod jak poniżej.

**

<?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>

**


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.