VariablesDataProvider.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Variable\Ui\Component;
  7. use Magento\Framework\Api\FilterBuilder;
  8. use Magento\Framework\Api\Search\ReportingInterface;
  9. use Magento\Framework\Api\Search\SearchCriteriaBuilder;
  10. use Magento\Framework\Api\SortOrder;
  11. use Magento\Framework\App\RequestInterface;
  12. /**
  13. * Data provider for variables_modal listing
  14. */
  15. class VariablesDataProvider extends \Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider
  16. {
  17. /**
  18. * @var \Magento\Variable\Model\Variable\Data
  19. */
  20. private $variableDataProvider;
  21. /**
  22. * @param string $name
  23. * @param string $primaryFieldName
  24. * @param string $requestFieldName
  25. * @param ReportingInterface $reporting
  26. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  27. * @param RequestInterface $request
  28. * @param FilterBuilder $filterBuilder
  29. * @param \Magento\Variable\Model\Variable\Data $variableDataProvider
  30. * @param array $meta
  31. * @param array $data
  32. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  33. */
  34. public function __construct(
  35. $name,
  36. $primaryFieldName,
  37. $requestFieldName,
  38. ReportingInterface $reporting,
  39. SearchCriteriaBuilder $searchCriteriaBuilder,
  40. RequestInterface $request,
  41. FilterBuilder $filterBuilder,
  42. \Magento\Variable\Model\Variable\Data $variableDataProvider,
  43. array $meta = [],
  44. array $data = []
  45. ) {
  46. parent::__construct(
  47. $name,
  48. $primaryFieldName,
  49. $requestFieldName,
  50. $reporting,
  51. $searchCriteriaBuilder,
  52. $request,
  53. $filterBuilder,
  54. $meta,
  55. $data
  56. );
  57. $this->variableDataProvider = $variableDataProvider;
  58. }
  59. /**
  60. * Sort variables array by field.
  61. *
  62. * @param array $items
  63. * @param string $field
  64. * @param string $direction
  65. * @return array
  66. */
  67. private function sortBy($items, $field, $direction)
  68. {
  69. usort($items, function ($item1, $item2) use ($field, $direction) {
  70. return $this->variablesCompare($item1, $item2, $field, $direction);
  71. });
  72. return $items;
  73. }
  74. /**
  75. * Compare variables array's elements on index.
  76. *
  77. * @param array $variable1
  78. * @param array $variable2
  79. * @param string $partIndex
  80. * @param string $direction
  81. *
  82. * @return int
  83. */
  84. private function variablesCompare($variable1, $variable2, $partIndex, $direction)
  85. {
  86. $values = [$variable1[$partIndex], $variable2[$partIndex]];
  87. sort($values, SORT_STRING);
  88. return $variable1[$partIndex] === $values[$direction == SortOrder::SORT_ASC ? 0 : 1] ? -1 : 1;
  89. }
  90. /**
  91. * Merge variables from different sources:
  92. * custom variables and default (stores configuration variables)
  93. *
  94. * @return array
  95. */
  96. public function getData()
  97. {
  98. $searchCriteria = $this->getSearchCriteria();
  99. $sortOrders = $searchCriteria->getSortOrders();
  100. $items = array_merge(
  101. $this->variableDataProvider->getDefaultVariables(),
  102. $this->variableDataProvider->getCustomVariables()
  103. );
  104. /** @var \Magento\Framework\Api\SortOrder $sortOrder */
  105. foreach ($sortOrders as $sortOrder) {
  106. if ($sortOrder->getField() && $sortOrder->getDirection()) {
  107. $items = $this->sortBy($items, $sortOrder->getField(), $sortOrder->getDirection());
  108. }
  109. }
  110. foreach ($searchCriteria->getFilterGroups() as $filterGroup) {
  111. foreach ($filterGroup->getFilters() as $filter) {
  112. $value = str_replace('%', '', $filter->getValue());
  113. $filterField = $filter->getField();
  114. $items = array_values(array_filter($items, function ($item) use ($value, $filterField) {
  115. return strpos(strtolower($item[$filterField]), strtolower($value)) !== false;
  116. }));
  117. }
  118. }
  119. return [
  120. 'items' => $items
  121. ];
  122. }
  123. }