Magento 2 Nhận id danh mục bằng cách sử dụng tiêu đề thể loại


11

Tôi muốn nhận id danh mục bằng cách chỉ sử dụng tiêu đề danh mục bằng cách sử dụng loại chức năng này.

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

Ca sử dụng: Nhận id danh mục theo tiêu đề và đưa dữ liệu id vào mảng trong tập lệnh di chuyển.

Câu trả lời:


18

Bạn có thể làm điều đó thông qua các bộ sưu tập:

Trước tiên, bạn cần phải tiêm một CategoryFactorytrong lớp xây dựng của bạn.

Magento 2.0 & 2.1:

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

Sau đó, bất cứ nơi nào khác trong lớp bạn có thể làm:

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

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

Magento 2.2:

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

Sau đó, bất cứ nơi nào khác trong lớp bạn có thể làm:

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

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

Có lỗi PHP Lỗi nghiêm trọng: Gọi đến phương thức không xác định Magento \ Catalog \ Model \ CategoryFactory :: getCollection ()
kilis

1
@kilis xem bản cập nhật của tôi, bạn cần sử dụng DI để tiêm lớp đó;)
Raphael tại Digital Pianism

Đối với trường hợp sử dụng của tôi, tôi cần loại hàm này $ Collection = $ this -> _ objectManager-> tạo ('\ Magento \ Catalog \ Model \ CategoryFactory') -> getCollection () -> addAttributionToFilter ('title', $ categoryTitle) - > setPageSize (1);
kilô

1
@kilis thật tốt khi sử dụng trực tiếp trình quản lý đối tượng, bạn nên luôn luôn sử dụng
phép nội xạ

Vâng, tôi biết. Kịch bản nâng cấp dự án của chúng tôi được thiết kế như sau: /
kilô

4

Điều này có thể được thực hiện bằng cách sử dụng các hợp đồng dịch vụ được coi là thực tiễn tốt nhất.

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 Đối với phần thực hành tốt nhất
Akif

3

Bạn có thể đơn giản làm điều đó bằng cách sử dụng name,

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

Không sử dụng FE, nâng cấp chức năng tập lệnh cần thiết.
kilô

bạn chỉ cần nói tiêu đề, tôi đã cập nhật câu trả lời của tôi.
Rakesh Jesadiya

2

Thử mã dưới đây cho tệp 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

Tôi đã nhận được nó với sự giúp đỡ từ ảnh ghép của tôi

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

:) Vì bộ sưu tập sẽ chỉ trả về bản ghi mà bạn muốn, bạn có thể lấy kết quả duy nhất với ->getFirstItem()mã trên


0

Để cấu trúc lại rằng trong một kịch bản chức năng, tôi đề nghị sử dụng như sau

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

Chỉnh sửa: Tôi đã thực hiện và thử nghiệm một kịch bản. Tôi đã tạo một tệp trong /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; 
}

Đã thử mã của bạn, nhưng đã thay đổi dòng đầu tiên thành $ obj = $ this -> _ objectManager; Có [Magento \ Framework \ Exception \ LocalizedException] Tên thuộc tính không hợp lệ: lỗi tiêu đề
kilis

Khi bạn gặp lỗi đó, bạn đã không sử dụng tập lệnh của tôi.
Kay Int Veen

Tôi chỉ cần thêm một kịch bản thử nghiệm đầy đủ. vui lòng kiểm tra xem Nó sẽ hoạt động chắc chắn!
Kay Int Veen

0

Tôi quản lý để viết phương pháp của riêng tôi (hiệu quả hơn):

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

Mã này lưu trữ tất cả các tiêu đề: id vào một mảng và chỉ truy vấn 2 lần.

Đã làm cho tôi. Dễ sử dụng hơn!


0

Trước tiên, bạn cần tiêm lớp nhà máy thu

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

Sau đó, trong phương thức của bạn, bạn có thể làm điều này,

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

if ($collection->getSize()) {
    $categoryId = $collection->getFirstItem()->getId();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.