Magento2-ID로 카테고리 URL 가져 오기


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 변화에 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 \ CategoryRepository
 * /
보호 된 $ categoryRepository;


공공 함수 __construct (
    \ Magento \ Catalog \ Helper \ Category $ categoryHelper,
    \ 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을 사용하여 ID를 반복하려고했습니다. 당신은 많은 머리를 긁적 후 나를 구했습니다!
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());

카테고리 ID를 사용하기 전에 관리자에 카테고리 ID가 있는지 확인하거나 빈 배열을 반환합니다.

궁금한 점이 있으면 알려주세요.


예, OP에서 작성한 정확한 코드입니다. 그러나 당신은 맞습니다. 나는 존재한다고 생각했지만 ID가없는 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.