I need to change functionality of getHref() method. So I Created several below files in my code folder.
1.<vendor>\Catalog\Block\Widget\Link\Link.php
<?php
namespace Tea\Catalog\Block\Widget;
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
class Link extends \Magento\Catalog\Block\Widget\Link
{
/**
* Entity model name which must be used to retrieve entity specific data.
* @var null|\Magento\Catalog\Model\ResourceModel\AbstractResource
*/
protected $_entityResource = null;
/**
* Prepared href attribute
*
* @var string
*/
protected $_href;
/**
* Prepared anchor text
*
* @var string
*/
protected $_anchorText;
/**
* Url finder for category
*
* @var UrlFinderInterface
*/
protected $urlFinder;
/**
* @param \Magento\Framework\View\Element\Template\Context $context
* @param UrlFinderInterface $urlFinder
* @param \Magento\Catalog\Model\ResourceModel\AbstractResource $entityResource
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
UrlFinderInterface $urlFinder,
\Magento\Catalog\Model\ResourceModel\AbstractResource $entityResource = null,
array $data = []
) {
parent::__construct($context, $data);
$this->urlFinder = $urlFinder;
$this->_entityResource = $entityResource;
}
/**
* Prepare url using passed id path and return it
* or return false if path was not found in url rewrites.
*
* @throws \RuntimeException
* @return string|false
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function getHref()
{
if ($this->_href === null) {
if (!$this->getData('id_path')) {
throw new \RuntimeException('Parameter id_path is not set.');
}
$rewriteData = $this->parseIdPath($this->getData('id_path'));
$href = false;
$store = $this->hasStoreId() ? $this->_storeManager->getStore($this->getStoreId())
: $this->_storeManager->getStore();
$filterData = [
UrlRewrite::ENTITY_ID => $rewriteData[1],
UrlRewrite::ENTITY_TYPE => $rewriteData[0],
UrlRewrite::STORE_ID => $store->getId(),
];
if (!empty($rewriteData[2]) && $rewriteData[0] == ProductUrlRewriteGenerator::ENTITY_TYPE) {
$filterData[UrlRewrite::METADATA]['category_id'] = $rewriteData[2];
}
$rewrite = $this->urlFinder->findOneByData($filterData);
if ($rewrite) {
$href = $store->getUrl('', ['_direct' => $rewrite->getRequestPath()]);
if (strpos($href, '___store') === false) {
$this->_href = $href;
}
}
$this->_href = $href;
}
return $this->_href;
}
/**
* Parse id_path
*
* @param string $idPath
* @throws \RuntimeException
* @return array
*/
protected function parseIdPath($idPath)
{
$rewriteData = explode('/', $idPath);
if (!isset($rewriteData[0]) || !isset($rewriteData[1])) {
throw new \RuntimeException('Wrong id_path structure.');
}
return $rewriteData;
}
/**
* Prepare label using passed text as parameter.
* If anchor text was not specified get entity name from DB.
*
* @return string
*/
public function getLabel()
{
if (!$this->_anchorText) {
if ($this->getData('anchor_text')) {
$this->_anchorText = $this->getData('anchor_text');
} elseif ($this->_entityResource) {
$idPath = explode('/', $this->_getData('id_path'));
if (isset($idPath[1])) {
$id = $idPath[1];
if ($id) {
$this->_anchorText = $this->_entityResource->getAttributeRawValue(
$id,
'name',
$this->_storeManager->getStore()
);
}
}
}
}
return $this->_anchorText;
}
/**
* Render block HTML
* or return empty string if url can't be prepared
*
* @return string
*/
protected function _toHtml()
{
if ($this->getHref()) {
return parent::_toHtml();
}
return '';
}
}
2.Update di.xml file
<preference for="Magento\Catalog\Block\Widget\Link" type="Tea\Catalog\Block\Widget\Link" />
But still use Magento\Catalog\Block\Widget\Link file. Please help me resolve the problem.