2013-02-04 16 views
5

Ho creato un'entità che ha un comportamento Sortable e una domanda sull'utilizzo.
I metodi per impostare e ottenere le posizioni non sono abbastanza per me, quindi voglio fare semplice moveUp e moveDown metodi con seguente codice:Ordinamento di entità con comportamento ordinabile in Doctrine 2 (Symfony 2)

public function moveUp() { 
    ++$this->position; 
} 

public function moveDown() { 
    if($this->position != 0) 
     --$this->position; 
} 

Con questa implementazione il moveUp metodo ha nessun limite per incrementare l'articolo con la posizione già massima. Qual è il modo migliore per vietare l'incremento di tali articoli? Ho sentito che fare query personalizzate direttamente nelle entità non è una buona pratica, quindi come posso verificare se l'articolo ha già un valore massimo?

risposta

0

bene si può avere un listener di eventi agganciato che popolerebbe le entità dell'interfaccia d SortableMaxAware con un valore massimo prelevato dal database. Questo è ovviamente ingombrante, ma hey stai usando ORM :) divertiti.

2

Stesso problema qui, leggendo il codice ho notato che:

// Compute position if it is negative 
if ($newPosition < 0) { 
    $newPosition += $this->maxPositions[$hash] + 2; // position == -1 => append at end of list 
    if ($newPosition < 0) $newPosition = 0; 
} 

(in SortableListener:141)

Immagino che impostando -1 come posizione, verrà spostato alla fine della lista . E lo -2 lo metterà in vendita.


Edit: Scusa ho risposto troppo in fretta, ho anche voluto aggiungere:

Non credo che è necessario limitare la posizione da soli, il SortableListener sarà:

// Set position to max position if it is too big 
$newPosition = min(array($this->maxPositions[$hash] + 1, $newPosition)); 

Quindi la tua funzione moveUp() potrebbe essere (btw hai invertito moveUp e moveDown?):

public function moveUp() 
{ 
    if ($this->position != 0) { 
     $this->position--; 
    } 
} 
public function moveDown() 
{ 
    $this->position++; 
} 

Aggiornamento: Beh, dopo alcune prove, si scopre che c'è un bug in quella caratteristica.

setPosition(-1) posiziona l'oggetto alla fine dell'elenco, ma crea uno spazio nelle posizioni.

ho riprodotto qui: https://github.com/l3pp4rd/DoctrineExtensions/pull/908

spero che verrà risolto.

Problemi correlati