Magento 2 impossível rastrear erro de grade do administrador: Erro fatal: Método Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () não deve gerar uma exceção

9

Devido à alta dependência de arquivos XML, estou tendo dificuldades para descobrir a causa desse erro ao criar uma grade de administração personalizada:

Erro fatal: O método Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () não deve lançar uma exceção em C: \ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php on-line 0 0

Estou tentando criar uma grade de administração para a sales_shipment_itemtabela.

Até agora eu tenho:

  1. Utilizou o xdebug e o colocou dentro do __toString()método da classe Result, ele não mostra qual é o erro real

  2. Eu tenho var_dump-ed as variáveis ​​dentro do __toString()método

  3. Eu tenho o modo de desenvolvedor ativado no Magento 2

  4. Eu verifiquei o var/logse não mostra nada útil

Fiz com sucesso outras grades personalizadas de administrador, mas tentar descobrir o erro real é como uma agulha no palheiro. Alguém encontrou uma maneira melhor de depurar estes? Eu olhei sobre todo o grid xml,, di.xmle models e tudo parece ok.

Kevin Chavez
fonte
Faça um grande bloco try / catch Magento\Ui\TemplateEngine\Xhtml\Result::__toString(), capture a exceção e registre-a ou imprima-a. É o que M2 deveria ter feito de qualquer maneira.
N /
sim, é isso que já existe no Result.php:, } catch (\Exception $e) { $this->logger->critical($e->getMessage()); $result = $e->getMessage(); }o erro é o que eu já postei. Quando eu tive esses erros antes, geralmente tem a ver com as injeções de di.xml ausentes, mas é impossível depurar sem adivinhar, e foi por isso que postei essa pergunta.
Kevin Chavez
@KevinJavitz, você corrigiu isso? Eu estou tendo o mesmo problema.
MGento 21/09/18

Respostas:

4

O erro que você está recebendo é realmente acionado vendor\magento\module-ui\Component\Wrapper\UiComponent.php.

No entanto, não é acionado na linha 0, mas quando o resultado está sendo convertido em uma sequência no seguinte método na instrução 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;
}

Aqui está o que você pode tentar depurar seu problema:

  • verifique o que $resultcontém antes que a instrução de conversão e retorno de string seja chamada
  • obter informações sobre o componente que está causando um problema chamando $component->getName(), $component->getComponentName()e $component->getData()para ajudá-lo descobrir qual é o problema
Raphael na Digital Pianism
fonte
2

Este erro fatal também ocorreu quando adicionei grade / listagem personalizada. Corrigi esse problema alterando o construtor e iniciando a coleta correta para minha listagem / grade de dados no construtor do provedor de dados. Exemplo de grade 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();
    }
}

Mas você precisa criar \ Acme \ CustomModule \ Model \ ResourceModel \ Entity \ Listing \ Collection para obter seus dados no provedor de dados

transverso
fonte
1

SE você migrou M1 para M2, está enfrentando algo abaixo do erro durante a execução do cmd O armazenamento solicitado não foi encontrado. Verifique a loja e tente novamente.

não altere os arquivos de armazenamento de módulos do fornecedor :

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

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

basta aplicar as etapas abaixo:

Recentemente, me deparei com essa mesma situação depois de migrar do Magento 1.9.3.8 para 2.3.0 e espero que minha resposta possa ser útil. O problema veio da exclusão de várias lojas, 96 delas para ser exato. Tentei todas as outras respostas aqui, mas ainda estava recebendo o mesmo erro.

A correção para mim foi remover os dados antigos da loja de dentro do "core_config_data" . O problema é que, quando o Magento está carregando os dados de configuração do tempo de execução, ele encontra as lojas antigas e tenta resolvê-las. Antes de limpar os dados do banco de dados, recomendo que você execute a consulta SELECT abaixo para certificar-se de excluir os armazenamentos corretos.

SELECT * FROM core_config_data WHERE scope = 'lojas';

AVISO: CERTIFIQUE-SE DE CÓPIA DE BACKUP DA SUA BASE DE DADOS ANTES DE EXECUTAR ISTO!

DELETE FROM core_config_data WHERE scope_id! = 1 AND scope = 'stores';

Agora execute todos os comandos magento e veja a "A loja solicitada não foi encontrada. Verifique a loja e tente novamente" corrigida pela consulta

Erro fatal: O método Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () não deve lançar uma exceção em C: \ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php on-line 0 0

Agora verifique o seu administrador acima de erro fatal também resolvido blahhh ... blahh ...

(Nota: - erro fatal_Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () depende do módulo da loja, portanto não mude / vendor / module-store, caso contrário, a grade do lado do administrador / catálogo de listas não poderá ver os dados adequados)

Nikunj Panchal
fonte
0

Após inúmeras horas e muitas batidas com a cabeça na mesa, descobri que estava recebendo esse erro, porque estava usando o xdebug (o que é incrível!) Para interromper uma função de baixo nível, ou seja Magento\Ui\TemplateEngine\Xhtml\Result::__toString(), para testar.

Aparentemente, de alguma maneira, a saída do depurador estava lançando um erro que fazia com que o método __toString gritasse comigo.

Eu estava ficando louco porque o erro só apareceria quando o depurador estivesse ligado e pensei que talvez tivesse algo a ver com a chamada AJAX ao preencher a listagem da interface do usuário. Desligá-lo parecia fazê-lo funcionar, por isso vale a pena tentar. Não tenho muita certeza de como a funcionalidade de ponto de interrupção do xdebug (especificamente nos produtos IntelliJ ... possivelmente) funciona, exceto se você puder invocar um ponto de interrupção com a linha xdebug_break(). É muito provável que ter um ponto de interrupção no método __toString seja apenas uma coisa boba de se fazer em qualquer caso.

Acho que ainda não podemos depurar tudo dinamicamente ... Um dia!

Eu realmente espero que isso ajude outra pessoa.

Nathaniel Rogers
fonte