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

Yogesh Trivedi
źródło
Sprawdź link, rakeshjesadiya.com/…
Rakesh Jesadiya

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>
Giel Berkers
źródło
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.

Dmitri Portenko
źródło
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.

Shaun Murray
źródło
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>

**

Jitendra Patel
źródło