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.

Alex Timmer
fonte

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();
    }
} 
Amit Bera
fonte
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);
Sohel Rana
fonte
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.

Suresh Chikani
fonte
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);
            }
        }
    }
}
Patrick van Bergen
fonte
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()
Andrea
fonte
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);
}
Biswajit Paul
fonte