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: