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

और यह काम करता है (प्रिंट_र में URL कुंजी है जो मुझे चाहिए), लेकिन श्रेणी # 3 शीर्ष-स्तरीय श्रेणी है। जब भी मैं किसी उपश्रेणी का प्रयास करता हूं (आईडी 5 कहता हूं) मुझे एक खाली सरणी मिलती है। मैं सिर्फ शब्दों के लिए खो गया हूं, यह पता नहीं लगा सकता।

Magento 1.x में मैं यह करता था: Mage::getModel('catalog/category')->load($catID)->getUrl()और वह काम करता था।

टी एल; डॉ: इस कोड, काम करता है एक (सही) श्रेणी आईडी और परिवर्तन करने के लिए आईडी बदलने getData()के लिए getUrl()पूरा श्रेणी यूआरएल के लिए, या getName()के लिए श्रेणी के नाम पर।

जवाबों:


29

श्रेणी url प्राप्त करने के लिए आपको \Magento\Catalog\Model\Categoryफ़ंक्शन का उपयोग करने की आवश्यकता है getUrl()जैसे:

$category->getUrl()

इसके अलावा, आप यूआरएल प्राप्त कर सकते हैं 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 को getData बदलना सही कॉल था।
एलेक्स टिमर

ठीक काम करते हुए, अप ने आपको वोट दिया
पुष्पेंद्र सिंह

अच्छा जवाब, बहुत मददगार। +1
शोएब मुनीर

12

हमेशा रिपॉजिटरी का उपयोग करने का प्रयास करें। आपको निम्नलिखित तरीके से इंजेक्ट करने की आवश्यकता है:

/ **
 * @var \ Magento \ कैटलॉग \ हेल्पर \ श्रेणी
 * /
संरक्षित $ श्रेणीहेल्पर;

/ **
 * @var \ Magento \ कैटालॉग \ मॉडल \ श्रेणी
 * /
संरक्षित $ श्रेणीरिपोसिटरी;


सार्वजनिक समारोह __construct (
    \ Magento \ Catalog \ Helper \ श्रेणी $ श्रेणी श्रेणी,
    \ Magento \ कैटलॉग \ मॉडल \ श्रेणीप्रमाणात्मक $ श्रेणीप्रतिस्पर्धी,

) {
    $ यह-> श्रेणी हेल्पर = $ श्रेणी हेल्पर;
    $ यह-> श्रेणीप्रतिश्रेणी = $ श्रेणीप्रतिपादिक;
}

श्रेणी url के लिए

$ श्रेणी = 3;
$ categoryObj = $ this-> categoryRepository-> get ($ categoryId);
गूंज $ यह-> श्रेणीहेल्पर-> getCategoryUrl ($ categoryObj);

बहुत बढ़िया धन्यवाद। मैं कैटेलोडेल के साथ आईडी के माध्यम से लूप का प्रयास कर रहा था जो पुनरावृत्तियों के माध्यम से उसी डेटा को पुनः लोड कर रहा था। तुम मुझे सिर खुजाने के एक झुंड के बाद बचा लिया!
डोमडम्ब्रोगिया

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

श्रेणी आईडी का उपयोग करने से पहले आप पुष्टि करते हैं कि श्रेणी आईडी व्यवस्थापक में मौजूद है या यह एक खाली सरणी लौटाएगा।

अगर आपका कोई प्रश्न हैं, तो मुझे से पूछें।


उह हाँ, यह सटीक कोड मैंने ओपी में लिखा है। लेकिन आप सही हैं, मैंने कुछ आईडी पर कोशिश की, जो मुझे लगा कि अस्तित्व में है, लेकिन नहीं।
एलेक्स टिमर

1

मैंने पाया कि जब मुझे विभिन्न डोमेन (प्रति स्टोर दृश्य) से श्रेणी के यूआरएल की आवश्यकता होती है, तो मुझे प्रति स्टोर दृश्य में एक नया यूआरएल ऑब्जेक्ट बनाना था।

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

0

@andrea कृपया getCategory पद्धति को अपडेट करें। या तो यह अच्छी तरह से काम करता है।

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.