Skip to content
Advertisement

Doctrine Extensions Sortable not working correctly when changing position by more than 1

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:

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement