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.