1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
/**
* @copyright Vertex. All rights reserved. https://www.vertexinc.com/
* @author Mediotype https://www.mediotype.com/
*/
namespace Vertex\Tax\Model;
use Magento\Framework\Api\Search\FilterGroup;
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
use Magento\Framework\Api\SearchCriteriaInterface;
use Magento\Framework\Api\SortOrder;
use Magento\Framework\Data\Collection;
use Magento\Framework\Data\Collection\AbstractDb;
use Magento\Framework\ObjectManagerInterface;
/**
* Provides backwards compatibility for Magento's Collection Processor, to ease implementation of our Repositorys'
* getList methods
*/
class CollectionProcessor
{
/** @var ObjectManagerInterface */
private $objectManager;
/**
* @param ObjectManagerInterface $objectManager
*/
public function __construct(ObjectManagerInterface $objectManager)
{
$this->objectManager = $objectManager;
}
/**
* Perform the requirements of a Search Criteria against a collection
*
* Use instead {@see CollectionProcessorInterface::process()} if available
*
* @param SearchCriteriaInterface $searchCriteria
* @param AbstractDb $collection
* @return self
*/
public function process(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
{
if (\class_exists(CollectionProcessorInterface::class)) {
// We support a lower version than the introduction of CollectionProcessorInterface
// Object Manager necessary for feature detection
$collectionProcessor = $this->objectManager->get(CollectionProcessorInterface::class);
return $collectionProcessor->process($searchCriteria, $collection);
}
$this->processFilters($searchCriteria, $collection);
$this->processSort($searchCriteria, $collection);
return $this;
}
/**
* Perform SearchCriteria's filters against the collection
*
* @param SearchCriteriaInterface $searchCriteria
* @param AbstractDb $collection
*/
private function processFilters(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
{
foreach ($searchCriteria->getFilterGroups() as $group) {
$this->addFilterGroupToCollection($group, $collection);
}
}
/**
* Add a Filter Group to a collection
*
* @param FilterGroup $group
* @param AbstractDb $collection
*/
private function addFilterGroupToCollection(FilterGroup $group, AbstractDb $collection)
{
$fields = [];
$conditions = [];
foreach ($group->getFilters() as $filter) {
$condition = $filter->getConditionType() ?: 'eq';
$fields[] = $filter->getField();
$conditions[] = [$condition => $filter->getValue()];
}
if ($fields) {
$collection->addFieldToFilter($fields, $conditions);
}
}
/**
* Perform the SearchCriteria's sort against the collection
*
* @param SearchCriteriaInterface $searchCriteria
* @param AbstractDb $collection
*/
private function processSort(SearchCriteriaInterface $searchCriteria, AbstractDb $collection)
{
if (empty($searchCriteria->getSortOrders())) {
return;
}
foreach ($searchCriteria->getSortOrders() as $sortOrder) {
$field = $sortOrder->getField();
$order = $sortOrder->getDirection() === SortOrder::SORT_ASC
? Collection::SORT_ORDER_ASC
: Collection::SORT_ORDER_DESC;
$collection->addOrder($field, $order);
}
}
}