Phương pháp 1 - Sử dụng tiêm phụ thuộc (DI)
Dưới đây là mã ví dụ để lấy danh sách tất cả các danh mục trong Magento 2 bằng cách sử dụng phép nội xạ phụ thuộc.
Để có được thông tin danh mục, chúng ta có thể cần phải tiêm đối tượng \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory
và \Magento\Catalog\Helper\Category
các lớp trong hàm tạo của lớp khối của mô-đun và truy cập nó từ tệp view (.phtml).
app/code/YourCompanyName/YourModuleName/Block/YourCustomBlock.php
<?php
namespace YourCompanyName\YourModuleName\Block;
class YourCustomBlock extends \Magento\Framework\View\Element\Template
{
protected $_categoryCollectionFactory;
protected $_categoryHelper;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,
\Magento\Catalog\Helper\Category $categoryHelper,
array $data = []
) {
$this->_categoryCollectionFactory = $categoryCollectionFactory;
$this->_categoryHelper = $categoryHelper;
parent::__construct($context, $data);
}
public function getCategoryCollection($isActive = true, $level = false, $sortBy = false, $pageSize = false) {
$collection = $this->_categoryCollectionFactory->create();
$collection->addAttributeToSelect('*');
// select only active categories
if ($isActive) {
$collection->addIsActiveFilter();
}
// select categories of certain level
if ($level) {
$collection->addLevelFilter($level);
}
// sort categories by some value
if ($sortBy) {
$collection->addOrderField($sortBy);
}
// set pagination
if ($pageSize) {
$collection->setPageSize($pageSize);
}
return $collection;
}
/**
* Retrieve current store level 2 category
*
* @param bool|string $sorted (if true display collection sorted as name otherwise sorted as based on id asc)
* @param bool $asCollection (if true display all category otherwise display second level category menu visible category for current store)
* @param bool $toLoad
*/
public function getStoreCategories($sorted = false, $asCollection = false, $toLoad = true) {
return $this->_categoryHelper->getStoreCategories($sorted = false, $asCollection = false, $toLoad = true);
}
}
Bây giờ, chúng ta có thể sử dụng các hàm trong tệp view (.phtml) như sau.
// get the list of all categories
$categories = $block->getCategoryCollection();
foreach ($categories as $category) {
echo $category->getId() . '<br />';
echo $category->getName() . '<br />';
}
// get categories sorted by category name
$categories = $block->getCategoryCollection(true, false, 'name', false);
foreach ($categories as $category) {
echo $category->getId() . '<br />';
echo $category->getName() . '<br />';
}
// get current store’s categories
$categories = $block->getStoreCategories();
foreach ($categories as $category) {
echo $category->getId() . '<br />';
echo $category->getName() . '<br />';
}
Phương pháp 2-
Sử dụng Trình quản lý đối tượng
Dưới đây là mã để lấy danh sách tất cả các danh mục trong Magento 2 bằng trình quản lý đối tượng.
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
// get the list of all categories
$categoryCollection = $objectManager->get('\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory');
$categories = $categoryCollection->create();
$categories->addAttributeToSelect('*');
foreach ($categories as $category) {
echo $category->getId() . '<br />';
echo $category->getName() . '<br />';
echo $category->getUrl() . '<br />';
}
// get current store’s categories
$categoryHelper = $objectManager->get('\Magento\Catalog\Helper\Category');
$categories = $categoryHelper->getStoreCategories();
foreach ($categories as $category) {
echo $category->getId() . '<br />';
echo $category->getName() . '<br />';
}