_entityFactory = $entityFactory; } /** * Add collection filter * * @param string $field * @param string $value * @param string $type and|or|string * @return $this */ public function addFilter($field, $value, $type = 'and') { $filter = new \Magento\Framework\DataObject(); // implements ArrayAccess $filter['field'] = $field; $filter['value'] = $value; $filter['type'] = strtolower($type); $this->_filters[] = $filter; $this->_isFiltersRendered = false; return $this; } /** * Add field filter to collection * * If $condition integer or string - exact value will be filtered ('eq' condition) * * If $condition is array - one of the following structures is expected: *
* - ["from" => $fromValue, "to" => $toValue] * - ["eq" => $equalValue] * - ["neq" => $notEqualValue] * - ["like" => $likeValue] * - ["in" => [$inValues]] * - ["nin" => [$notInValues]] * - ["notnull" => $valueIsNotNull] * - ["null" => $valueIsNull] * - ["moreq" => $moreOrEqualValue] * - ["gt" => $greaterValue] * - ["lt" => $lessValue] * - ["gteq" => $greaterOrEqualValue] * - ["lteq" => $lessOrEqualValue] * - ["finset" => $valueInSet] ** * If non matched - sequential parallel arrays are expected and OR conditions * will be built using above mentioned structure. * * Example: *
* $field = ['age', 'name']; * $condition = [42, ['like' => 'Mage']]; ** The above would find where age equal to 42 OR name like %Mage%. * * @param string|array $field * @param string|int|array $condition * @throws \Magento\Framework\Exception\LocalizedException if some error in the input could be detected. * @return $this * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function addFieldToFilter($field, $condition) { throw new \Magento\Framework\Exception\LocalizedException(new \Magento\Framework\Phrase('Not implemented')); } /** * Search for a filter by specified field * * Multiple filters can be matched if an array is specified: * - 'foo' -- get the first filter with field name 'foo' * - array('foo') -- get all filters with field name 'foo' * - array('foo', 'bar') -- get all filters with field name 'foo' or 'bar' * - array() -- get all filters * * @param string|string[] $field * @return \Magento\Framework\DataObject|\Magento\Framework\DataObject[]|void */ public function getFilter($field) { if (is_array($field)) { // empty array: get all filters if (empty($field)) { return $this->_filters; } // non-empty array: collect all filters that match specified field names $result = []; foreach ($this->_filters as $filter) { if (in_array($filter['field'], $field)) { $result[] = $filter; } } return $result; } // get a first filter by specified name foreach ($this->_filters as $filter) { if ($filter['field'] === $field) { return $filter; } } } /** * Retrieve collection loading status * * @return bool */ public function isLoaded() { return $this->_isCollectionLoaded; } /** * Set collection loading status flag * * @param bool $flag * @return $this */ protected function _setIsLoaded($flag = true) { $this->_isCollectionLoaded = $flag; return $this; } /** * Get current collection page * * @param int $displacement * @return int */ public function getCurPage($displacement = 0) { if ($this->_curPage + $displacement < 1) { return 1; } elseif ($this->_curPage + $displacement > $this->getLastPageNumber()) { return $this->getLastPageNumber(); } else { return $this->_curPage + $displacement; } } /** * Retrieve collection last page number * * @return int */ public function getLastPageNumber() { $collectionSize = (int)$this->getSize(); if (0 === $collectionSize) { return 1; } elseif ($this->_pageSize) { return ceil($collectionSize / $this->_pageSize); } else { return 1; } } /** * Retrieve collection page size * * @return int */ public function getPageSize() { return $this->_pageSize; } /** * Retrieve collection all items count * * @return int */ public function getSize() { $this->load(); if ($this->_totalRecords === null) { $this->_totalRecords = count($this->getItems()); } return (int)$this->_totalRecords; } /** * Retrieve collection first item * * @return \Magento\Framework\DataObject */ public function getFirstItem() { $this->load(); if (count($this->_items)) { reset($this->_items); return current($this->_items); } return $this->_entityFactory->create($this->_itemObjectClass); } /** * Retrieve collection last item * * @return \Magento\Framework\DataObject */ public function getLastItem() { $this->load(); if (count($this->_items)) { return end($this->_items); } return $this->_entityFactory->create($this->_itemObjectClass); } /** * Retrieve collection items * * @return \Magento\Framework\DataObject[] */ public function getItems() { $this->load(); return $this->_items; } /** * Retrieve field values from all items * * @param string $colName * @return array */ public function getColumnValues($colName) { $this->load(); $col = []; foreach ($this->getItems() as $item) { $col[] = $item->getData($colName); } return $col; } /** * Search all items by field value * * @param string $column * @param mixed $value * @return array */ public function getItemsByColumnValue($column, $value) { $this->load(); $res = []; foreach ($this as $item) { if ($item->getData($column) == $value) { $res[] = $item; } } return $res; } /** * Search first item by field value * * @param string $column * @param mixed $value * @return \Magento\Framework\DataObject || null */ public function getItemByColumnValue($column, $value) { $this->load(); foreach ($this as $item) { if ($item->getData($column) == $value) { return $item; } } return null; } /** * Adding item to item array * * @param \Magento\Framework\DataObject $item * @return $this * @throws \Exception */ public function addItem(\Magento\Framework\DataObject $item) { $itemId = $this->_getItemId($item); if ($itemId !== null) { if (isset($this->_items[$itemId])) { throw new \Exception( 'Item (' . get_class($item) . ') with the same ID "' . $item->getId() . '" already exists.' ); } $this->_items[$itemId] = $item; } else { $this->_addItem($item); } return $this; } /** * Add item that has no id to collection * * @param \Magento\Framework\DataObject $item * @return $this */ protected function _addItem($item) { $this->_items[] = $item; return $this; } /** * Retrieve item id * * @param \Magento\Framework\DataObject $item * @return mixed */ protected function _getItemId(\Magento\Framework\DataObject $item) { return $item->getId(); } /** * Retrieve ids of all items * * @return array */ public function getAllIds() { $ids = []; foreach ($this->getItems() as $item) { $ids[] = $this->_getItemId($item); } return $ids; } /** * Remove item from collection by item key * * @param mixed $key * @return $this */ public function removeItemByKey($key) { if (isset($this->_items[$key])) { unset($this->_items[$key]); } return $this; } /** * Remove all items from collection * * @return $this */ public function removeAllItems() { $this->_items = []; return $this; } /** * Clear collection * * @return $this */ public function clear() { $this->_setIsLoaded(false); $this->_items = []; return $this; } /** * Walk through the collection and run model method or external callback with optional arguments * * Returns array with results of callback for each item * * @param callable $callback * @param array $args * @return array */ public function walk($callback, array $args = []) { $results = []; $useItemCallback = is_string($callback) && strpos($callback, '::') === false; foreach ($this->getItems() as $id => $item) { $params = $args; if ($useItemCallback) { $cb = [$item, $callback]; } else { $cb = $callback; array_unshift($params, $item); } $results[$id] = call_user_func_array($cb, $params); } return $results; } /** * Call method or callback on each item in the collection. * * @param string|array|\Closure $objMethod * @param array $args * @return void */ public function each($objMethod, $args = []) { if ($objMethod instanceof \Closure) { foreach ($this->getItems() as $item) { $objMethod($item, ...$args); } } elseif (is_array($objMethod)) { foreach ($this->getItems() as $item) { call_user_func($objMethod, $item, ...$args); } } else { foreach ($this->getItems() as $item) { $item->$objMethod(...$args); } } } /** * Setting data for all collection items * * @param mixed $key * @param mixed $value * @return $this */ public function setDataToAll($key, $value = null) { if (is_array($key)) { foreach ($key as $k => $v) { $this->setDataToAll($k, $v); } return $this; } foreach ($this->getItems() as $item) { $item->setData($key, $value); } return $this; } /** * Set current page * * @param int $page * @return $this */ public function setCurPage($page) { $this->_curPage = $page; return $this; } /** * Set collection page size * * @param int $size * @return $this */ public function setPageSize($size) { $this->_pageSize = $size; return $this; } /** * Set select order * * @param string $field * @param string $direction * @return $this */ public function setOrder($field, $direction = self::SORT_ORDER_DESC) { $this->_orders[$field] = $direction; return $this; } /** * Set collection item class name * * @param string $className * @return $this * @throws \InvalidArgumentException */ public function setItemObjectClass($className) { if (!is_a($className, \Magento\Framework\DataObject::class, true)) { throw new \InvalidArgumentException($className . ' does not extend \Magento\Framework\DataObject'); } $this->_itemObjectClass = $className; return $this; } /** * Retrieve collection empty item * * @return \Magento\Framework\DataObject */ public function getNewEmptyItem() { return $this->_entityFactory->create($this->_itemObjectClass); } /** * Render sql select conditions * * @return $this */ protected function _renderFilters() { return $this; } /** * Render sql select orders * * @return $this */ protected function _renderOrders() { return $this; } /** * Render sql select limit * * @return $this */ protected function _renderLimit() { return $this; } /** * Set select distinct * * @param bool $flag * @return $this * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function distinct($flag) { return $this; } /** * Load data * * @param bool $printQuery * @param bool $logQuery * @return $this * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function loadData($printQuery = false, $logQuery = false) { return $this; } /** * Load data * * @param bool $printQuery * @param bool $logQuery * @return $this */ public function load($printQuery = false, $logQuery = false) { return $this->loadData($printQuery, $logQuery); } /** * Load data with filter in place * * @param bool $printQuery * @param bool $logQuery * @return $this */ public function loadWithFilter($printQuery = false, $logQuery = false) { return $this->loadData($printQuery, $logQuery); } /** * Convert collection to XML * * @return string */ public function toXml() { $xml = '