Magento 2 รับ id หมวดหมู่โดยใช้ชื่อหมวดหมู่


11

ฉันต้องการรับรหัสประเภทโดยใช้ชื่อหมวดหมู่โดยใช้ฟังก์ชันประเภทนี้เท่านั้น

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

ใช้กรณี: รับรหัสหมวดหมู่ตามชื่อและวางข้อมูลรหัสในอาร์เรย์ในสคริปต์การย้ายข้อมูล

คำตอบ:


18

คุณสามารถทำได้ผ่านคอลเลกชัน:

ก่อนอื่นคุณต้องอัดฉีดCategoryFactoryคลาสคอนสตรัคเตอร์

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

วีโอไอพี 2.2:

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

มีข้อผิดพลาด PHP ข้อผิดพลาดร้ายแรง: การโทรไปยังวิธีที่ไม่ได้กำหนด Magento \ Catalog \ Model \ CategoryFactory :: getCollection ()
kilis

1
@ kilis ดูการอัปเดตของฉันคุณต้องใช้ DI เพื่อฉีดคลาสนั้น)
Raphael ที่ Digital Pianism

สำหรับกรณีการใช้งานของฉันฉันต้องการฟังก์ชัน $ collection = $ this -> _ objectManager-> create ('\ Magento \ Catalog \ Model \ Category \ CategoryFactory') -> getCollection () -> addAttributeToFilter ('title', $ categoryTitle) - > setPageSize (1);
kilis

1
@ kilis เป็นเรื่องที่ดีที่จะใช้ตัวจัดการวัตถุโดยตรงคุณควรใช้การฉีดพึ่งพา
Raphael ที่ Digital Pianism

ใช่ฉันรู้. สคริปต์อัพเกรดโปรเจ็กต์ของเราได้รับการออกแบบเช่นนั้น: /
kilis

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 สำหรับส่วนฝึกซ้อมที่ดีที่สุด
Akif

3

คุณง่ายสามารถทำได้โดยใช้name,

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

ไม่ใช่สำหรับการใช้งาน FE, จำเป็นต้องอัพเกรดฟังก์ชั่นสคริปต์
kilis

คุณเพิ่งจะพูดชื่อฉันได้ปรับปรุงคำตอบของฉัน
Rakesh Jesadiya

2

ลองด้านล่างรหัสสำหรับไฟล์ Phtml:

$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

เพื่อ refactor ว่าในสคริปต์การทำงานฉันขอแนะนำให้ใช้ต่อไปนี้

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

แก้ไข: ฉันสร้างและทดสอบสคริปต์แล้ว ฉันสร้างไฟล์ใน /scripts/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; 
}

ลองใช้รหัสของคุณ แต่เปลี่ยนบรรทัดแรกเป็น $ obj = $ this -> _ objectManager; มี [Magento \ Framework \ Exception \ LocalizedException] ชื่อแอตทริบิวต์ไม่ถูกต้อง: ข้อผิดพลาดชื่อ
kilis

เมื่อคุณพบข้อผิดพลาดคุณไม่ได้ใช้สคริปต์ของฉัน
Kay Int Veen

ฉันเพิ่งเพิ่มสคริปต์ทดสอบอย่างสมบูรณ์ โปรดตรวจสอบว่า มันจะทำงานได้อย่างแน่นอน!
Kay Int Veen

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

รหัสนี้แคชชื่อทั้งหมด: รหัสลงในอาร์เรย์และแบบสอบถามเพียง 2 ครั้ง

ทำงานให้ฉัน ใช้งานง่าย!


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.