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.

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

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

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.


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

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

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);
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.