Magento2 - Kategori URL'sini kimliğe göre al


11

Kimliği olan herhangi bir kategorinin URL anahtarını almaya çalışıyorum. Bu bende var;

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

Ve bu çalışıyor (print_r'de ihtiyacım olan URL anahtarı var), ancak # 3 kategorisi en üst düzey kategoridir. Her alt kategoriyi denediğimde (diyelim ID 5) boş bir dizi alıyorum. Sadece kelimeler için kayboldum, anlayamıyorum.

Magento 1.x'te bunu yapardım: Mage::getModel('catalog/category')->load($catID)->getUrl()ve bu işe yaradı.

TL; DR: Bu kod, çalışan bir (doğru) kategorisi kimliğiyle ve değişime kimliğinin değiştirilmesi getData()için getUrl()komple kategori url için ya getName()için kategori adının.

Yanıtlar:


29

Kategori url'sini almak için aşağıdaki gibi bir \Magento\Catalog\Model\Categoryişlev kullanmanız gerekir getUrl():

$category->getUrl()

Ayrıca, url alabilirsiniz 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();
    }
} 

Teşekkür ederim :) getData için getData değiştirme doğru çağrı oldu.
Alex Timmer

İyi çalışıyor, Yukarı sana oy verdi
Pushpendra Singh

İyi cevap, çok yararlı. +1
Shoaib Munir

12

Her zaman havuzu kullanmaya çalışın. Aşağıdaki şekilde enjekte etmeniz gerekir:

/ **
 * @var \ Magento \ Katalog \ Yardımcı \ Kategori
 * /
korumalı $ categoryHelper;

/ **
 * @var \ Magento \ Katalog \ Model \ Kategori
 * /
korumalı $ kategori


kamu işlevi __construct (
    \ Magento \ Katalog \ Yardımcı \ Kategori $ kategoriHelper,
    \ Magento \ Katalog \ Model \ KategoriRefository $ categoryRepository,

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

Url kategorisi için

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

Harika. Teşekkürler. Aynı verileri yinelemeler yoluyla yeniden yükleyen CategoryModel ile kimlikler arasında döngü çalışıyordu. Bir sürü kafa çizilmesinden sonra beni kurtardın!
domdambrogia

6

Aşağıdaki kodu deneyebilirsiniz.

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

Bir kategori kimliği kullanmadan önce yönetici kategorisinde kategori kimliğinin bulunduğunu onaylarsınız veya boş bir dizi döndürür.

Herhangi bir sorunuz olursa bize bildirin.


Ah evet, OP'de yazdığım kod tam olarak bu. Ama haklısın, var olduğunu düşündüğüm bazı kimlikler denedim, ama etmedim.
Alex Timmer

1

Farklı alanlardan kategori URL'lerine ihtiyacım olduğunda (mağaza görünümü başına), mağaza görünümü başına yeni bir URL nesnesi oluşturmak zorunda olduğumu fark ettim.

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

Bu benim özel blok (kategori depo ve DI kullanarak) iyi çalışır:

/**
 * 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;

Son olarak, bir şablon dosyası içinde sadece kullanıyorum:

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

0

@andrea Lütfen getCategory yöntemini güncelleyin. Ya iyi çalışıyor.

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.