ฉันต้องการรับรหัสประเภทโดยใช้ชื่อหมวดหมู่โดยใช้ฟังก์ชันประเภทนี้เท่านั้น
->load($categoryTitle, 'title')
->getId();
ใช้กรณี: รับรหัสหมวดหมู่ตามชื่อและวางข้อมูลรหัสในอาร์เรย์ในสคริปต์การย้ายข้อมูล
ฉันต้องการรับรหัสประเภทโดยใช้ชื่อหมวดหมู่โดยใช้ฟังก์ชันประเภทนี้เท่านั้น
->load($categoryTitle, 'title')
->getId();
ใช้กรณี: รับรหัสหมวดหมู่ตามชื่อและวางข้อมูลรหัสในอาร์เรย์ในสคริปต์การย้ายข้อมูล
คำตอบ:
คุณสามารถทำได้ผ่านคอลเลกชัน:
ก่อนอื่นคุณต้องอัดฉีด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();
}
ซึ่งสามารถทำได้โดยใช้สัญญาบริการซึ่งถือว่าเป็นแนวปฏิบัติที่ดีที่สุด
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;
}
คุณง่ายสามารถทำได้โดยใช้name
,
$title = 'womens';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$collection = $_categoryFactory->create()->getCollection()->addFieldToFilter('name',$title);
echo "<pre>";
print_r($collection->getData());
exit;
ลองด้านล่างรหัสสำหรับไฟล์ 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();
}
ฉันได้รับความช่วยเหลือจากการจับแพะชนแกะ
$this->_objectManager->get('Magento\Catalog\Model\CategoryFactory')->create()->getCollection()
->addFieldToSelect('name')
->addFieldToFilter('name', ['in' => $categoryTitle]);
:) เนื่องจากชุดสะสมจะส่งคืนเฉพาะระเบียนที่คุณต้องการคุณสามารถคว้าผลลัพธ์เดียวที่มี->getFirstItem()
ในรหัสด้านบน
เพื่อ 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;
}
ฉันจัดการเพื่อเขียนวิธี (มีประสิทธิภาพมากขึ้น) ของตัวเอง:
$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 ครั้ง
ทำงานให้ฉัน ใช้งานง่าย!
ก่อนอื่นคุณต้องฉีดคลาสคอลเลกชันจากโรงงาน
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();
}