53 $synonymGroupModel = $this->synonymGroupFactory->create();
54 $synonymGroupModel->load($synonymGroup->
getGroupId());
55 $isCreate = $synonymGroupModel->getSynonymGroup() ===
null;
57 return $this->create($synonymGroup, $errorOnMergeConflict);
59 return $this->update($synonymGroupModel, $synonymGroup, $errorOnMergeConflict);
73 $this->resourceModel->delete($synonymGroup);
74 }
catch (\Exception $exception) {
77 'The synonym group with the "%1" ID can\'t be deleted. %2',
79 $exception->getMessage()
92 public function get($synonymGroupId)
95 $synonymGroup = $this->synonymGroupFactory->create();
96 if ($synonymGroupId !==
null) {
97 $synonymGroup->load($synonymGroupId);
111 private function create(SynonymGroupInterface $synonymGroup, $errorOnMergeConflict)
113 $matchingSynonymGroups = $this->getMatchingSynonymGroups($synonymGroup);
114 if ($matchingSynonymGroups) {
115 if ($errorOnMergeConflict) {
116 throw new Synonym\MergeConflictException(
117 $this->parseToArray($matchingSynonymGroups),
118 $this->getExceptionMessage($matchingSynonymGroups)
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());
134 $synonymGroupModel = $this->synonymGroupFactory->create();
135 $this->populateSynonymGroupModel($synonymGroupModel, $synonymGroup);
136 $this->resourceModel->save($synonymGroupModel);
137 $synonymGroup->setGroupId($synonymGroupModel->getGroupId());
139 return $synonymGroup;
150 private function merge(SynonymGroupInterface $synonymGroupToMerge, array $matchingGroupIds)
152 $mergedSynonyms = [];
153 foreach ($matchingGroupIds as
$groupId) {
155 $synonymGroupModel = $this->synonymGroupFactory->create();
157 $mergedSynonyms = array_merge($mergedSynonyms, explode(
',', $synonymGroupModel->getSynonymGroup()));
158 $synonymGroupModel->delete();
160 $mergedSynonyms = array_merge($mergedSynonyms, explode(
',', $synonymGroupToMerge->getSynonymGroup()));
161 $mergedSynonyms = array_unique($mergedSynonyms);
162 return $mergedSynonyms;
172 private function populateSynonymGroupModel(SynonymGroup $modelToPopulate, SynonymGroupInterface $synonymGroupData)
174 $modelToPopulate->setWebsiteId($synonymGroupData->getWebsiteId());
175 $modelToPopulate->setStoreId($synonymGroupData->getStoreId());
176 $modelToPopulate->setSynonymGroup($synonymGroupData->getSynonymGroup());
189 private function update(
190 SynonymGroup $oldSynonymGroup,
191 SynonymGroupInterface $newSynonymGroup,
192 $errorOnMergeConflict
194 $matchingSynonymGroups = $this->getMatchingSynonymGroups($newSynonymGroup);
196 $matchingSynonymGroups = array_diff_key(
197 $matchingSynonymGroups,
198 [$oldSynonymGroup->getGroupId() => $oldSynonymGroup->getSynonymGroup()]
200 if ($matchingSynonymGroups) {
201 if ($errorOnMergeConflict) {
202 throw new Synonym\MergeConflictException(
203 $this->parseToArray($matchingSynonymGroups),
204 $this->getExceptionMessage($matchingSynonymGroups)
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);
215 $this->populateSynonymGroupModel($oldSynonymGroup, $newSynonymGroup);
216 $this->resourceModel->save($oldSynonymGroup);
218 return $oldSynonymGroup;
227 private function getExceptionMessage($matchingSynonymGroups)
229 $displayString =
'(';
230 $displayString .= implode(
'), (', $matchingSynonymGroups);
231 $displayString .=
')';
232 return __(
'Merge conflict with existing synonym group(s): %1', $displayString);
241 private function parseToArray($matchingSynonymGroups)
244 foreach ($matchingSynonymGroups as $matchingSynonymGroup) {
245 $parsedArray[] = explode(
',', $matchingSynonymGroup);
256 private function getMatchingSynonymGroups(SynonymGroupInterface $synonymGroup)
258 $synonymGroupsInScope = $this->resourceModel->getByScope(
259 $synonymGroup->getWebsiteId(),
260 $synonymGroup->getStoreId()
262 $matchingSynonymGroups = [];
263 foreach ($synonymGroupsInScope as $synonymGroupInScope) {
265 explode(
',', $synonymGroup->getSynonymGroup()),
266 explode(
',', $synonymGroupInScope[
'synonyms'])
268 $matchingSynonymGroups[$synonymGroupInScope[
'group_id']] = $synonymGroupInScope[
'synonyms'];
271 return $matchingSynonymGroups;
__construct(\Magento\Search\Model\SynonymGroupFactory $synonymGroupFactory, SynonymGroupResourceModel $resourceModel)
save(\Magento\Search\Api\Data\SynonymGroupInterface $synonymGroup, $errorOnMergeConflict=false)