Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SynonymGroupRepository.php
Go to the documentation of this file.
1 <?php
7 namespace Magento\Search\Model;
8 
13 
18 {
25 
31  protected $resourceModel;
32 
39  public function __construct(
40  \Magento\Search\Model\SynonymGroupFactory $synonymGroupFactory,
42  ) {
43  $this->synonymGroupFactory = $synonymGroupFactory;
44  $this->resourceModel = $resourceModel;
45  }
46 
50  public function save(SynonymGroupInterface $synonymGroup, $errorOnMergeConflict = false)
51  {
53  $synonymGroupModel = $this->synonymGroupFactory->create();
54  $synonymGroupModel->load($synonymGroup->getGroupId());
55  $isCreate = $synonymGroupModel->getSynonymGroup() === null;
56  if ($isCreate) {
57  return $this->create($synonymGroup, $errorOnMergeConflict);
58  } else {
59  return $this->update($synonymGroupModel, $synonymGroup, $errorOnMergeConflict);
60  }
61  }
62 
70  public function delete(SynonymGroupInterface $synonymGroup)
71  {
72  try {
73  $this->resourceModel->delete($synonymGroup);
74  } catch (\Exception $exception) {
75  throw new CouldNotDeleteException(
76  __(
77  'The synonym group with the "%1" ID can\'t be deleted. %2',
78  $synonymGroup->getGroupId(),
79  $exception->getMessage()
80  )
81  );
82  }
83  return true;
84  }
85 
92  public function get($synonymGroupId)
93  {
95  $synonymGroup = $this->synonymGroupFactory->create();
96  if ($synonymGroupId !== null) {
97  $synonymGroup->load($synonymGroupId);
98  }
99  return $synonymGroup;
100  }
101 
111  private function create(SynonymGroupInterface $synonymGroup, $errorOnMergeConflict)
112  {
113  $matchingSynonymGroups = $this->getMatchingSynonymGroups($synonymGroup);
114  if ($matchingSynonymGroups) {
115  if ($errorOnMergeConflict) {
116  throw new Synonym\MergeConflictException(
117  $this->parseToArray($matchingSynonymGroups),
118  $this->getExceptionMessage($matchingSynonymGroups)
119  );
120  }
121  // merge matching synonyms before creating a new row
122  $mergedSynonyms = $this->merge($synonymGroup, array_keys($matchingSynonymGroups));
124  $newSynonymGroupModel = $this->synonymGroupFactory->create();
125  $newSynonymGroupModel->setSynonymGroup(implode(',', $mergedSynonyms));
126  $newSynonymGroupModel->setWebsiteId($synonymGroup->getWebsiteId());
127  $newSynonymGroupModel->setStoreId($synonymGroup->getStoreId());
128  $this->resourceModel->save($newSynonymGroupModel);
129  $synonymGroup->setSynonymGroup($newSynonymGroupModel->getSynonymGroup());
130  $synonymGroup->setGroupId($newSynonymGroupModel->getGroupId());
131  } else {
132  // no merge conflict, perform simple insert
134  $synonymGroupModel = $this->synonymGroupFactory->create();
135  $this->populateSynonymGroupModel($synonymGroupModel, $synonymGroup);
136  $this->resourceModel->save($synonymGroupModel);
137  $synonymGroup->setGroupId($synonymGroupModel->getGroupId());
138  }
139  return $synonymGroup;
140  }
141 
150  private function merge(SynonymGroupInterface $synonymGroupToMerge, array $matchingGroupIds)
151  {
152  $mergedSynonyms = [];
153  foreach ($matchingGroupIds as $groupId) {
155  $synonymGroupModel = $this->synonymGroupFactory->create();
156  $synonymGroupModel->load($groupId);
157  $mergedSynonyms = array_merge($mergedSynonyms, explode(',', $synonymGroupModel->getSynonymGroup()));
158  $synonymGroupModel->delete();
159  }
160  $mergedSynonyms = array_merge($mergedSynonyms, explode(',', $synonymGroupToMerge->getSynonymGroup()));
161  $mergedSynonyms = array_unique($mergedSynonyms);
162  return $mergedSynonyms;
163  }
164 
172  private function populateSynonymGroupModel(SynonymGroup $modelToPopulate, SynonymGroupInterface $synonymGroupData)
173  {
174  $modelToPopulate->setWebsiteId($synonymGroupData->getWebsiteId());
175  $modelToPopulate->setStoreId($synonymGroupData->getStoreId());
176  $modelToPopulate->setSynonymGroup($synonymGroupData->getSynonymGroup());
177  }
178 
189  private function update(
190  SynonymGroup $oldSynonymGroup,
191  SynonymGroupInterface $newSynonymGroup,
192  $errorOnMergeConflict
193  ) {
194  $matchingSynonymGroups = $this->getMatchingSynonymGroups($newSynonymGroup);
195  // ignore existing synonym group as it's value will be discarded
196  $matchingSynonymGroups = array_diff_key(
197  $matchingSynonymGroups,
198  [$oldSynonymGroup->getGroupId() => $oldSynonymGroup->getSynonymGroup()]
199  );
200  if ($matchingSynonymGroups) {
201  if ($errorOnMergeConflict) {
202  throw new Synonym\MergeConflictException(
203  $this->parseToArray($matchingSynonymGroups),
204  $this->getExceptionMessage($matchingSynonymGroups)
205  );
206  }
207  // merge matching synonyms before updating a row
208  $mergedSynonyms = $this->merge($newSynonymGroup, array_keys($matchingSynonymGroups));
209  $oldSynonymGroup->setSynonymGroup(implode(',', $mergedSynonyms));
210  $oldSynonymGroup->setWebsiteId($newSynonymGroup->getWebsiteId());
211  $oldSynonymGroup->setStoreId($newSynonymGroup->getStoreId());
212  $this->resourceModel->save($oldSynonymGroup);
213  } else {
214  // no merge conflict, perform simple update
215  $this->populateSynonymGroupModel($oldSynonymGroup, $newSynonymGroup);
216  $this->resourceModel->save($oldSynonymGroup);
217  }
218  return $oldSynonymGroup;
219  }
220 
227  private function getExceptionMessage($matchingSynonymGroups)
228  {
229  $displayString = '(';
230  $displayString .= implode('), (', $matchingSynonymGroups);
231  $displayString .= ')';
232  return __('Merge conflict with existing synonym group(s): %1', $displayString);
233  }
234 
241  private function parseToArray($matchingSynonymGroups)
242  {
243  $parsedArray = [];
244  foreach ($matchingSynonymGroups as $matchingSynonymGroup) {
245  $parsedArray[] = explode(',', $matchingSynonymGroup);
246  }
247  return $parsedArray;
248  }
249 
256  private function getMatchingSynonymGroups(SynonymGroupInterface $synonymGroup)
257  {
258  $synonymGroupsInScope = $this->resourceModel->getByScope(
259  $synonymGroup->getWebsiteId(),
260  $synonymGroup->getStoreId()
261  );
262  $matchingSynonymGroups = [];
263  foreach ($synonymGroupsInScope as $synonymGroupInScope) {
264  if (array_intersect(
265  explode(',', $synonymGroup->getSynonymGroup()),
266  explode(',', $synonymGroupInScope['synonyms'])
267  )) {
268  $matchingSynonymGroups[$synonymGroupInScope['group_id']] = $synonymGroupInScope['synonyms'];
269  }
270  }
271  return $matchingSynonymGroups;
272  }
273 }
__()
Definition: __.php:13
__construct(\Magento\Search\Model\SynonymGroupFactory $synonymGroupFactory, SynonymGroupResourceModel $resourceModel)
save(\Magento\Search\Api\Data\SynonymGroupInterface $synonymGroup, $errorOnMergeConflict=false)