|
12 | 12 | use CodedMonkey\Dirigent\Doctrine\Entity\Version; |
13 | 13 | use CodedMonkey\Dirigent\Doctrine\Entity\VersionConflictLink; |
14 | 14 | use CodedMonkey\Dirigent\Doctrine\Entity\VersionDevRequireLink; |
| 15 | +use CodedMonkey\Dirigent\Doctrine\Entity\VersionKeyword; |
15 | 16 | use CodedMonkey\Dirigent\Doctrine\Entity\VersionProvideLink; |
16 | 17 | use CodedMonkey\Dirigent\Doctrine\Entity\VersionReplaceLink; |
17 | 18 | use CodedMonkey\Dirigent\Doctrine\Entity\VersionRequireLink; |
@@ -406,25 +407,42 @@ private function updateVersion(Package $package, Version $version, CompletePacka |
406 | 407 |
|
407 | 408 | // Handle keywords |
408 | 409 | if ($keywordsData = $data->getKeywords()) { |
409 | | - foreach ($version->getKeywords() as $keyword) { |
410 | | - $keywordName = $keyword->getName(); |
| 410 | + $keywords = []; |
| 411 | + $keywordIndex = 0; |
| 412 | + foreach ($keywordsData as $keywordName) { |
| 413 | + $keywords[$keywordName] = $keywordIndex++; |
| 414 | + } |
| 415 | + |
| 416 | + foreach ($version->getKeywords() as $versionKeyword) { |
| 417 | + $keywordName = $versionKeyword->getKeyword()->getName(); |
411 | 418 | // Clear keywords that have disappeared (for updates) |
412 | | - if (!in_array($keywordName, $keywordsData, true)) { |
413 | | - $version->getKeywords()->removeElement($keyword); |
414 | | - $em->remove($keyword); |
| 419 | + if (!isset($keywords[$keywordName])) { |
| 420 | + $version->getKeywords()->removeElement($versionKeyword); |
| 421 | + $em->remove($versionKeyword); |
415 | 422 | } else { |
| 423 | + // Update index if it changed |
| 424 | + if ($versionKeyword->getIndex() !== $keywords[$keywordName]) { |
| 425 | + $versionKeyword->setIndex($keywords[$keywordName]); |
| 426 | + } |
416 | 427 | // Clear those that are already set |
417 | | - $index = array_search($keywordName, $keywordsData, true); |
418 | | - unset($keywordsData[$index]); |
| 428 | + unset($keywords[$keywordName]); |
419 | 429 | } |
420 | 430 | } |
421 | 431 |
|
422 | | - foreach ($keywordsData as $keywordName) { |
| 432 | + foreach ($keywords as $keywordName => $keywordIndex) { |
423 | 433 | $keyword = $this->keywordRepository->getByName($keywordName); |
424 | | - $version->addKeyword($keyword); |
| 434 | + $versionKeyword = new VersionKeyword(); |
| 435 | + $versionKeyword->setKeyword($keyword); |
| 436 | + $versionKeyword->setIndex($keywordIndex); |
| 437 | + $version->addKeyword($versionKeyword); |
| 438 | + $versionKeyword->setVersion($version); |
| 439 | + $em->persist($versionKeyword); |
425 | 440 | } |
426 | 441 | } elseif (count($version->getKeywords())) { |
427 | 442 | // Clear existing keywords if present |
| 443 | + foreach ($version->getKeywords() as $versionKeyword) { |
| 444 | + $em->remove($versionKeyword); |
| 445 | + } |
428 | 446 | $version->getKeywords()->clear(); |
429 | 447 | } |
430 | 448 |
|
|
0 commit comments