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 ?>
Author: JGeer, 2020-05-31

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-адреса. Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

Я надеюсь, что это поможет вам....!

 3
Author: Devidas, 2020-05-31 18:31:10