2016-11-19 8 views
7

Im с использованием Symfony 3.1 + Расширение Doctrine GEDMO (через StofDoctrineExtensionsBundle). Я настроил свою сущность, чтобы иметь Сортируемое поведение:Расширения доктрины Сортировка не работает правильно при изменении положения более чем на 1

<?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; 
    } 


} 

Когда я проследовать изменить положение одного поведение сортировки действует OK:

$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 занята дважды. Есть идеи?

+1

Кажется, то же самое ошибка (или особенность), описанная здесь: http://stackoverflow.com/questions/19889652/doctrine2-sortable-update-position – SergeyLebedev

ответ

4

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

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