Magento2 - รับ URL หมวดหมู่ตาม ID


11

ฉันพยายามรับรหัส URL ของหมวดหมู่ที่กำหนดด้วย ID ฉันมีสิ่งนี้

$categoryId = 3;
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$object_manager = $_objectManager->create('Magento\Catalog\Model\Category')->load($categoryId);
print_r($object_manager->getData());

และใช้งานได้ (ใน print_r นั่นคือมีคีย์ URL ที่ฉันต้องการ) แต่หมวดหมู่ # 3 เป็นหมวดหมู่ระดับบนสุด เมื่อใดก็ตามที่ฉันลองหมวดหมู่ย่อยใด ๆ (พูด ID 5) ฉันได้รับอาร์เรย์ที่ว่างเปล่า ฉันแค่สูญเสียคำไปไม่สามารถคิดออกได้

ใน Magento 1.x ฉันเคยทำสิ่งนี้Mage::getModel('catalog/category')->load($catID)->getUrl()และมันใช้ได้ผล

TL; DR:รหัสนี้ทำงานเปลี่ยนรหัสไปยัง (ที่ถูกต้อง) หมวด ID และการเปลี่ยนแปลงgetData()ไปgetUrl()สำหรับหมวดหมู่ URL ที่สมบูรณ์หรือgetName()ชื่อหมวดหมู่

คำตอบ:


29

ในการรับ url หมวดหมู่คุณต้องใช้\Magento\Catalog\Model\Categoryฟังก์ชันgetUrl()ดังนี้:

$category->getUrl()

นอกจากนี้คุณยังสามารถรับ url ได้ด้วย CategoryRepositoryInterface

nameSpace ['Your_nameSpace'] 
use Magento\Catalog\Api\CategoryRepositoryInterface;
class ['Your_Class_name']
    protected $_storeManager;
    protected $categoryRepository;
    public function __construct(
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Catalog\Model\CategoryRepository $categoryRepository,
    ) {
        .........
        $this->_storeManager = $storeManager;
        $this->categoryRepository = $categoryRepository;
    }

     public  function getCategory()
    {
            $category = $this->categoryRepository->get($categoryId, $this->_storeManager->getStore()->getId());

        return $category->getUrl();
    }
} 

ขอบคุณ :) การเปลี่ยน getData เป็น getUrl เป็นการโทรที่ถูกต้อง
Alex Timmer

ทำงานได้ดีขึ้นโหวตให้คุณ
Pushpendra Singh

คำตอบที่ดีมีประโยชน์มาก +1
Shoaib Munir

12

พยายามใช้ที่เก็บข้อมูลเสมอ คุณต้องฉีดด้วยวิธีต่อไปนี้:

/ **
 * @var \ Magento \ Catalog \ Helper \ Category
 * /
ป้องกัน $ categoryHelper

/ **
 * @var \ Magento \ Catalog \ Model \ Category Repository
 * /
ป้องกัน $ categoryRepository;


ฟังก์ชั่นสาธารณะ __ โครงสร้าง (
    \ Magento \ Catalog \ Helper \ Category $ หมวดความช่วยเหลือ,
    \ Magento \ Catalog \ Model \ CategoryRepository $ categoryRepository

) {
    $ this-> categoryHelper = $ categoryHelper;
    $ this-> categoryRepository = $ categoryRepository;
}

สำหรับ URL หมวดหมู่

$ categoryId = 3;
$ categoryObj = $ this-> categoryRepository-> get ($ categoryId);
echo $ this-> categoryHelper-> getCategoryUrl ($ categoryObj);

เยี่ยมมากขอบคุณ ฉันพยายามวนรหัสผ่านกับ CategoryModel ซึ่งทำการโหลดข้อมูลซ้ำผ่านการทำซ้ำ คุณช่วยฉันหลังจากที่เกาหัว!
domdambrogia

6

คุณสามารถลองรหัสด้านล่าง

$categoryId = 5;
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$object_manager = $_objectManager->create('Magento\Catalog\Model\Category')->load($categoryId);
echo "<pre>";
print_r($object_manager->getData());

ก่อนที่คุณจะใช้รหัสหมวดหมู่คุณต้องยืนยันว่ามีหมวดหมู่รหัสอยู่ในผู้ดูแลระบบหรือจะส่งคืนอาร์เรย์ว่างเปล่า

แจ้งให้เราทราบหากคุณมีคำถามใด ๆ


เอ่อใช่ว่าเป็นรหัสที่แน่นอนที่ฉันเขียนไว้ใน OP แต่คุณถูกต้องฉันลองใช้ ID บางตัวที่ฉันคิดว่ามีอยู่จริง แต่ไม่ได้
Alex Timmer

1

ฉันพบว่าเมื่อฉันต้องการ URL หมวดหมู่จากโดเมนที่แตกต่างกัน (ต่อมุมมองร้านค้า) ฉันต้องสร้างวัตถุ Url ใหม่ต่อมุมมองร้านค้า

use Magento\Catalog\Model\Category;
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
use Magento\Framework\UrlFactory;

class CacheWarmer
{
    /** @var CollectionFactory */
    protected $categoryCollectionFactory;

    /** @var \Magento\Store\Model\StoreManagerInterface */
    protected $storeManager;

    /** @var UrlFactory */
    protected $urlFactory;

    public function __construct(
        CollectionFactory $categoryCollectionFactory,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        UrlFactory $urlFactory
    )
    {
        $this->categoryCollectionFactory = $categoryCollectionFactory;
        $this->storeManager = $storeManager;
        $this->urlFactory = $urlFactory;
    }

    /**
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function execute()
    {
        $stores = $this->storeManager->getStores();

        foreach ($stores as $store) {

            $this->storeManager->setCurrentStore($store);

            $collection = $this->categoryCollectionFactory->create();
            $collection->addUrlRewriteToResult();
            $collection->addIsActiveFilter();

            $urlCreator = $this->urlFactory->create();

            /** @var Category $category */
            foreach ($collection as $category) {

                $requestPath = $category->getRequestPath();
                if (!$requestPath) {
                    continue;
                }

                $url = $urlCreator->getDirectUrl($category->getRequestPath());

                $result = @file_get_contents($url);
            }
        }
    }
}

0

ใช้งานได้ดีกับบล็อกที่กำหนดเองของฉัน (โดยใช้ที่เก็บหมวดหมู่และ DI):

/**
 * Constructor
 */
public function __construct(
  \Magento\Catalog\Model\CategoryRepository $categoryRepository,
  // ...
) 
{
  $this->_categoryRepository = $categoryRepository;
  // ...
}


/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->getCategoryRepository()->get($categoryId);
}


/**
 * Category repository object
 */
protected $_categoryRepository;

ในที่สุดภายในไฟล์เทมเพลตฉันเพิ่งใช้:

$this->getCategory(3)->getUrl()

0

@andrea โปรดอัปเดตวิธี getCategory มันทำงานได้ดี

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.