Magento 2.2.0 Élément de document non valide 'ressource': l'attribut 'titre' est obligatoire mais manquant

12

J'essaie de mettre à niveau un site Web de Magento 2.1.8 à 2.2.0

J'ai configuré le composeur pour 2.2.0 et l' ai également mis à jour avec la ligne de commande.

Maintenant, lorsque magento setup:upgradej'exécute son arrêt sur l'exécution du schéma et l'affichage de la note suivante: pfa pour plus d'informations.

Exécution du schéma récurrent ... Élément de document non valide 'ressource': l'attribut 'titre' est obligatoire mais manquant. Ligne: 12

Élément «ressource»: l'attribut «titre» est obligatoire mais manquant. Ligne: 13

entrez la description de l'image ici

Yogesh Trivedi
la source
Vérifiez le lien, rakeshjesadiya.com/…
Rakesh Jesadiya

Réponses:

22

Ma meilleure supposition est que vous avez un <resource>-tag dans n'importe quel etc/acl.xmlfichier avec un titleattribut manquant . Habituellement, cela pose le problème que vous ne pouvez pas créer ou modifier un nouveau rôle. Je suppose qu'ils ont créé une vérification supplémentaire dans 2.2 pour détecter cela plus tôt.

Vérifiez mieux les acl.xmlfichiers de vos propres extensions personnalisées et / ou ceux des extensions tierces. Veuillez noter: l' titleattribut n'est requis que pour les nouveaux <resource>nœuds. Donc, si vous ajoutez un nouveau nœud de ressource à un nœud de ressource existant (fourni par un autre module), il n'est pas nécessaire d'ajouter l' titleattribut -attribute à ceux-ci. Par exemple:

<!-- 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
la source
4
Parfois, cela peut se produire lorsque vous utilisez un module qui dépend d'un autre type de module parent comme un noyau megaplaza, et que le module parent n'est pas installé
open-ecommerce.org
1
J'ai également le même problème, mais malheureusement je n'ai pas pu trouver le fichier etc / acl.xml avec l'attribut title manquant, j'ai vérifié toutes les extensions personnalisées. Existe-t-il un moyen de repérer facilement le fichier.
Hari Swaminathan,
Des idées sur la façon de sortir le nom de fichier du xml corrompu?
David Lambauer
L'installation du noyau Mageplaza a résolu ce problème pour moi: github.com/mageplaza/module-core
seanbreeden
29

Pour trouver le fichier avec l'attribut manquant, vous pouvez modifier le fichier suivant

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

ajouter le code suivant

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

à la méthode

protected function _readFiles($fileList)

donc ça devrait ressembler

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

Vous pourrez maintenant voir un vidage du mauvais élément XML.

Dmitri Portenko
la source
2
Ah parfait, votre solution m'a fait gagner des tonnes de temps .. nous utilisons beaucoup d'extensions tierces dans notre magasin :)
Xaiamedia
1
Parfait, vous m'avez fait gagner du temps :) L'un des modules tiers faisait référence à une ressource qui n'était pas définie.
Nidheesh
1
Tu es un vrai héros
Pablo
8

J'ai eu ce même problème récemment. Quelques observations et une solution de contournement.

1) Cela aiderait énormément si, au lieu de «Document non valide», il vous indiquait quel document n'était pas valide.

2) Le processus d'installation: la mise à niveau devrait probablement faire quelques vérifications avant le vol pour s'assurer qu'il peut effectuer la mise à niveau.

Quoi qu'il en soit, si vous êtes coincé à essayer de trouver un titre manquant dans les dizaines de fichiers acl.xml, mais que vous avez besoin de remettre un site en ligne rapidement, la solution rapide consiste à rendre l'attribut title facultatif au lieu de requis.

Modifier le fournisseur / magento / framework / Acl / etc / acl_merged.xsd

Trouvez la ligne

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

remplacer par

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

relancez la configuration de magento: mise à niveau

Vous devrez toujours trouver le plugin avec le titre manquant à un moment donné.

Shaun Murray
la source
0

J'ai changé le "Adminhtml" en "Backend" dans le code ci-dessous, puis cela fonctionne.

Balise de ressource Avant le changement:

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

Balise de ressource après modification:

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

Code final comme ci-dessous.

**

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