Magento2 - Dapatkan URL kategori dengan ID

11

Saya mencoba untuk mendapatkan kunci URL dari kategori yang diberikan dengan ID. Aku punya ini;

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

Dan ini berfungsi (di print_r ada kunci URL yang saya butuhkan), tetapi kategori # 3 adalah kategori tingkat atas. Setiap kali saya mencoba subkategori apa pun (katakan ID 5) saya mendapatkan array kosong. Saya hanya kehilangan kata-kata, tidak bisa memahaminya.

Di Magento 1.x saya biasa melakukan ini: Mage::getModel('catalog/category')->load($catID)->getUrl()dan itu berhasil.

TL; DR: Kode ini berfungsi, ubah ID menjadi ID kategori (benar) dan ubah getData()menjadi getUrl()untuk url kategori lengkap, atau getName()untuk nama kategori.

Alex Timmer
sumber

Jawaban:

28

Untuk mendapatkan url kategori, Anda harus menggunakan \Magento\Catalog\Model\Categoryfungsi getUrl()seperti ini:

$category->getUrl()

Anda juga bisa mendapatkan url 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
sumber
Terima kasih :) Mengubah getData ke getUrl adalah panggilan yang tepat.
Alex Timmer
Bekerja dengan baik, Up memilih Anda
Pushpendra Singh
Jawaban yang bagus, sangat membantu. +1
Shoaib Munir
12

Selalu mencoba menggunakan repositori. Anda perlu menyuntikkan cara berikut:

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

/ **
 * @var \ Magento \ Catalog \ Model \ CategoryRepository
 * /
$ kategoriRepositori yang dilindungi;


fungsi publik __construct (
    \ Magento \ Catalog \ Helper \ Kategori $ kategoriBantuan,
    \ Magento \ Catalog \ Model \ CategoryRepository $ categoryRepository,

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

Untuk url kategori

$ categoryId = 3;
$ categoryObj = $ this-> categoryRepository-> get ($ categoryId);
echo $ this-> categoryHelper-> getCategoryUrl ($ categoryObj);
Sohel Rana
sumber
Luarbiasa, terimakasih. Saya mencoba untuk mengulang melalui ID dengan CategoryModel yang memuat ulang data yang sama melalui iterasi. Anda menyelamatkan saya setelah banyak kepala menggaruk!
domdambrogia
6

Anda dapat mencoba kode di bawah ini.

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

Sebelum Anda menggunakan id kategori Anda telah mengkonfirmasi id kategori ada di admin atau itu akan mengembalikan array kosong.

Beri tahu saya jika Anda memiliki pertanyaan.

Suresh Chikani
sumber
Uh ya, itulah kode persis yang saya tulis di OP. Tapi Anda benar, saya mencoba beberapa ID yang saya pikir ada, tetapi tidak.
Alex Timmer
1

Saya menemukan bahwa ketika saya memerlukan url kategori dari domain yang berbeda (per tampilan toko), saya harus membuat objek Url baru per tampilan toko.

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
sumber
0

Ini berfungsi dengan baik di blok kustom saya (menggunakan repositori kategori dan 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;

Akhirnya, dalam file templat saya hanya menggunakan:

$this->getCategory(3)->getUrl()
Andrea
sumber
0

@andrea Harap perbarui metode getCategory. Entah itu bekerja dengan baik.

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