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.