0

I want to override the protected function _prepareLayout()

So i have used preference

<preference for="Magento\Catalog\Block\Category\View" type="Module\Name\Block\Category\View"/>
class View extends \Magento\Catalog\Block\Product\View
{
    protected $_urlInterface;


    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
        \Magento\Framework\Registry $registry,
        \Magento\Catalog\Helper\Category $categoryHelper,
        \Magento\Framework\UrlInterface $urlInterface,
        array $data = []
    ) {
        $this->_urlInterface = $urlInterface;
        parent::__construct($context, $layerResolver, $registry, $categoryHelper, $data);
    }

    /**
     * @return $this
     */
    protected function _prepareLayout()
    {
        die(var_dump($this));
        parent::_prepareLayout();

        $this->getLayout()->createBlock(\Magento\Catalog\Block\Breadcrumbs::class);


        $category = $this->getCurrentCategory();
        if ($category) {
            $title = $category->getMetaTitle();
            if ($title) {
                $this->pageConfig->getTitle()->set($title);
            }
            $description = $category->getMetaDescription();
            if ($description) {
                $this->pageConfig->setDescription($description);
            }
            $keywords = $category->getMetaKeywords();
            if ($keywords) {
                $this->pageConfig->setKeywords($keywords);
            }
            if ($this->_categoryHelper->canUseCanonicalTag()) {
                $this->pageConfig->addRemotePageAsset(
                    // $category->getUrl(),
                    $this->_urlInterface->getCurrentUrl(),
                    'canonical',
                    ['attributes' => ['rel' => 'canonical']]
                );
            }

            $pageMainTitle = $this->getLayout()->getBlock('page.main.title');
            if ($pageMainTitle) {
                $pageMainTitle->setPageTitle($this->getCurrentCategory()->getName());
            }
        }

        return $this;
    }

but i get error 500

PHP Fatal error: Uncaught TypeError: Argument 1 passed to Magento\Catalog\Block\Product\View::__construct() must be an instance of Magento\Catalog\Block\Product\Context, instance of Magento\Framework\View\Element\Template\Context

  • What you want to achieve by override that file? – Rohan Hapani Nov 21 '19 at 12:53
  • insted of calling this => $category->getUrl(), I want it to call ->$this->_urlInterface->getCurrentUrl(), that's all Adding new DI to consturct and call $this->_urlInterface->getCurrentUrl(), – jibin george Nov 21 '19 at 12:55
  • which magetn version, you are using? – Amit Bera Nov 21 '19 at 13:00
  • magento v:2.2.10 – jibin george Nov 21 '19 at 13:01
1

You just need to replace your construct function with this

<?php

namespace Vendor\Module\Block\Category;

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Category;

class View extends \Magento\Catalog\Block\Category\View
{
    protected $_urlInterface;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver,
        \Magento\Framework\Registry $registry,
        \Magento\Catalog\Helper\Category $categoryHelper,
        \Magento\Framework\UrlInterface $urlInterface,
        array $data = []
    ) {
        $this->_urlInterface = $urlInterface;
        $this->_categoryHelper = $categoryHelper;
        $this->_catalogLayer = $layerResolver->get();
        $this->_coreRegistry = $registry;
        parent::__construct($context, $layerResolver, $registry, $categoryHelper, $data);
    }

    protected function _prepareLayout()
    {
        echo "123";die;
        parent::_prepareLayout();

        $this->getLayout()->createBlock(\Magento\Catalog\Block\Breadcrumbs::class);

        $category = $this->getCurrentCategory();
        if ($category) {
            $title = $category->getMetaTitle();
            if ($title) {
                $this->pageConfig->getTitle()->set($title);
            }
            $description = $category->getMetaDescription();
            if ($description) {
                $this->pageConfig->setDescription($description);
            }
            $keywords = $category->getMetaKeywords();
            if ($keywords) {
                $this->pageConfig->setKeywords($keywords);
            }
            if ($this->_categoryHelper->canUseCanonicalTag()) {
                $this->pageConfig->addRemotePageAsset(
                    $category->getUrl(),
                    'canonical',
                    ['attributes' => ['rel' => 'canonical']]
                );
            }

            $pageMainTitle = $this->getLayout()->getBlock('page.main.title');
            if ($pageMainTitle) {
                $pageMainTitle->setPageTitle($this->getCurrentCategory()->getName());
            }
        }

        return $this;
    }
}

Then run below commands once

rm -rf generated/* var/view_preprocessed/*
php bin/magento setup:upgrade
php bin/magento cache:clean
php bin/magento cache:flush

Hope this will help you!

| improve this answer | |
  • Still getting the same error PHP message: PHP Fatal error: Uncaught TypeError: Argument 1 passed to Magento\Catalog\Block\Product\View::__construct() must be an instance of Magento\Catalog\Block\Product\Context, instance of Magento\Framework\View\Element\Template\Context – jibin george Nov 21 '19 at 12:59
  • Did you run all commands ? after changing construct ? – Kishan Savaliya Nov 21 '19 at 13:00
  • Yes i did php bin/magento setup:upgrade php bin/magento cache:clean php bin/magento cache:flush and i did rm -rf var/di/* var/generation/* var/cache/* var/log/* var/page_cache/* var/session/* var/view_preprocessed/* pub/static/* – jibin george Nov 21 '19 at 13:01
  • 1
    this echo worked :) what was the error? – jibin george Nov 21 '19 at 13:13
  • 1
    If you'll check parent file's construct function then they are passing 5 arguments in params and you just passed $contect and $data. So if you'll pass all other then it will work. And whenever you will add anything in construct at that time you need to run setup upgrade or di compile once. :) – Kishan Savaliya Nov 21 '19 at 13:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.