Magento 2.3 - Получить категорию товаров, связанных для каждого
Я хочу загрузить название категории и URL-адрес категории элемента, который отображается как связанный элемент на странице продукта.
Итак, внутри элемента foreach я хочу загрузить название категории и URL-адрес самого связанного элемента.
Как я могу получить название категории элемента в Magento 2.3?
Я попробовал следующее, что, кажется, работает хорошо, но я не хочу загружать менеджер объектов на внешний интерфейс, так каков наилучший способ загрузить это в противном случае?
<?php $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->get('Magento\Framework\Registry')->registry('current_product');
$categories = $product->getCategoryIds(); /*will return category ids array*/
foreach($categories as $category){
$cat = $objectManager->create('Magento\Catalog\Model\Category')->load($category);
echo $cat->getName();
}
?>
HTML:
<?php $items = $block->getProductCollection()->getItems();?>
<?php foreach ($items as $item) : ?>
<?= /* @noEscape */ ($iterator++ == 1) ? '' : '</' . $tag . '>' ?><<?= /* @noEscape */ $tag?> class="product-item">
<div class="product">
<div class="product-details col-sm-7">
<a title="<?= $block->escapeHtml($item->getName()) ?>"
href="<?= $block->escapeUrl($block->getProductUrl($item)) ?>"
class="product-item-link">
<?= $block->escapeHtml($item->getName()) ?>
</a>
<?= /* @noEscape */ $block->getProductPriceHtml($item, \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE) ?>
</div>
<div class="product-action col-sm-12">
<?php $CatName = $block->getCategoryCollection();
echo '<PRE>';print_r($CatName);?>
</div>
</div>
<?php endforeach ?>
1 answers
Создайте модуль и переопределите catalog_product_view.xml
в своем модуле. затем создайте один блок, чтобы настроить бизнес-логику на шаблон.
Vendor/Module/view/frontend/layout/catalog_product_view.xml
<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="product.info.main">
<container name="productdetailcat" htmlTag="div" htmlClass="productdetailcat" after="product.info.price">
<block class="Vendor\Module\Block\Custom" name="catnameurl" template="Vendor_Module::custom_cat.phtml" />
</container>
</referenceContainer>
</body>
</page>
Vendor/Module/Block/Custom.php
<?php
namespace Vendor\Module\Block;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\Framework\View\Page\Config;
use Magento\Framework\Registry;
use Magento\Catalog\Model\CategoryFactory;
use Magento\Catalog\Model\ProductFactory;
use Magento\Catalog\Model\Category;
class Custom extends Template
{
private $_registry;
private $_categoryFactory;
private $_productFactory;
protected $_category;
public function __construct(
Context $context,
Config $pageConfig,
Registry $registry,
Category $catgory,
CategoryFactory $categoryfactory,
ProductFactory $productFactory,
array $data = []
) {
parent::__construct($context, $data);
$this->pageConfig = $pageConfig;
$this->_registry = $registry;
$this->_categoryFactory = $categoryfactory;
$this->_productFactory = $productFactory;
$this->_category = $catgory;
}
public function getCategoryCollection($productId)
{
$product = $this->_productFactory->create()->load($productId);
$categories = $product->getCategoryIds();
foreach($categories as $category)
{
$cat = $this->_categoryFactory->create()->load($category);
$caturl = $cat->getUrl();
$catName = $cat->getName();
}
return $catName;
}
}
?>
Поставщик/Модуль/представление/интерфейс/шаблоны/custom_cat.phtml
<?php $items = $block->getProductCollection()->getItems();?>
<?php foreach ($items as $item) : ?>
<?= /* @noEscape */ ($iterator++ == 1) ? '' : '</' . $tag . '>' ?><<?= /* @noEscape */ $tag?> class="product-item">
<div class="product">
<div class="product-details col-sm-7">
<a title="<?= $block->escapeHtml($item->getName()) ?>"
href="<?= $block->escapeUrl($block->getProductUrl($item)) ?>"
class="product-item-link">
<?= $block->escapeHtml($item->getName()) ?>
</a>
<?= /* @noEscape */ $block->getProductPriceHtml($item, \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE) ?>
</div>
<div class="product-action col-sm-12">
<?php $CatName = $block->getCategoryCollection($item->getId());
echo '<PRE>';print_r($CatName);?>
</div>
</div>
<?php endforeach ?>
Или
Используйте приведенный ниже код в своем шаблоне в разделе связанный foreach. добавьте свой путь к блоку Vendor\Module\Block\Custom
вместо ваше имя блока.
$blockObj= $block->getLayout()->createBlock('Vendor\Module\Block\Custom');
$custmcatBlock = $blockObj->getCategoryCollection($item->getId());
echo '<PRE>';print_r($custmcatBlockatName);
Здесь отображается имя последней категории, потому что в foreach возвращается фамилия. в соответствии с вашей логикой в нашем коде и отобразите все имена кошек и URL-адреса. Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.
Я надеюсь, что это поможет вам....!