Magento 2.2.0 Elemento documento 'risorsa' non valido: l'attributo 'titolo' è obbligatorio ma mancante


12

Sto cercando di aggiornare un sito Web da Magento 2.1.8 a 2.2.0

Ho configurato Composer per 2.2.0 e l' ho anche aggiornato con la riga di comando.

Ora, quando magento setup:upgradeeseguo il suo arresto sull'esecuzione dello schema e mostrando la seguente nota: pfa per maggiori informazioni.

Esecuzione dello schema ricorrente ... Elemento documento 'risorsa' non valido: l'attributo 'titolo' è obbligatorio ma mancante. Linea: 12

Elemento 'risorsa': l'attributo 'titolo' è obbligatorio ma mancante. Linea: 13

inserisci qui la descrizione dell'immagine


Risposte:


22

La mia ipotesi migliore è che hai un <resource>tag in qualsiasi etc/acl.xmlfile con un titleattributo mancante . Di solito questo porterebbe il problema che non è stato possibile creare o modificare un nuovo ruolo. Immagino che abbiano creato un controllo extra in 2.2 per rilevarlo più prima.

Controlla meglio i file acl.xmldelle tue estensioni personalizzate e / o quelle delle estensioni di terze parti. Nota: l' titleattributo è richiesto solo per i nuovi <resource>nodi. Pertanto, se si aggiunge un nuovo nodo-risorsa a un nodo di risorse esistente (fornito da un altro modulo), non è necessario aggiungere l' titleattributo a quelli. Per esempio:

<!-- 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
alcune volte ciò può accadere quando si utilizza un modulo che dipende da un altro tipo di modulo genitore come un megaplaza core e il modulo genitore non è installato
open-ecommerce.org

1
Ho anche lo stesso problema, ma sfortunatamente non sono riuscito a trovare il file etc / acl.xml con l'attributo title mancante, ho controllato tutte le estensioni personalizzate. C'è un modo per individuare facilmente il file.
Hari Swaminathan,

Qualche idea su come produrre il nome del file XML corrotto?
David Lambauer,

L'installazione del core di Mageplaza ha risolto questo problema per me: github.com/mageplaza/module-core
seanbreeden

28

Per trovare il file con l'attributo mancante è possibile modificare il seguente file

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

aggiungi il seguente codice

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

al metodo

protected function _readFiles($fileList)

quindi dovrebbe apparire come

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

Ora sarai in grado di vedere un dump dell'elemento XML errato.


2
Ah perfetto, la tua soluzione mi ha fatto risparmiare un sacco di tempo .. stiamo usando molte estensioni di terze parti nel nostro negozio :)
Xaiamedia

1
Perfetto, mi hai risparmiato tempo :) Uno dei moduli di terze parti si riferiva a una risorsa che non era definita.
Nidheesh,

1
Sei un vero eroe
Pablo

8

Ho avuto questo stesso problema di recente. Un paio di osservazioni e una soluzione alternativa.

1) Sarebbe di grande aiuto se invece di "Documento non valido" ti dicesse quale documento non è valido.

2) L'installazione: il processo di aggiornamento dovrebbe probabilmente eseguire alcuni controlli pre-volo per assicurarsi che possa eseguire l'aggiornamento.

Ad ogni modo, se sei bloccato nel tentativo di trovare un titolo mancante tra le decine di file acl.xml, ma devi ripristinare rapidamente un sito online, la soluzione rapida è rendere l'attributo title facoltativo anziché obbligatorio.

Modifica fornitore / magento / framework / Acl / etc / acl_merged.xsd

Trova la linea

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

sostituirlo con

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

riesegui l'installazione di Magento: aggiorna

A un certo punto dovrai comunque trovare il plug-in con il titolo mancante.


0

Ho modificato "Adminhtml" in "Backend" nel codice seguente, quindi funziona.

Tag risorsa Prima della modifica:

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

Tag risorsa Dopo la modifica:

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

Codice finale come di seguito.

**

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

**


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.