File: /var/www/vhost/disk-apps/magento.bikenow.co/vendor/magento/module-catalog/Block/Widget/Link.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Block\Widget;
use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
use Magento\UrlRewrite\Model\UrlFinderInterface;
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
/**
* Render the URL of given entity
*/
class Link extends \Magento\Framework\View\Element\Html\Link implements \Magento\Widget\Block\BlockInterface
{
/**
* 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
*
* @throws \RuntimeException
* @return string|false if path was not found in url rewrites.
* @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 ($this->addStoreCodeParam($store, $href)) {
$href .= (strpos($href, '?') === false ? '?' : '&') . '___store=' . $store->getCode();
}
}
$this->_href = $href;
}
return $this->_href;
}
/**
* Checks whether store code query param should be appended to the URL
*
* @param \Magento\Store\Model\Store $store
* @param string $url
* @return bool
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
private function addStoreCodeParam(\Magento\Store\Model\Store $store, string $url): bool
{
return $this->getStoreId()
&& !$store->isUseStoreInUrl()
&& $store->getId() !== $this->_storeManager->getStore()->getId()
&& strpos($url, '___store') === false;
}
/**
* 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
*
* @return string empty string if url can't be prepared
*/
protected function _toHtml()
{
if ($this->getHref()) {
return parent::_toHtml();
}
return '';
}
}