Magento 2 카테고리 제목을 사용하여 카테고리 ID 가져 오기


11

이런 종류의 기능을 사용하여 범주 제목 만 사용하여 범주 ID를 얻고 싶습니다.

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

사용 사례 : 제목별로 카테고리 ID를 가져오고 마이그레이션 스크립트에서 ID 데이터를 배열에 넣습니다.

답변:


18

컬렉션을 통해 할 수 있습니다 :

먼저 CategoryFactory클래스 생성자에 a를 주입해야합니다 .

마 젠토 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 at Digital Pianism

내 유스 케이스의 경우 $ collection = $ this-> _ objectManager-> create ( '\ Magento \ Catalog \ Model \ CategoryFactory')-> getCollection ()-> addAttributeToFilter ( 'title', $ categoryTitle)-함수가 필요합니다. > setPageSize (1);
kilis

1
@kilis 잘 개체 관리자를 직접 사용하는 것은 나쁜 습관입니다, 당신은 항상 의존성 주입을 사용해야합니다
Raphael at Digital Pianism

그래 알아 우리의 프로젝트 업그레이드 스크립트는 그렇게 설계 : /
킬리스

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

작동하는 스크립트에서 리팩터링하려면 다음을 사용하는 것이 좋습니다.

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

이 코드는 모든 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.