Страница корзины неустранимая ошибка после создания плагина коллекции товаров, Magento 2.3


Иногда нам необходимо получать цены на продукты из API для продуктов, загруженных на интерфейсе. Мы решили, что проще всего будет создать плагин для коллекции:

<?xml version="1.0"?>
<!-- .../Vendor/Module/etc/frontend/di.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    ...
    <type name="Magento\Catalog\Model\ResourceModel\Product\Collection">
        <plugin name="afterProductCollectionPlugin" type="Vendor\Module\Plugin\Catalog\Model\ResourceModel\Product\CollectionPlugin" />
    </type>
</config>
<?php
namespace Vendor\Module\Plugin\Catalog\Model\ResourceModel\Product;

use Magento\Catalog\Model\ResourceModel\Product\Collection;

class CollectionPlugin
{

    /**
     * @param Collection $subject
     * @param bool $printQuery
     * @param bool $logQuery
     * @return array
     */
    public function afterLoad(Collection $subject, $printQuery = false, $logQuery = false)
    {
        return [$printQuery, $logQuery];
    }
}

Однако после очистки кэша страница /checkout/cart выдает фатальную ошибку:

<b>Fatal error</b>:  Uncaught Error: Call to undefined method Magento\Catalog\Model\ResourceModel\Product\Link\Product\Collection\Interceptor::isComposite() in C:\xampp\htdocs\vendor\magento\module-catalog\view\frontend\templates\product\list\items.phtml:180
Stack trace:
#0 C:\xampp\htdocs\vendor\magento\framework\View\TemplateEngine\Php.php(59): include()
#1 C:\xampp\htdocs\vendor\magento\framework\View\Element\Template.php(271): Magento\Framework\View\TemplateEngine\Php-&gt;render(Object(Magento\Checkout\Block\Cart\Crosssell), 'C:/xampp/htdocs...', Array)
#2 C:\xampp\htdocs\vendor\magento\framework\View\Element\Template.php(301): Magento\Framework\View\Element\Template-&gt;fetchView('C:/xampp/htdocs...')
#3 C:\xampp\htdocs\vendor\magento\framework\View\Element\AbstractBlock.php(1097): Magento\Framework\View\Element\Template-&gt;_toHtml()
#4 C:\xampp\htdocs\vendor\magento\framework\View\Element\AbstractBlock.php(1101): Magento\Framework\View\Element\AbstractBlock-&gt;Magento\Framework\View\Element\{closure}()
#5 C:\xampp\htdocs\vendor\magen in <b>C:\xampp\htdocs\vendor\magento\module-catalog\view\frontend\templates\product\list\items.phtml</b> on line <b>180</b><br />

Как это исправить?

Author: Siarhey Uchukhlebau, 2019-11-27

1 answers

В случае, если вы используете плагин after, сначала у вас должен быть $result в аргументах, и он должен возвращать $result. См. Пример:

<?php
namespace Vendor\Module\Plugin\Catalog\Model\ResourceModel\Product;

use Magento\Catalog\Model\ResourceModel\Product\Collection;

class CollectionPlugin
{

    /**
     * @param Collection $subject
     * @param bool $printQuery
     * @param bool $logQuery
     * @return array
     */
    public function afterLoad(Collection $subject, $result, $printQuery = false, $logQuery = false)
    {
        return $result;
    }
}

PS: дополнительная информация в DEVDOCS

 3
Author: Siarhey Uchukhlebau, 2019-11-27 08:58:25