Magento2 - Obter URL da categoria por ID


11

Estou tentando obter a chave de URL de qualquer categoria com o ID. Eu tenho isto;

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

E isso funciona (no print_r existe a chave da URL que eu preciso), mas a categoria 3 é a categoria de nível superior. Sempre que tento qualquer subcategoria (digamos ID 5), recebo uma matriz em branco. Só estou perdido por palavras, não consigo entender.

No Magento 1.x, eu costumava fazer isso: Mage::getModel('catalog/category')->load($catID)->getUrl()e isso funcionou.

TL; DR: Esse código funciona, mudar o ID para um (correta) ID da categoria e mudança getData()para getUrl()para a url categoria completa, ou getName()para o nome da categoria.

Respostas:


28

Para obter o URL da categoria, você precisa usar a \Magento\Catalog\Model\Categoryfunção da seguinte getUrl()maneira:

$category->getUrl()

Além disso, você pode obter o URL por 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();
    }
} 

Obrigado :) Mudar getData para getUrl foi a decisão certa.
precisa

Trabalhando bem,
Votado

Boa resposta, muito útil. 1
Shoaib Munir

12

Sempre tente usar o repositório. Você precisa injetar a seguinte maneira:

/ **
 * @var \ Magento \ Catálogo \ Auxiliar \ Categoria
 * /
protected $ categoryHelper;

/ **
 * @var \ Magento \ Catalog \ Model \ CategoryRepository
 * /
protected $ categoryRepository;


função pública __construct (
    \ Magento \ Catalog \ Helper \ Category $ categoryHelper,
    \ Magento \ Catalog \ Model \ CategoryRepository $ categoryRepository,

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

Para o URL da categoria

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

Perfeito, obrigado. Eu estava tentando fazer um loop através de IDs com o CategoryModel, que estava recarregando os mesmos dados por meio de iterações. Você me salvou depois de um monte de coçar a cabeça!
domdambrogia

6

Você pode tentar o código abaixo.

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

Antes de usar um ID de categoria, confirme se o ID de categoria existe no admin ou ele retornará uma matriz vazia.

Deixe-me saber se você tiver alguma dúvida.


Sim, esse é o código exato que escrevi no OP. Mas você está correto, tentei algumas identidades que pensei que existissem, mas não existiam.
Alex Timmer

1

Descobri que quando preciso de URLs de categoria de domínios diferentes (por visualização da loja), tive que criar um novo objeto de URL por visualização da loja.

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

Isso funciona bem no meu bloco personalizado (usando repositório de categorias e 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;

Finalmente, dentro de um arquivo de modelo, eu apenas uso:

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

0

@andrea Atualize o método getCategory. Ou funciona bem.

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.