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.

Alex Timmer
quelle

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

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