Im using Symfony 3.1 + Doctrine GEDMO extensions (via StofDoctrineExtensionsBundle). I’ve set my entity to have Sortable behavior:
<?php namespace AppBundleEntityManual; use AppBundleEntityIdentifier; use DoctrineORMMapping as ORM; use SymfonyComponentValidatorConstraints as Assert; use GedmoMappingAnnotation as Gedmo; /** * @ORMTable(name="manual_pages") * @ORMEntity(repositoryClass="GedmoSortableEntityRepositorySortableRepository") */ class Manual { use Identifier; /** * @ORMColumn(type="string") * @AssertNotBlank(message="Toto pole musí být vyplněno") */ private $title; /** * @ORMColumn(type="text") * @AssertNotBlank(message="Toto pole musí být vyplněno") */ private $content; /** * @ORMOneToMany(targetEntity="AppBundleEntityManualManualImage", mappedBy="manual") * @ORMOrderBy({"position"="ASC"}) */ private $images; /** * @GedmoSortablePosition * @ORMColumn(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; } }
When i proceed to change position by one the sorting behavior is acting OK:
$entity->setPosition($entity->getPosition() + 1); // or $entity->setPosition($entity->getPosition() - 1);
But when I’ve implemented JS drag&drop to change positions the whole thing gets weird. For example, having this table:
id | position 1 | 0 2 | 1 3 | 2 4 | 3 5 | 4 6 | 5
when I do for row with id 6 this:
$newPosition = $entity->getPosition() - 5; // = 0 $entity->setPosition($newPosition);
the table changes to this:
id | position 1 | 2 2 | 3 3 | 4 4 | 5 5 | 5 6 | 0
There is nothing for position 1 but position 5 is occupied twice. Any ideas?
Advertisement
Answer
We also discovered this bug a long time ago. In our case there was a problem when you set multiple positions at the same time / flush. We ended up using the complete sort order of javascript without the gedmo extension because single flushes were too expensive.
Also have a look at the following bug issues which could be relevant: