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.

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

Merci :) Changer getData en getUrl était le bon appel.
Alex Timmer


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

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.


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);
            }
        }
    }
}

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

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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.