I am a new developer of Magento 2.
I got an array of product items from order.
$products = $order->getAllVisibleItems();
However, getAllVisibleItems() get the array of products. I need to convert the array to collection so that I can render it by pager. what should I do ?
1 Answer 1
Check how it's done in the \Magento\Sales\Block\Order\Items::_prepareLayout() method.
You create item collection factory and use it as collection for building pager
/**
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Framework\Registry $registry
* @param array $data
* @param \Magento\Sales\Model\ResourceModel\Order\Item\CollectionFactory|null $itemCollectionFactory
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Framework\Registry $registry,
array $data = [],
\Magento\Sales\Model\ResourceModel\Order\Item\CollectionFactory $itemCollectionFactory = null
) {
$this->_coreRegistry = $registry;
$this->itemCollectionFactory = $itemCollectionFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
->get(\Magento\Sales\Model\ResourceModel\Order\Item\CollectionFactory::class);
parent::__construct($context, $data);
}
/**
* Init pager block and item collection with page size and current page number.
*
* @return $this
*/
protected function _prepareLayout()
{
$this->itemsPerPage = $this->_scopeConfig->getValue('sales/orders/items_per_page');
$this->itemCollection = $this->itemCollectionFactory->create();
$this->itemCollection->setOrderFilter($this->getOrder());
$this->itemCollection->filterByParent(null);
/** @var \Magento\Theme\Block\Html\Pager $pagerBlock */
$pagerBlock = $this->getChildBlock('sales_order_item_pager');
if ($pagerBlock) {
$pagerBlock->setLimit($this->itemsPerPage);
//here pager updates collection parameters
$pagerBlock->setCollection($this->itemCollection);
$pagerBlock->setAvailableLimit([$this->itemsPerPage]);
$pagerBlock->setShowAmounts($this->isPagerDisplayed());
}
return parent::_prepareLayout();
}
answered Sep 29, 2017 at 10:14
Pavel Novitsky
5332 silver badges9 bronze badges
-
This answer’s OP underlying issue, but it doesn’t answer the original question: how to get a collection when one has an array.bfontaine– bfontaine2021年04月01日 09:28:20 +00:00Commented Apr 1, 2021 at 9:28
-
1@bfontaine check
\Magento\Framework\Data\Collection::addItem()method. Just create collection factory, convert array item into the\Magento\Framework\DataObjectand add items to collectionPavel Novitsky– Pavel Novitsky2021年04月02日 06:04:34 +00:00Commented Apr 2, 2021 at 6:04 -
default