Расширения Доктрины Сортируемый не работает правильно при смене позиции более чем на 1

Я использую 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

когда я делаю для строки с идентификатором 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 занята дважды. Есть идеи?

8

Решение

Мы обнаружили эту ошибку и давным-давно. В нашем случае возникла проблема, когда вы устанавливаете несколько позиций одновременно / сброс. В итоге мы использовали полный порядок сортировки javascript без расширения gedmo, потому что одиночные сбрасывания были слишком дорогими.

Также обратите внимание на следующие проблемы с ошибками, которые могут иметь отношение:

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]