Magento2 - Obtenir l'URL de la catégorie par ID

11

J'essaie d'obtenir la clé URL d'une catégorie donnée avec l'ID. J'ai ceci;

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

Et cela fonctionne (dans print_r, il y a la clé URL dont j'ai besoin), mais la catégorie # 3 est la catégorie de niveau supérieur. Chaque fois que j'essaie une sous-catégorie (disons ID 5), je reçois un tableau vide. Je suis juste perdu pour les mots, je ne peux pas le comprendre.

Dans Magento 1.x, je faisais cela: Mage::getModel('catalog/category')->load($catID)->getUrl()et cela a fonctionné.

TL; DR: ce code fonctionne, remplacez l'ID par un ID de catégorie (correct) et remplacez getData()par getUrl()pour l'URL complète de la catégorie ou getName()pour le nom de la catégorie.

Alex Timmer
la source

Réponses:

28

Pour obtenir l'url de catégorie, vous devez utiliser la \Magento\Catalog\Model\Categoryfonction getUrl()comme suit:

$category->getUrl()

En outre, vous pouvez obtenir l'URL par 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
la source
Merci :) Changer getData en getUrl était le bon appel.
Alex Timmer
Ça marche
Bonne réponse, très utile. +1
Shoaib Munir
12

Essayez toujours d'utiliser le référentiel. Vous devez injecter de la manière suivante:

/ **
 * @var \ Magento \ Catalog \ Helper \ Category
 * /
protégé $ categoryHelper;

/ **
 * @var \ Magento \ Catalog \ Model \ CategoryRepository
 * /
protégé $ categoryRepository;


fonction publique __construct (
    \ Magento \ Catalog \ Helper \ Category $ categoryHelper,
    \ Magento \ Catalog \ Model \ CategoryRepository $ categoryRepository,

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

Pour l'URL de catégorie

$ categoryId = 3;
$ categoryObj = $ this-> categoryRepository-> get ($ categoryId);
echo $ this-> categoryHelper-> getCategoryUrl ($ categoryObj);
Sohel Rana
la source
Super merci. J'essayais de parcourir les ID avec le CategoryModel qui rechargeait les mêmes données à travers les itérations. Tu m'as sauvé après un tas de grattage de tête!
domdambrogia
6

Vous pouvez essayer ci-dessous le code.

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

Avant d'utiliser un identifiant de catégorie, vous devez confirmer qu'il existe un identifiant de catégorie dans admin ou il renverra un tableau vide.

Faites moi savoir si vous avez des questions.

Suresh Chikani
la source
Euh ouais, c'est le code exact que j'ai écrit dans l'OP. Mais vous avez raison, j'ai essayé certaines pièces d'identité que je pensais exister, mais je n'ai pas réussi.
Alex Timmer
1

J'ai constaté que lorsque j'avais besoin d'URL de catégorie de différents domaines (par vue de magasin), je devais créer un nouvel objet URL par vue de magasin.

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
la source
0

Cela fonctionne très bien sur mon bloc personnalisé (en utilisant le référentiel de catégories et 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;

Enfin, dans un fichier modèle, j'utilise simplement:

$this->getCategory(3)->getUrl()
Andrea
la source
0

@andrea Veuillez mettre à jour la méthode getCategory. Soit ça marche bien.

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