Magento 2 বিভাগের শিরোনাম ব্যবহার করে বিভাগ আইডি পান


11

আমি এই জাতীয় ফাংশনটি ব্যবহার করে কেবল বিভাগের শিরোনাম ব্যবহার করে বিভাগ আইডি পেতে চাই।

->load($categoryTitle, 'title')
->getId();

কেস ব্যবহার করুন: শিরোনাম অনুসারে বিভাগ আইডি পান এবং আইডি ডেটা মাইগ্রেশন স্ক্রিপ্টে অ্যারে রাখতে পারেন।

উত্তর:


18

আপনি সংগ্রহের মাধ্যমে এটি করতে পারেন:

প্রথমে আপনাকে CategoryFactoryআপনার ক্লাস কনস্ট্রাক্টর ইনজেক্ট করতে হবে ।

ম্যাজেন্টো 2.0 এবং 2.1:

public function __construct(
    ...
    \Magento\Catalog\Model\CategoryFactory $categoryFactory
) {
    $this->_categoryFactory = $categoryFactory;
    parent::__construct(...);
}

তারপরে আপনার ক্লাসের অন্য যে কোনও জায়গায় আপনি এটি করতে পারেন:

$collection = $this->_categoryFactory->create()->getCollection()->addAttributeToFilter('name',$categoryTitle)->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}

ম্যাজেন্টো ২.২:

public function __construct(
    ...
    \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $collecionFactory
) {
    $this->_collectionFactory = $collecionFactory;
    parent::__construct(...);
}

তারপরে আপনার ক্লাসের অন্য যে কোনও জায়গায় আপনি এটি করতে পারেন:

$collection = $this->collecionFactory
                ->create()
                ->addAttributeToFilter('name',$categoryTitle)
                ->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}

একটি ত্রুটি পেয়েছে পিএইচপি মারাত্মক ত্রুটি: অপরিজ্ঞাত পদ্ধতিতে কল করুন ম্যাজেন্টো \ ক্যাটালগ \ মডেল \ ক্যাটাগরি ফ্যাক্টরি :: গ্যালকোলকশন ()
কিলিস

1
@ কিলিস আমার আপডেট দেখুন, আপনাকে সেই ডিগ্রীটি ইনজেক্ট করতে ডিআই ব্যবহার করতে হবে;)
রাফেল ডিজিটাল পিয়ানিজমে

আমার ব্যবহারের ক্ষেত্রে আমার এই ধরণের ক্রিয়াকলাপটি প্রয়োজন $ সংগ্রহ = $ এটি -> _ অবজেক্টম্যানেজার-> তৈরি করুন ('\ ম্যাজেন্টো \ ক্যাটালগ \ মডেল \ বিভাগফ্যাক্টরী') -> গ্যালকোলেকশন () -> অ্যাডঅ্যাট্রিবিউটটো ফিল্টার ('শিরোনাম', $ বিভাগশালা) - > setPageSize (1);
কিলিস

1
@ কিলিস ভালভাবে অবজেক্ট ম্যানেজারকে সরাসরি ব্যবহার করা খারাপ অভ্যাস, আপনার সর্বদা নির্ভরতা ইনজেকশন ব্যবহার করা উচিত
ডিজিটাল পিয়ানিজমে রাফেল

হ্যাঁ আমি জানি. আমাদের প্রকল্পের আপগ্রেড স্ক্রিপ্টটি এমনভাবে ডিজাইন করা হয়েছে: /
কিলিস

4

এটি সর্বোত্তম অনুশীলন হিসাবে বিবেচিত সেবার চুক্তি ব্যবহার করে করা যেতে পারে।

protected $categoryList;

    /**
     * @var SearchCriteriaBuilder
     */
    protected $searchCriteriaBuilder;

    /**
     * @var FilterBuilder
     */
    protected $filterBuilder;

public function __construct(
        ------------
        CategoryListInterface $categoryList,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        FilterBuilder $filterBuilder,
        -----------------
    )
    {
        $this->categoryList = $categoryList;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->filterBuilder         = $filterBuilder;
        parent::__construct(----------);
    }

public function getNameCategory()
    {
        $enableFilter[] = $this->filterBuilder
            ->setField(\Magento\Catalog\Model\Category::KEY_NAME)
            ->setConditionType('like')
            ->setValue(self::CATEGORY_NAME_HELP) // name of the categroy on const
            ->create();


        $searchCriteria = $this->searchCriteriaBuilder
            ->addFilters($enableFilter)
            ->create();

        $items = $this->categoryList->getList($searchCriteria)->getItems();

        if(count($items) == 0)
        {
            return FALSE;
        }

        foreach ($items as $helpCategory)
        {
            $CategoryId = $helpCategory->getId()
        }
return $CategoryId;
    }

সেরা অনুশীলনের অংশের জন্য +1
আকিফ

3

আপনি এটি ব্যবহার করে সহজ করতে পারেন name,

