CollectionProcessor.php 3.6 KB

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