Magento2 - Получить URL категории по идентификатору

11

Я пытаюсь получить ключ URL любой данной категории с идентификатором. У меня есть это;

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

И это работает (в print_r есть ключ URL, который мне нужен), но категория # 3 - это категория верхнего уровня. Всякий раз, когда я пробую какую-либо подкатегорию (скажем, ID 5), я получаю пустой массив. Я просто потерян для слов, не могу понять это.

В Magento 1.x я делал это: Mage::getModel('catalog/category')->load($catID)->getUrl()и это сработало.

TL; DR: Этот код работает, измените ID на (правильную) категорию ID и изменения getData()к getUrl()для полной категории URL, или getName()для названия категории.

Алекс Тиммер
источник

Ответы:

28

Для того чтобы получить URL-адрес категории, вам нужно использовать такую \Magento\Catalog\Model\Categoryфункцию getUrl():

$category->getUrl()

Кроме того, вы можете получить 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();
    }
} 
Амит Бера
источник
Спасибо :) Изменение getData на getUrl было правильным вызовом.
Алекс Тиммер
Работает нормально, за тебя проголосовал
Пушпендра Сингх,
Хороший ответ, очень полезно. +1
Шоаиб Мунир
12

Всегда старайтесь использовать репозиторий. Вам нужно ввести следующим образом:

/ **
 * @var \ Magento \ Каталог \ Помощник \ Категория
 * /
Защищенный $ categoryHelper;

/ **
 * @var \ Magento \ Каталог \ Модель \ CategoryRepository
 * /
защищенный $ categoryRepository;


публичная функция __construct (
    \ Magento \ Каталог \ Помощник \ Категория $ categoryHelper,
    \ Magento \ Каталог \ Модель \ CategoryRepository $ categoryRepository,

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

Для категории URL

$ categoryId = 3;
$ categoryObj = $ this-> categoryRepository-> get ($ categoryId);
echo $ this-> categoryHelper-> getCategoryUrl ($ categoryObj);
Сохель Рана
источник
Круто, спасибо. Я пытался перебрать идентификаторы с помощью CategoryModel, которая перезагружала одни и те же данные через итерации. Вы спасли меня после нескольких голов царапин!
Домдамброджа
6

Вы можете попробовать ниже код.

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

Перед тем, как использовать идентификатор категории, вы должны подтвердить, что идентификатор категории существует в admin или он возвратит пустой массив.

Дайте знать, если у вас появятся вопросы.

Суреш Чикани
источник
Ага, это именно тот код, который я написал в ОП. Но вы правы, я примерил некоторые удостоверения личности, которые, как я думал, существовали, но не сделали этого.
Алекс Тиммер
1

Я обнаружил, что когда мне нужны URL-адреса категорий из разных доменов (для каждого представления магазина), мне приходилось создавать новый объект Url для каждого представления магазина.

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

Это отлично работает на моем пользовательском блоке (используя репозиторий категорий и 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;

Наконец, в файле шаблона я просто использую:

$this->getCategory(3)->getUrl()
Andrea
источник
0

@andrea Пожалуйста, обновите метод getCategory. Либо это работает хорошо.

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
Бисваджит Пол
источник