Magento 2.2.0 Elemento de documento inválido 'resource': O atributo 'title' é obrigatório, mas está ausente

12

Estou tentando atualizar um site do Magento 2.1.8 para 2.2.0

Eu configurei o compositor para 2.2.0 e também o atualizei com a linha de comando.

Agora, quando eu executo magento setup:upgradesua interrupção na execução do esquema e mostrando a seguinte nota: pfa para obter mais informações.

Esquema em execução recorrente ... Elemento inválido do documento 'resource': O atributo 'title' é necessário, mas está ausente. Linha: 12

Elemento 'resource': o atributo 'title' é obrigatório, mas está ausente. Linha: 13

insira a descrição da imagem aqui

Yogesh Trivedi
fonte
Verifique o link, rakeshjesadiya.com/…
Rakesh Jesadiya

Respostas:

21

Meu melhor palpite é que você tem um <resource>-tag em qualquer etc/acl.xml-file com um titleatributo- faltando . Normalmente, isso geraria o problema de que você não poderia criar ou editar uma nova função. Suponho que eles criaram uma verificação extra no 2.2 para detectar isso mais cedo.

É melhor verificar os acl.xmlarquivos de suas próprias extensões personalizadas e / ou de extensões de terceiros. Observe: o titleatributo-é necessário apenas para novos <resource>-nodes. Portanto, se você estiver adicionando um novo nó de recurso a um nó de recurso existente (fornecido por outro módulo), não haverá necessidade de adicionar o titleatributo a esses. Por exemplo:

<!-- 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
fonte
4
algumas vezes isso pode ocorrer quando você estiver usando um módulo que depende, em outro tipo de módulo pai como um núcleo Megaplaza, eo módulo pai não está instalado
open-ecommerce.org
1
Também estou com o mesmo problema, mas infelizmente não consegui encontrar o arquivo etc / acl.xml com o atributo title ausente, verifiquei todas as extensões personalizadas. Existe alguma maneira de identificar o arquivo facilmente.
Hari Swaminathan
Alguma idéia de como gerar o nome do arquivo do xml corrompido?
David Lambauer
Instalando o núcleo Mageplaza corrigido este problema para mim: github.com/mageplaza/module-core
seanbreeden
26

Para localizar o arquivo com o atributo ausente, você pode modificar o seguinte arquivo

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

adicione o seguinte código

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

para o método

protected function _readFiles($fileList)

então deve parecer

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

Agora você poderá ver um despejo do elemento XML errado.

Dmitri Portenko
fonte
2
Ah perfeito, sua solução me salvou toneladas de tempo .. estamos usando um monte de extensões de terceiros em nossa loja :)
Xaiamedia
1
Perfeito, você economizou meu tempo :) Um dos módulos de terceiros referia um recurso que não estava definido.
Nidheesh 29/08/19
1
Você é um herói verdadeiro
Pablo
8

Eu tive esse mesmo problema recentemente. Algumas observações e uma solução alternativa.

1) Ajudaria imensamente se, em vez de 'Documento inválido', informasse qual documento era inválido.

2) O processo setup: upgrade provavelmente deve fazer algumas verificações pré-vôo para garantir que ele possa fazer a atualização.

De qualquer forma, se você estiver tentando encontrar um título ausente nas dezenas de arquivos acl.xml, mas precisar colocar um site on-line rapidamente, a solução rápida é tornar o atributo title opcional, em vez de obrigatório.

Edite o fornecedor / magento / framework / Acl / etc / acl_merged.xsd

Encontre a linha

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

substituir com

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

re-execute a instalação do magento: upgrade

Você ainda precisará encontrar o plug-in com o título ausente em algum momento.

Shaun Murray
fonte
0

Alterei o "Adminhtml" para "Backend" no código abaixo e, em seguida, ele funciona.

Etiqueta de recurso Antes da alteração:

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

Etiqueta de recurso Após a alteração:

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

Código final como abaixo.

**

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