I am working on magento 2.2.6
I am using file
vendor/magento/module-catalog/Helper/Product/View.php
In this, I am trying to get root category name or ID of product using product id in function initProductLayout()...
My constructor code is as below:
class View extends \Magento\Framework\App\Helper\AbstractHelper
{
/**
* List of catalog product session message groups
*
* @var array
*/
protected $messageGroups;
/**
* Core registry
*
* @var \Magento\Framework\Registry
*/
protected $_coreRegistry = null;
/**
* Catalog product
*
* @var \Magento\Catalog\Helper\Product
*/
protected $_catalogProduct = null;
/**
* Catalog design
*
* @var \Magento\Catalog\Model\Design
*/
protected $_catalogDesign;
/**
* Catalog session
*
* @var \Magento\Catalog\Model\Session
*/
protected $_catalogSession;
/**
* @var \Magento\Framework\Message\ManagerInterface
*/
protected $messageManager;
/**
* @var \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator
*/
protected $categoryUrlPathGenerator;
/**
* @var \Magento\Framework\Stdlib\StringUtils
*/
private $string;
/**
* @var \Magento\Catalog\Model\CategoryFactory
*/
private $categoryFactory;
/**
* Constructor
*
* @param \Magento\Framework\App\Helper\Context $context
* @param \Magento\Catalog\Model\Session $catalogSession
* @param \Magento\Catalog\Model\Design $catalogDesign
* @param \Magento\Catalog\Helper\Product $catalogProduct
* @param \Magento\Framework\Registry $coreRegistry
* @param \Magento\Framework\Message\ManagerInterface $messageManager
* @param \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator $categoryUrlPathGenerator
* @param array $messageGroups
* @param \Magento\Framework\Stdlib\StringUtils|null $string
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Catalog\Model\Session $catalogSession,
\Magento\Catalog\Model\Design $catalogDesign,
\Magento\Catalog\Helper\Product $catalogProduct,
\Magento\Framework\Registry $coreRegistry,
\Magento\Framework\Message\ManagerInterface $messageManager,
\Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator $categoryUrlPathGenerator,
array $messageGroups = [],
\Magento\Framework\Stdlib\StringUtils $string = null,
\Magento\Catalog\Model\CategoryFactory $categoryFactory
) {
$this->_catalogSession = $catalogSession;
$this->_catalogDesign = $catalogDesign;
$this->_catalogProduct = $catalogProduct;
$this->_coreRegistry = $coreRegistry;
$this->messageGroups = $messageGroups;
$this->messageManager = $messageManager;
$this->categoryUrlPathGenerator = $categoryUrlPathGenerator;
$this->string = $string ?: \Magento\Framework\App\ObjectManager::getInstance()
->get(\Magento\Framework\Stdlib\StringUtils::class);
$this->categoryFactory = $categoryFactory;
parent::__construct($context);
}
/**
* Add meta information from product to layout
*
* @param \Magento\Framework\View\Result\Page $resultPage
* @param \Magento\Catalog\Model\Product $product
* @return \Magento\Framework\View\Result\Page
*/
private function preparePageMetadata(ResultPage $resultPage, $product)
{
$pageConfig = $resultPage->getConfig();
$metaTitle = $product->getMetaTitle();
$pageConfig->setMetaTitle($metaTitle);
$pageConfig->getTitle()->set($metaTitle ?: $product->getName());
$keyword = $product->getMetaKeyword();
$currentCategory = $this->_coreRegistry->registry('current_category');
if ($keyword) {
$pageConfig->setKeywords($keyword);
} elseif ($currentCategory) {
$pageConfig->setKeywords($product->getName());
}
$description = $product->getMetaDescription();
if ($description) {
$pageConfig->setDescription($description);
} else {
$pageConfig->setDescription($this->string->substr(strip_tags($product->getDescription()), 0, 255));
}
if ($this->_catalogProduct->canUseCanonicalTag()) {
$pageConfig->addRemotePageAsset(
$product->getUrlModel()->getUrl($product, ['_ignore_category' => true]),
'canonical',
['attributes' => ['rel' => 'canonical']]
);
}
$pageMainTitle = $resultPage->getLayout()->getBlock('page.main.title');
if ($pageMainTitle) {
$pageMainTitle->setPageTitle($product->getName());
}
return $this;
}
/**
* Init layout for viewing product page
*
* @param \Magento\Framework\View\Result\Page $resultPage
* @param \Magento\Catalog\Model\Product $product
* @param null|\Magento\Framework\DataObject $params
* @return \Magento\Catalog\Helper\Product\View
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function initProductLayout(ResultPage $resultPage, $product, $params = null)
{
$settings = $this->_catalogDesign->getDesignSettings($product);
$pageConfig = $resultPage->getConfig();
if ($settings->getCustomDesign()) {
$this->_catalogDesign->applyCustomDesign($settings->getCustomDesign());
}
// Apply custom page layout
if ($settings->getPageLayout()) {
$pageConfig->setPageLayout($settings->getPageLayout());
}
$urlSafeSku = rawurlencode($product->getSku());
// Load default page handles and page configurations
if ($params && $params->getBeforeHandles()) {
foreach ($params->getBeforeHandles() as $handle) {
$resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], $handle, false);
$resultPage->addPageLayoutHandles(['id' => $product->getId(), 'sku' => $urlSafeSku], $handle);
}
}
$resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], null, false);
$resultPage->addPageLayoutHandles(['id' => $product->getId(), 'sku' => $urlSafeSku]);
if ($params && $params->getAfterHandles()) {
foreach ($params->getAfterHandles() as $handle) {
$resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], $handle, false);
$resultPage->addPageLayoutHandles(['id' => $product->getId(), 'sku' => $urlSafeSku], $handle);
}
}
// Apply custom layout update once layout is loaded
$update = $resultPage->getLayout()->getUpdate();
$layoutUpdates = $settings->getLayoutUpdates();
if ($layoutUpdates) {
if (is_array($layoutUpdates)) {
foreach ($layoutUpdates as $layoutUpdate) {
$update->addUpdate($layoutUpdate);
}
}
}
$currentCategory = $this->_coreRegistry->registry('current_category');
$controllerClass = $this->_request->getFullActionName();
if ($controllerClass != 'catalog-product-view') {
$pageConfig->addBodyClass('catalog-product-view');
}
$productId = $product->getData('entity_id');
$categoryIds = $product->getCategoryIds(); /*will return category ids array*/
$categoryCollection = $this->categoryFactory->create()->getCollection()->addFieldToFilter('entity_id',['finset' => categoryIds])->addFieldToFilter('level', 1); // Inject \Magento\Catalog\Model\CategoryFactory in contructor
print_r($categoryCollection->getData());exit;
$pageConfig->addBodyClass('product-' . $product->getUrlKey());
if ($currentCategory instanceof \Magento\Catalog\Model\Category) {
$pageConfig->addBodyClass('categorypath-' . $this->categoryUrlPathGenerator->getUrlPath($currentCategory))
->addBodyClass('category-' . $currentCategory->getUrlKey());
}
return $this;
}
/**
* Prepares product view page - inits layout and all needed stuff
*
* $params can have all values as $params in \Magento\Catalog\Helper\Product - initProduct().
* Plus following keys:
* - 'buy_request' - \Magento\Framework\DataObject holding buyRequest to configure product
* - 'specify_options' - boolean, whether to show 'Specify options' message
* - 'configure_mode' - boolean, whether we're in Configure-mode to edit product configuration
*
* @param \Magento\Framework\View\Result\Page $resultPage
* @param int $productId
* @param \Magento\Framework\App\Action\Action $controller
* @param null|\Magento\Framework\DataObject $params
* @throws \Magento\Framework\Exception\LocalizedException
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @return \Magento\Catalog\Helper\Product\View
*/
public function prepareAndRender(ResultPage $resultPage, $productId, $controller, $params = null)
{
/**
* Remove default action handle from layout update to avoid its usage during processing of another action,
* It is possible that forwarding to another action occurs, e.g. to 'noroute'.
* Default action handle is restored just before the end of current method.
*/
$defaultActionHandle = $resultPage->getDefaultLayoutHandle();
$handles = $resultPage->getLayout()->getUpdate()->getHandles();
if (in_array($defaultActionHandle, $handles)) {
$resultPage->getLayout()->getUpdate()->removeHandle($resultPage->getDefaultLayoutHandle());
}
if (!$controller instanceof \Magento\Catalog\Controller\Product\View\ViewInterface) {
throw new \Magento\Framework\Exception\LocalizedException(
__('Bad controller interface for showing product')
);
}
// Prepare data
$productHelper = $this->_catalogProduct;
if (!$params) {
$params = new \Magento\Framework\DataObject();
}
// Standard algorithm to prepare and render product view page
$product = $productHelper->initProduct($productId, $controller, $params);
if (!$product) {
throw new \Magento\Framework\Exception\NoSuchEntityException(__('Product is not loaded'));
}
$buyRequest = $params->getBuyRequest();
if ($buyRequest) {
$productHelper->prepareProductOptions($product, $buyRequest);
}
if ($params->hasConfigureMode()) {
$product->setConfigureMode($params->getConfigureMode());
}
$this->_eventManager->dispatch('catalog_controller_product_view', ['product' => $product]);
$this->_catalogSession->setLastViewedProductId($product->getId());
if (in_array($defaultActionHandle, $handles)) {
$resultPage->addDefaultHandle();
}
$this->initProductLayout($resultPage, $product, $params);
$this->preparePageMetadata($resultPage, $product);
return $this;
}
}
How to get this?