Magento 2 imposible de rastrear Error de la cuadrícula de administración: Error fatal: Método Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () no debe lanzar una excepción

9

Debido a la gran dependencia de los archivos XML, me está costando mucho descubrir la causa de este error al crear una grilla de administración personalizada:

Error fatal: Método Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () no debe lanzar una excepción en C: \ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php en línea 0 0

Estoy tratando de hacer una cuadrícula de administración para la sales_shipment_itemtabla.

Hasta ahora tengo:

  1. Usó xdebug y lo colocó dentro del __toString()método de la clase Resultado, no muestra cuál es el error real

  2. He var_dump-ed las variables dentro del __toString()método

  3. Tengo el modo desarrollador activado en Magento 2

  4. He comprobado el var/logsy no muestra nada útil

He realizado con éxito otras cuadrículas personalizadas de administrador, pero tratar de descubrir el error real es como una aguja en un pajar. ¿Alguien ha encontrado una mejor manera de depurar esto? He revisado todas las cuadrículas xml di.xml, y modelos y todo se ve bien.

Kevin Chavez
fuente
Haga un gran bloque try / catch Magento\Ui\TemplateEngine\Xhtml\Result::__toString(), capture la excepción e inicie sesión o imprímalo. Es lo que M2 debería haber hecho de todos modos.
nevvermind
Sí, eso es lo que ya está allí en Result.php: } catch (\Exception $e) { $this->logger->critical($e->getMessage()); $result = $e->getMessage(); }el error es lo que ya he publicado. Cuando he tenido estos errores antes, generalmente tiene que ver con la falta de inyecciones de di.xml, pero estos son imposibles de depurar sin solo adivinar, por eso publiqué esta pregunta.
Kevin Chavez
@ KevinJavitz, ¿arreglaste esto? Estoy teniendo el mismo problema.
MGento

Respuestas:

4

El error que está recibiendo se activa de hecho vendor\magento\module-ui\Component\Wrapper\UiComponent.php.

Sin embargo, no se activa en la línea 0, sino cuando el resultado se convierte en una cadena en el siguiente método en la declaración de retorno :

protected function _toHtml()
{
    foreach ($this->getChildNames() as $childName) {
        $childBlock = $this->getLayout()->getBlock($childName);
        if ($childBlock) {
            $wrapper = $this->blockWrapperFactory->create([
                'block' => $childBlock,
                'data' => [
                    'name' => 'block_' . $childName
                ]
            ]);
            $this->component->addComponent('block_' . $childName, $wrapper);
        }
    }

    $result = $this->component->render();
    return (string)$result;
}

Esto es lo que puede intentar para solucionar su problema:

  • verifique lo que $resultcontiene antes de que se llame la conversión de cadena y la declaración de retorno
  • obtener información sobre el componente que está causando un problema llamando $component->getName(), $component->getComponentName()y $component->getData()para ayudarle a descubrir lo que es el problema
Raphael en Digital Pianism
fuente
2

Este error fatal también se me ocurrió cuando agregué una lista / cuadrícula personalizada. Solucioné este problema cambiando el constructor e iniciando la recopilación correcta para mi listado / cuadrícula de datos en el constructor del proveedor de datos. Ejemplo de cuadrícula personalizada DataProvider.php

use Acme\CustomModule\Model\ResourceModel\Entity\Listing\CollectionFactory;

class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        CollectionFactory $collectionFactory,
        array $meta = [],
        array $data = []
    ) {
        parent::__construct($name, $primaryFieldName, $requestFieldName, 
        $meta, $data);
        $this->collection = $collectionFactory->create();
    }

    public function getData(): array
    {
        $collection = $this->getCollection();
        return $collection->toArray();
    }
}

Pero debe crear \ Acme \ CustomModule \ Model \ ResourceModel \ Entity \ Listing \ Collection para obtener sus datos en el proveedor de datos

transverso
fuente
1

SI migró M1 a M2, se enfrenta a algo por debajo del error durante la ejecución de cmd . No se encontró el almacén solicitado. Verifique la tienda e intente nuevamente.

por favor no cambie en los archivos de la tienda de módulos del proveedor :

  • /vendor/magento/module-store/Model/StoreManager.php o

    /vendor/magento/module-store/Model/StoreRepository.php

simplemente aplique los siguientes pasos:

Hace poco me encontré con esta misma situación después de migrar de Magento 1.9.3.8 a 2.3.0 y espero que mi respuesta pueda ser de ayuda. El problema vino de eliminar múltiples tiendas 96 de ellas para ser exactos. Intenté todas las otras respuestas aquí pero seguía recibiendo el mismo error.

La solución para mí fue eliminar los datos de la tienda anterior del interior de "core_config_data" . El problema es que cuando Magento está cargando los datos de configuración del tiempo de ejecución, está encontrando las tiendas antiguas e intentando resolverlas. Antes de limpiar los datos de la base de datos, le recomiendo que ejecute la consulta SELECCIONAR a continuación para asegurarse de eliminar las tiendas correctas.

SELECCIONAR * DESDE core_config_data WHERE scope = 'stores';

ADVERTENCIA: ¡ASEGÚRESE DE HACER UNA COPIA DE SEGURIDAD DE SU BASE DE DATOS ANTES DE EJECUTAR ESTO!

BORRAR DE core_config_data WHERE scope_id! = 1 AND scope = 'stores';

Ahora ejecute todos los comandos de magento, puede ver el "No se encontró la tienda solicitada. Verifique la tienda e intente nuevamente" fijada por consulta

Error fatal: Método Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () no debe lanzar una excepción en C: \ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php en línea 0 0

Ahora revise su administrador por encima del error fatal también resuelto blahhh ... blahh ...

(Nota: - fatal error_Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () depende del módulo de la tienda, así que no cambie / vendor / module-store; de ​​lo contrario, no podrá ver los datos adecuados)

Nikunj Panchal
fuente
0

Después de innumerables horas y muchos golpes en mi cabeza contra el escritorio, descubrí que recibía este error, porque estaba usando xdebug (¡lo cual es increíble!) Para alcanzar un punto de interrupción en una función de bajo nivel, es decir Magento\Ui\TemplateEngine\Xhtml\Result::__toString(), para probar.

Aparentemente, de alguna manera, la salida del depurador arrojaba un error que causaba que el método __toString me gritara.

Me estaba volviendo loco porque el error solo se mostraba cuando tenía el depurador encendido y pensaba que tal vez tenía algo que ver con la llamada AJAX al completar el listado de UI. Apagarlo pareció hacerlo funcionar, por lo que vale la pena intentarlo. No estoy muy seguro de cómo funciona la funcionalidad de punto de interrupción de xdebug (en los productos IntelliJ específicamente ... posiblemente), aparte de que puede invocar un punto de interrupción con la líneaxdebug_break() . Es muy probable que tener un punto de interrupción en el método __toString sea algo tonto en cualquier caso.

Supongo que no podemos depurar todo dinámicamente todavía ... ¡Un día!

Realmente espero que esto ayude a alguien más.

Nathaniel Rogers
fuente