Magento2 - Kategorie-URL nach ID abrufen


11

Ich versuche, den URL-Schlüssel einer bestimmten Kategorie mit der ID abzurufen. Ich habe das;

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

Und das funktioniert (in print_r gibt es den URL-Schlüssel, den ich brauche), aber Kategorie 3 ist die Kategorie der obersten Ebene. Immer wenn ich eine Unterkategorie versuche (z. B. ID 5), erhalte ich ein leeres Array. Ich bin nur sprachlos, kann es nicht herausfinden.

In Magento 1.x habe ich das gemacht: Mage::getModel('catalog/category')->load($catID)->getUrl()und das hat funktioniert.

TL; DR: Dieser Code funktioniert. Ändern Sie die ID in eine (korrekte) Kategorie-ID und ändern Sie sie getData()in getUrl()für die vollständige Kategorie-URL oder getName()für den Kategorienamen.

Antworten:


28

Um die Kategorie-URL zu erhalten, müssen Sie die folgende \Magento\Catalog\Model\CategoryFunktion verwenden getUrl():

$category->getUrl()

Sie können auch URL von erhalten 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();
    }
} 

Danke :) getData in getUrl zu ändern war der richtige Aufruf.
Alex Timmer

Up hat gut für dich gestimmt
Pushpendra Singh

Gute Antwort, sehr hilfreich. +1
Shoaib Munir

12

Versuchen Sie immer, das Repository zu verwenden. Sie müssen wie folgt injizieren:

/ **
 * @var \ Magento \ Catalog \ Helper \ Category
 * /
protected $ categoryHelper;

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


öffentliche Funktion __construct (
    \ Magento \ Catalog \ Helper \ Category $ categoryHelper,
    \ Magento \ Catalog \ Model \ CategoryRepository $ categoryRepository,

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

Für Kategorie URL

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

Geil, danke. Ich habe versucht, IDs mit dem CategoryModel zu durchlaufen, das dieselben Daten durch Iterationen neu lädt. Du hast mich nach ein paar Kopfkratzern gerettet!
Domdambrogia

6

Sie können den folgenden Code ausprobieren.

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

Bevor Sie eine Kategorie-ID verwenden, müssen Sie bestätigen, dass die Kategorie-ID in admin vorhanden ist. Andernfalls wird ein leeres Array zurückgegeben.

Lassen Sie mich wissen, wenn Sie Fragen haben.


Äh ja, das ist genau der Code, den ich im OP geschrieben habe. Aber Sie haben Recht, ich habe einige Ausweise anprobiert, von denen ich dachte, dass sie existieren, aber nicht.
Alex Timmer

1

Ich stellte fest, dass ich ein neues URL-Objekt pro Geschäftsansicht erstellen musste, wenn ich Kategorie-URLs aus verschiedenen Domänen (pro Geschäftsansicht) benötige.

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

Dies funktioniert gut auf meinem benutzerdefinierten Block (unter Verwendung von Kategorie-Repository und 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;

Schließlich verwende ich in einer Vorlagendatei nur:

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

0

@andrea Bitte aktualisieren Sie die getCategory-Methode. Entweder funktioniert es gut.

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.