Magento 2 Невозможно отследить ошибку сетки администратора: фатальная ошибка: метод Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () не должен вызывать исключение


9

Из-за высокой степени надежности файлов XML мне очень трудно выяснить причину этой ошибки при создании пользовательской сетки администратора:

Неустранимая ошибка: метод Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () не должен вызывать исключение в C: \ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php в строке 0

Я пытаюсь сделать сетку администратора для sales_shipment_itemтаблицы.

Пока что у меня есть:

  1. Использовал xdebug и поместил его в __toString()метод класса Result, он не показывает реальную ошибку

  2. Я var_dump-переменные в __toString()методе

  3. У меня в Magento 2 включен режим разработчика

  4. Я проверил var/logsи ничего полезного не показывает

Я успешно создал другие пользовательские сетки для администраторов, но попытка выяснить фактическую ошибку подобна иголке в стоге сена. Кто-нибудь нашел лучший способ отладки этих? Я просмотрел всю сетку XML di.xml, и модели, и все выглядит хорошо.


Сделайте большой блок try / catch Magento\Ui\TemplateEngine\Xhtml\Result::__toString(), поймайте исключение и зарегистрируйте его или распечатайте. Это то, что М2 должен был сделать в любом случае.
nevvermind

да, это то, что уже есть в Result.php: } catch (\Exception $e) { $this->logger->critical($e->getMessage()); $result = $e->getMessage(); }ошибка, что я уже опубликовал. Когда у меня были эти ошибки раньше, это обычно связано с отсутствующими инъекциями di.xml, но их невозможно отладить, не угадав, поэтому я и опубликовал этот вопрос.
Кевин Чавес

@KevinJavitz, ты это исправил? У меня такая же проблема.
MGento

Ответы:


4

Ошибка, которую вы получаете, действительно вызвана vendor\magento\module-ui\Component\Wrapper\UiComponent.php.

Однако он запускается не в строке 0, а при преобразовании результата в строку в следующем методе в операторе возврата :

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

Вот что вы можете попробовать отладить вашу проблему:

  • проверьте, что $resultсодержится до вызова преобразования строки и оператора возврата
  • Получите информацию о компоненте, который вызывает проблему, позвонив $component->getName(), $component->getComponentName()и $component->getData()чтобы помочь вам выяснить, в чем проблема

2

Эта фатальная ошибка также произошла со мной, когда я добавил пользовательский листинг / сетку. Я исправил эту проблему, изменив конструктор и инициировав правильный сбор данных для моего списка / сетки данных в конструкторе поставщика данных. Пример пользовательской сетки 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();
    }
}

Но вам нужно создать \ Acme \ CustomModule \ Model \ ResourceModel \ Entity \ Listing \ Collection, чтобы получить данные в поставщике данных


1

Если вы перенесли M1 в M2, то вы столкнулись с ошибкой ниже во время выполнения cmd Запрошенное хранилище не найдено. Проверьте магазин и попробуйте снова.

пожалуйста, не изменяйте в файлах магазина модуля продавца :

  • /vendor/magento/module-store/Model/StoreManager.php или

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

просто примените следующие шаги:

Я только недавно столкнулся с такой же ситуацией после перехода с Magento 1.9.3.8 на 2.3.0 и надеюсь, что мой ответ может быть полезным. Проблема возникла из-за удаления нескольких магазинов, 96 из которых были точными. Я попробовал все остальные ответы здесь, но все еще получал ту же ошибку.

Для меня исправлением было удаление старых данных магазина изнутри «core_config_data» . Проблема в том, что когда Magento загружает данные конфигурации во время выполнения, он находит старые хранилища и пытается их разрешить. Перед очисткой данных из базы данных я НАСТОЯТЕЛЬНО рекомендую вам выполнить запрос SELECT ниже, чтобы убедиться, что вы удаляете правильные хранилища.

SELECT * FROM core_config_data WHERE scope = 'stores';

ВНИМАНИЕ: УБЕДИТЕСЬ, ЧТОБЫ СОЗДАТЬ ВАШУ БАЗУ ДАННЫХ ПЕРЕД ПРОВЕДЕНИЕМ ЭТОГО

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

Теперь выполните все команды magento, которые вы видите. «Запрошенное хранилище не найдено. Проверьте хранилище и попробуйте снова», исправленное запросом

Неустранимая ошибка: метод Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () не должен вызывать исключение в C: \ wamp64 \ www \ mage2 \ vendor \ magento \ module-ui \ Component \ Wrapper \ UiComponent.php в строке 0

Теперь проверьте ваш админ над фатальной ошибкой, также решенной бла ...

(Примечание: - фатальная ошибка_Magento \ Ui \ TemplateEngine \ Xhtml \ Result :: __ toString () зависит от модуля хранилища, поэтому не изменяйте / vendor / module-store, иначе сетка / список на стороне администратора вы не сможете увидеть правильные данные)


0

После бесчисленных часов и множества ударов головой о стол я обнаружил, что получаю эту ошибку, потому что я использовал xdebug (что удивительно!) Для точки останова на низкоуровневой функции, а именно Magento\Ui\TemplateEngine\Xhtml\Result::__toString()для тестирования.

По-видимому, каким-то образом вывод отладчика фактически выдавал ошибку, из-за которой метод __toString выкрикивал на меня.

Я сходил с ума, потому что ошибка появлялась только тогда, когда я включал отладчик и думал, что, возможно, это как-то связано с вызовом AJAX при заполнении списка пользовательского интерфейса. Отключение, казалось, заставило это работать, так что стоит попробовать. Я не слишком уверен, как функционирует точка останова в xdebug (особенно в продуктах IntelliJ ... возможно), за исключением того, что вы можете вызывать точку останова со строкой xdebug_break(). Весьма вероятно, что в любом случае иметь точку останова в методе __toString просто глупо.

Думаю, мы пока не можем все отладить динамически ... Однажды!

Я действительно надеюсь, что это поможет кому-то еще.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.