public function it_throws_exception_when_item_is_already_at_first_position(MenuItemInterface $sourceItem, MenuItemInterface $parentItem, MenuItemRepositoryInterface $menuItemRepository, ObjectManager $objectManager) { $sourceItem->getPosition()->willReturn(0); $sourceItem->getId()->willReturn(5); $menuItemRepository->persistAsFirstChildOf($sourceItem, $parentItem)->shouldNotBeCalled(); $sourceItem->setPosition(0)->shouldNotBeCalled(); $objectManager->flush()->shouldNotBeCalled(); $this->shouldThrow(ConflictHttpException::class)->duringMove($sourceItem, $parentItem, 0); }
/** * {@inheritdoc} */ public function move(MenuItemInterface $sourceItem, MenuItemInterface $parent, int $position = 0) { if (0 === $position) { $this->ensurePositionIsValid($sourceItem, $position); $this->menuItemRepository->persistAsFirstChildOf($sourceItem, $parent); } else { $afterItemPosition = $position; // when moving item from last to middle position if ($afterItemPosition < $sourceItem->getPosition()) { $afterItemPosition -= 1; } $this->ensurePositionIsValid($sourceItem, $afterItemPosition); // find menu item after which source item should be placed $afterItem = $this->menuItemRepository->findChildByParentAndPosition($parent, $afterItemPosition); if (null === $afterItem) { throw new HttpException(400, sprintf('You can not insert menu item at position %d. Position is not valid.', $position)); } $this->menuItemRepository->persistAsNextSiblingOf($sourceItem, $afterItem); } $sourceItem->setPosition($position); $this->objectManager->flush(); }