Magento2 - Nhận URL danh mục theo ID


11

Tôi đang cố gắng lấy khóa URL của bất kỳ danh mục cụ thể nào có ID. Tôi có cái này;

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

Và điều này hoạt động (trong print_r có khóa URL tôi cần), nhưng danh mục số 3 là danh mục cấp cao nhất. Bất cứ khi nào tôi thử bất kỳ danh mục con nào (giả sử ID 5) tôi sẽ nhận được một mảng trống. Tôi không biết nói gì, không thể hiểu được.

Trong Magento 1.x tôi đã từng làm điều này: Mage::getModel('catalog/category')->load($catID)->getUrl()và nó đã hoạt động.

TL; DR: Mã này hoạt động, thay đổi ID để một (đúng) loại ID và thay đổi getData()để getUrl()cho url loại hoàn chỉnh, hoặc getName()cho tên thể loại.

Câu trả lời:


28

Để có được url danh mục, bạn cần sử dụng \Magento\Catalog\Model\Categorychức năng getUrl()như vậy:

$category->getUrl()

Ngoài ra, bạn có thể nhận url bằng cách 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();
    }
} 

Cảm ơn bạn :) Thay đổi getData thành getUrl là cuộc gọi đúng.
Alex Timmer

Hoạt động tốt, Up đã bình chọn cho bạn
Pushpendra Singh

Câu trả lời tốt, rất hữu ích. +1
Shoaib Munir

12

Luôn cố gắng sử dụng kho lưu trữ. Bạn cần tiêm theo cách sau:

/ **
 * @var \ Magento \ Catalogue \ Người trợ giúp \ Danh mục
 * /
được bảo vệ $ categoryHelper;

/ **
 * @var \ Magento \ Catalog \ Model \ CategoryRep repository
 * /
được bảo vệ $ categoryRep Storage;


chức năng công cộng __construct (
    \ Magento \ Catalog \ Helper \ Category $ categoryHelper,
    \ Magento \ Catalog \ Model \ CategoryRep repository $ categoryRep repository,

) {
    $ this-> categoryHelper = $ categoryHelper;
    $ this-> categoryRep repository = $ categoryRep repository;
}

Đối với url danh mục

$ categoryId = 3;
$ categoryObj = $ this-> categoryRep repository-> get ($ categoryId);
echo $ this-> categoryHelper-> getC CategoryUrl ($ categoryObj);

Tuyệt vời, cảm ơn bạn. Tôi đã cố gắng lặp qua các ID với CategoryModel đang tải lại cùng một dữ liệu thông qua các lần lặp. Bạn đã cứu tôi sau một loạt các đầu gãi!
domdambrogia

6

Bạn có thể thử mã dưới đây.

$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());

Trước khi bạn sử dụng id danh mục, bạn đã xác nhận id danh mục tồn tại trong quản trị viên hoặc nó sẽ trả về một mảng trống.

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi.


Uh yeah, đó là mã chính xác tôi đã viết trong OP. Nhưng bạn đã đúng, tôi đã thử trên một số ID mà tôi nghĩ đã tồn tại, nhưng không.
Alex Timmer

1

Tôi thấy rằng khi tôi cần các url danh mục từ các tên miền khác nhau (trên mỗi lượt xem cửa hàng), tôi phải tạo một đối tượng Url mới cho mỗi lượt xem cửa hàng.

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

Điều này hoạt động tốt trên khối tùy chỉnh của tôi (sử dụng kho lưu trữ danh mục và 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;

Cuối cùng, trong một tệp mẫu tôi chỉ sử dụng:

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

0

@andrea Vui lòng cập nhật phương thức getC Category. Hoặc nó hoạt động tốt.

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.