我正在使用Symfony 3.1 Doctrine GEDMO扩展(通过StofDoctrineExtensionsBundle).我已将我的实体设置为具有可排序行为:
- <?PHP
- namespace AppBundle\Entity\Manual;
- use AppBundle\Entity\Identifier;
- use Doctrine\ORM\Mapping as ORM;
- use Symfony\Component\Validator\Constraints as Assert;
- use Gedmo\Mapping\Annotation as Gedmo;
- /**
- * @ORM\Table(name="manual_pages")
- * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
- */
- class Manual
- {
- use Identifier;
- /**
- * @ORM\Column(type="string")
- * @Assert\NotBlank(message="Toto pole musí být vyplněno")
- */
- private $title;
- /**
- * @ORM\Column(type="text")
- * @Assert\NotBlank(message="Toto pole musí být vyplněno")
- */
- private $content;
- /**
- * @ORM\OneToMany(targetEntity="AppBundle\Entity\Manual\ManualImage",mappedBy="manual")
- * @ORM\OrderBy({"position"="ASC"})
- */
- private $images;
- /**
- * @Gedmo\SortablePosition
- * @ORM\Column(type="integer",nullable=false)
- */
- private $position;
- /**
- * @return mixed
- */
- public function getPosition()
- {
- return $this->position;
- }
- /**
- * @param mixed $position
- */
- public function setPosition($position)
- {
- $this->position = $position;
- }
- /**
- * @return mixed
- */
- public function getTitle()
- {
- return $this->title;
- }
- /**
- * @param mixed $title
- */
- public function setTitle($title)
- {
- $this->title = $title;
- }
- /**
- * @return ManualImage[]
- */
- public function getImages()
- {
- return $this->images;
- }
- /**
- * @param ManualImage[] $images
- */
- public function setImages($images)
- {
- $this->images = $images;
- }
- /**
- * @return mixed
- */
- public function getContent()
- {
- return $this->content;
- }
- /**
- * @param mixed $content
- */
- public function setContent($content)
- {
- $this->content = $content;
- }
- }
当我继续改变位置时,排序行为表现良好:
- $entity->setPosition($entity->getPosition() + 1);
- // or
- $entity->setPosition($entity->getPosition() - 1);
但是当我实现JS拖放以改变位置时,整个事情变得奇怪.例如,有这个表:
- id | position
- 1 | 0
- 2 | 1
- 3 | 2
- 4 | 3
- 5 | 4
- 6 | 5
当我为id为6的行做时:
- $newPosition = $entity->getPosition() - 5; // = 0
- $entity->setPosition($newPosition);
表格改为:
- id | position
- 1 | 2
- 2 | 3
- 3 | 4
- 4 | 5
- 5 | 5
- 6 | 0
位置1没有任何东西,但位置5被占用两次.有任何想法吗?
我们很久以前就发现了这个bug.在我们的情况下,当您同时设置多个位置/刷新时出现问题.我们最终使用了没有gedmo扩展名的javascript的完整排序顺序,因为单次刷新太贵了.
另请查看以下可能相关的错误问题:
> https://github.com/Atlantic18/DoctrineExtensions/issues/1642(“更新问题”)
> https://github.com/Atlantic18/DoctrineExtensions/issues/1618
> https://github.com/Atlantic18/DoctrineExtensions/issues/1130