Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
AbstractServiceCollection.php
Go to the documentation of this file.
1 <?php
7 namespace Magento\Framework\Api;
8 
11 
16 {
31  protected $fieldFilters = [];
32 
36  protected $filterBuilder;
37 
42 
46  protected $sortOrderBuilder;
47 
54  public function __construct(
55  EntityFactoryInterface $entityFactory,
59  ) {
60  parent::__construct($entityFactory);
61  $this->filterBuilder = $filterBuilder;
62  $this->searchCriteriaBuilder = $searchCriteriaBuilder;
63  $this->sortOrderBuilder = $sortOrderBuilder;
64  }
65 
110  public function addFieldToFilter($field, $condition)
111  {
112  if (is_array($field) && is_array($condition) && count($field) != count($condition)) {
113  throw new LocalizedException(
114  new \Magento\Framework\Phrase(
115  'The field array failed to pass. The array must have a matching condition array.'
116  )
117  );
118  } elseif (is_array($field) && !count($field) > 0) {
119  throw new LocalizedException(
120  new \Magento\Framework\Phrase(
121  'The array of fields failed to pass. The array must include at one field.'
122  )
123  );
124  }
125  $this->processFilters($field, $condition);
126  return $this;
127  }
128 
135  private function processFilters($field, $condition)
136  {
137  //test if we have multiple conditions per field
138  $requiresMultipleFilterGroups = false;
139  if (is_array($field) && is_array($condition)) {
140  foreach ($condition as $cond) {
141  if (is_array($cond) && count($cond) > 1) {
142  $requiresMultipleFilterGroups = true;
143  break;
144  }
145  }
146  } elseif (is_array($condition)) {
147  $requiresMultipleFilterGroups = true;
148  }
149 
150  if ($requiresMultipleFilterGroups) {
151  $this->addFilterGroupsForMultipleConditions($field, $condition);
152  } else {
153  $this->addFilterGroupsForSingleConditions($field, $condition);
154  }
155  return $this;
156  }
157 
164  private function addFilterGroupsForSingleConditions($field, $condition)
165  {
166  $this->fieldFilters[] = ['field' => $field, 'condition' => $condition];
167  return $this;
168  }
169 
176  private function addFilterGroupsForMultipleConditions($field, $condition)
177  {
178  if (!is_array($field) && is_array($condition)) {
179  foreach ($condition as $key => $value) {
180  $this->fieldFilters[] = ['field' => $field, 'condition' => [$key => $value]];
181  }
182  } else {
183  $cnt = 0;
184  foreach ($condition as $cond) {
185  if (is_array($cond)) {
186  //we Do want multiple groups in this case
187  foreach ($cond as $condKey => $condValue) {
188  $this->fieldFilters[] = [
189  'field' => array_slice($field, $cnt, 1, true),
190  'condition' => [$condKey => $condValue]
191  ];
192  }
193  } else {
194  $this->fieldFilters[] = ['field' => array_slice($field, $cnt, 1, true), 'condition' => $cond];
195  }
196  $cnt++;
197  }
198  }
199  return $this;
200  }
201 
207  protected function getSearchCriteria()
208  {
209  foreach ($this->fieldFilters as $filter) {
210  // array of fields, put filters in array to use 'or' group
212  $filterGroup = [];
213  if (!is_array($filter['field'])) {
214  // just one field
215  $filterGroup = [$this->createFilterData($filter['field'], $filter['condition'])];
216  } else {
217  foreach ($filter['field'] as $index => $field) {
218  $filterGroup[] = $this->createFilterData($field, $filter['condition'][$index]);
219  }
220  }
221  $this->searchCriteriaBuilder->addFilters($filterGroup);
222  }
223  foreach ($this->_orders as $field => $direction) {
226  $direction = ($direction == 'ASC') ? SortOrder::SORT_ASC : SortOrder::SORT_DESC;
227  $sortOrder = $this->sortOrderBuilder->setField($field)->setDirection($direction)->create();
228  $this->searchCriteriaBuilder->addSortOrder($sortOrder);
229  }
230  $this->searchCriteriaBuilder->setCurrentPage($this->_curPage);
231  $this->searchCriteriaBuilder->setPageSize($this->_pageSize);
232  return $this->searchCriteriaBuilder->create();
233  }
234 
242  protected function createFilterData($field, $condition)
243  {
244  $this->filterBuilder->setField($field);
245 
246  if (is_array($condition)) {
247  $this->filterBuilder->setValue(reset($condition));
248  $this->filterBuilder->setConditionType(key($condition));
249  } else {
250  // not an array, just use eq as condition type and given value
251  $this->filterBuilder->setConditionType('eq');
252  $this->filterBuilder->setValue($condition);
253  }
254  return $this->filterBuilder->create();
255  }
256 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$value
Definition: gender.phtml:16
__construct(EntityFactoryInterface $entityFactory, FilterBuilder $filterBuilder, SearchCriteriaBuilder $searchCriteriaBuilder, SortOrderBuilder $sortOrderBuilder)
$index
Definition: list.phtml:44