質問

ブロックのオーバーライドに関して助けが必要です。 Preferencesを使用してブロックを上書きしましたが、CORPUTメソッドでコアレジストリを追加すると、次のエラーが表示されます。

Recoverable Error: Argument 2 passed to Magento\Catalog\Block\Product\ProductList\Toolbar::__construct() must be an instance of Magento\Catalog\Model\Session, array 
.

これは私のコードです:

namespace Vendername\Modulename\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class Toolbar extends \Magento\Catalog\Block\Product\ProductList\Toolbar
{

    protected $_registry;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        Registry $registry,
        array $data = []
    ) {

        $this->_registry = $registry;
        parent::__construct($context, $data);
    }


    public function getCurrentMode()
    {

        $category = $this->_registry->registry('current_category');
        print_r($category->getId());
        exit;
        $mode = $this->_getData('_current_grid_mode');
        if ($mode) {
            return $mode;
        }
        $defaultMode = $this->_productListHelper->getDefaultViewMode($this->getModes());
        $mode = $this->_toolbarModel->getMode();
        if (!$mode || !isset($this->_availableMode[$mode])) {
            $mode = $defaultMode;
        }
        $this->setData('_current_grid_mode', $mode);
        return $mode;
    }
}
.

レジストリとこの行を削除すると、オーバーライドが機能しています。

役に立ちましたか?

解決

ツールバーブロックに多くの依存関係があるという問題のように見えますが、

を渡してはいけません
public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Session $catalogSession,
    \Magento\Catalog\Model\Config $catalogConfig,
    ToolbarModel $toolbarModel,
    \Magento\Framework\Url\EncoderInterface $urlEncoder,
    ProductList $productListHelper,
    \Magento\Framework\Data\Helper\PostHelper $postDataHelper,
    array $data = []
)
.

しかし、クラスを上書きするために「環境設定」を使用することはまったく悪い考えです。プラグインやレイアウトを使用するのに役立ちますが、必要なものによって異なります。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top