variableDataProvider = $variableDataProvider; } /** * Sort variables array by field. * * @param array $items * @param string $field * @param string $direction * @return array */ private function sortBy($items, $field, $direction) { usort($items, function ($item1, $item2) use ($field, $direction) { return $this->variablesCompare($item1, $item2, $field, $direction); }); return $items; } /** * Compare variables array's elements on index. * * @param array $variable1 * @param array $variable2 * @param string $partIndex * @param string $direction * * @return int */ private function variablesCompare($variable1, $variable2, $partIndex, $direction) { $values = [$variable1[$partIndex], $variable2[$partIndex]]; sort($values, SORT_STRING); return $variable1[$partIndex] === $values[$direction == SortOrder::SORT_ASC ? 0 : 1] ? -1 : 1; } /** * Merge variables from different sources: * custom variables and default (stores configuration variables) * * @return array */ public function getData() { $searchCriteria = $this->getSearchCriteria(); $sortOrders = $searchCriteria->getSortOrders(); $items = array_merge( $this->variableDataProvider->getDefaultVariables(), $this->variableDataProvider->getCustomVariables() ); /** @var \Magento\Framework\Api\SortOrder $sortOrder */ foreach ($sortOrders as $sortOrder) { if ($sortOrder->getField() && $sortOrder->getDirection()) { $items = $this->sortBy($items, $sortOrder->getField(), $sortOrder->getDirection()); } } foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $value = str_replace('%', '', $filter->getValue()); $filterField = $filter->getField(); $items = array_values(array_filter($items, function ($item) use ($value, $filterField) { return strpos(strtolower($item[$filterField]), strtolower($value)) !== false; })); } } return [ 'items' => $items ]; } }