$title = 'womens';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$collection = $_categoryFactory->create()->getCollection()->addFieldToFilter('name',$title);
echo "<pre>";
print_r($collection->getData());
exit;

এফই ব্যবহারের জন্য নয়, স্ক্রিপ্ট কার্যকারিতা আপগ্রেড করার প্রয়োজন।
কিলিস

আপনি শুধু শিরোনাম বলেছেন, আমি আমার উত্তর আপডেট করেছি।
রাকেশ জেসাদিয়া

2

পিএইচটিএমএল ফাইলের জন্য নীচের কোডটি চেষ্টা করুন:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$_categoryFactory = $objectManager->get('Magento\Catalog\Model\CategoryFactory');

$categoryTitle = 'Outdoor'; // Category Name

$collection = $_categoryFactory->create()->getCollection()->addFieldToFilter('name', ['in' => $categoryTitle]);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}

1

আমি আমার কোলাজ এর সাহায্যে এটি পেয়েছি

$this->_objectManager->get('Magento\Catalog\Model\CategoryFactory')->create()->getCollection()
        ->addFieldToSelect('name')
        ->addFieldToFilter('name', ['in' => $categoryTitle]);

:) যেহেতু সংগ্রহটি কেবলমাত্র রেকর্ডটি ফিরিয়ে দেবে আপনি চাইছেন ->getFirstItem()উপরের কোডের মাধ্যমে আপনি কেবলমাত্র ফলাফলটি পেতে পারেন


0

রিফ্যাক্টরের জন্য যে কোনও কার্যকারী স্ক্রিপ্টে আমি নিম্নলিখিতটি ব্যবহার করার পরামর্শ দিচ্ছি

$obj = $bootstrap->getObjectManager();
$_categoryFactory = $obj->get('Magento\Catalog\Model\CategoryFactory');
$collection = $_categoryFactory->create()->getCollection()->addAttributeToFilter('title',$categoryTitle)->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getCategoryId();
}

সম্পাদনা: আমি একটি স্ক্রিপ্ট তৈরি করে পরীক্ষা করেছি। আমি /scriptts/file.php এ একটি ফাইল তৈরি করেছি

<?php
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);

$obj = $bootstrap->getObjectManager();

// Set the state (not sure if this is neccessary)
$obj = $bootstrap->getObjectManager();
$_categoryFactory = $obj->get('Magento\Catalog\Model\CategoryFactory');
$categoryTitle = 'Test';
$collection = $_categoryFactory->create()->getCollection()->addAttributeToFilter('name',$categoryTitle)->setPageSize(1);
if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
    echo $categoryId; 
}

আপনার কোড ব্যবহার করে চেষ্টা করেছেন, তবে প্রথম লাইনটি $জেজ = $ এটি -> _ অবজেক্ট ম্যানেজারে পরিবর্তন করেছেন; একটি পেয়েছেন [ম্যাজেন্টো
me ফ্রেমওয়ার্ক ception

আপনি যখন ত্রুটি পেয়েছেন তখন আপনি আমার স্ক্রিপ্টটি ব্যবহার করেননি।
কে ইন্ট ভীন

আমি সবেমাত্র একটি সম্পূর্ণ পরীক্ষিত স্ক্রিপ্ট যুক্ত করেছি। দয়া করে এটি পরীক্ষা করুন। এটা নিশ্চিতভাবে কাজ করবে!
কে ইন্ট ভীন

0

আমি আমার নিজের (আরও দক্ষ) পদ্ধতি লিখতে সক্ষম হয়েছি:

$entityTypeId = \Magento\Catalog\Setup\CategorySetup::CATEGORY_ENTITY_TYPE_ID;
$row = $this->queryF("SELECT * FROM `eav_attribute` WHERE `entity_type_id` = $entityTypeId AND `attribute_code` = 'name'", 1);
$nameAttributeId = $row['attribute_id'];
$categoryNames = $this->queryF("SELECT * FROM `catalog_category_entity_varchar` WHERE `attribute_id` = '$nameAttributeId'");
$this->categoryNameIdMap = [];
foreach ($categoryNames as $item) {
    $id = $item['entity_id'];
    $title = $item['value'];
    $this->categoryNameIdMap[$title] = $id;
}

এই কোডটি সমস্ত শিরোনামকে ক্যাশে করে: একটি অ্যারেতে আইডিস, এবং কেবল ২ বার জিজ্ঞাসা করে।

আমার জন্য কাজ করেছেন। ব্যবহার করা সহজ!


0

প্রথমত, আপনাকে সংগ্রহ কারখানার ক্লাসটি ইনজেক্ট করতে হবে

public function __construct(
    ...
    \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $collecionFactory ) {
    $this->_collectionFactory = $collecionFactory;
    parent::__construct(...); }

আপনার পদ্ধতির অভ্যন্তরের পরে, আপনি এটি করতে পারেন,

$categoryTitle = 'Men';
$collection = $this->_categoryCollectionFactory->create()->addAttributeToFilter('name',$categoryTitle)->setPageSize(1);

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.