Magento 2.2.0 Elemento de documento no válido 'recurso': el atributo 'título' es obligatorio pero falta

12

Estoy tratando de actualizar un sitio web de Magento 2.1.8 a 2.2.0

He configurado el compositor para 2.2.0 y también lo actualicé con la línea de comando.

Ahora cuando ejecuto magento setup:upgradesu detención en la ejecución del esquema y mostrando la siguiente nota: pfa para más información.

Ejecutando esquema recurrente ... Elemento de documento no válido 'recurso': el atributo 'título' es obligatorio pero falta. Línea: 12

Elemento 'recurso': el atributo 'título' es obligatorio pero falta. Línea: 13

ingrese la descripción de la imagen aquí

Yogesh Trivedi
fuente
Compruebe el enlace, rakeshjesadiya.com/…
Rakesh Jesadiya el

Respuestas:

22

Mi mejor conjetura es que tiene una <resource>etiqueta en cualquier etc/acl.xmlarchivo con un titleatributo faltante . Por lo general, esto generaría el problema de que no podría crear o editar una nueva función. Supongo que crearon una verificación adicional en 2.2 para detectar esto más temprano.

Compruebe mejor los acl.xmlarchivos de sus propias extensiones personalizadas y / o las de extensiones de terceros. Tenga en cuenta: el titleatributo -solo se requiere para nuevos <resource>-nodos. Entonces, si agrega un nuevo nodo de recursos a un nodo de recursos existente (proporcionado por otro módulo), no es necesario agregar el titleatributo a esos. Por ejemplo:

<!-- 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
fuente
44
algunas veces esto puede sucede cuando se utiliza un módulo que depende de otro tipo de módulo padre como un núcleo megaplaza, y el módulo de los padres no está instalado
open-ecommerce.org
1
También tengo el mismo problema, pero desafortunadamente no pude encontrar el archivo etc / acl.xml con el atributo de título faltante, he verificado todas las extensiones personalizadas. ¿Hay alguna manera de detectar el archivo fácilmente?
Hari Swaminathan
¿Alguna idea sobre cómo generar el nombre de archivo del xml corrupto?
David Lambauer
La instalación del núcleo de Mageplaza solucionó este problema para mí: github.com/mageplaza/module-core
seanbreeden
28

Para encontrar el archivo con el atributo faltante, puede modificar el siguiente archivo

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

agregar el siguiente código

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

al método

protected function _readFiles($fileList)

entonces debería verse como

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

Ahora podrá ver un volcado del elemento XML incorrecto.

Dmitri Portenko
fuente
2
Ah perfecto, su solución me ahorró toneladas de tiempo ... estamos usando muchas extensiones de terceros en nuestra tienda :)
Xaiamedia
1
Perfecto, me ahorró tiempo :) Uno de los módulos de terceros se refería a un recurso que no estaba definido.
Nidheesh
1
Eres un verdadero héroe
Pablo
8

Tuve este mismo problema recientemente. Un par de observaciones y una solución alternativa.

1) Sería de gran ayuda si en lugar de 'Documento inválido' le dijera qué documento no es válido.

2) La configuración: el proceso de actualización probablemente debería hacer algunas comprobaciones previas al vuelo para asegurarse de que puede hacer la actualización.

De todos modos, si está atascado tratando de encontrar un título que falta en las docenas de archivos acl.xml, pero necesita volver a poner en línea un sitio rápidamente, la solución rápida es hacer que el atributo de título sea opcional en lugar de obligatorio.

Edite vendor / magento / framework / Acl / etc / acl_merged.xsd

Encuentra la linea

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

reemplazar con

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

volver a ejecutar la configuración de magento: actualizar

Aún necesitará encontrar el complemento con el título faltante en algún momento.

Shaun Murray
fuente
0

He cambiado el "Adminhtml" a "Backend" en el siguiente código y luego funciona.

Etiqueta de recursos antes del cambio:

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

Etiqueta de recursos después del cambio:

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

Código final como abajo.

** **

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