Symfony sorrendezés

Symfony-ban készítünk sorrendezést, egy táblának a sorait szeretnénk felcserélhétővé alakítani.

composer.json-ba írjuk be a következő sort: "gedmo/doctrine-extensions": "~2.4"

A táblánkba vegyünk fel egy position mezőt és ehhez módosítsuk a hozzátartozó entity fájlunkat is így:
    /**
     * @Gedmo\SortablePosition
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

...

    /**
     * Set position
     *
     * @param boolean $position
     * @return Test
     */
    public function setPosition($position)
    {
        $this->position = $position;

        return $this;
    }

    /**
     * Get active
     *
     * @return boolean
     */
    public function getPosition()
    {
        return $this->position;
    }

A controllerünkbe készítsünk egy action-t, amivel változtatunk a sorrenden:
/**
     * Test entity position up
     *
     * @Route("{_locale}/test/sortable/id/{id}/position/{position}", name="test_sortable",requirements={"_locale": "hu|en"})
     * @Method("GET")
     * @Template()
     */
    public function sortableAction($id, $position)
    {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('AppBundle:Test')->find($id);

        if (!$entity) { // Unable to find group entity
            $this->addFlash(
                'notice_error',
                'Error! Not found!'
            );
            return $this->redirect($this->generateUrl('test'));
        }

        $entity->setPosition($position);

        try { // try push data for database
            $em->flush();
        } catch (\Doctrine\DBAL\DBALException $e) {
            if ($e->getPrevious() && 0 === strpos($e->getPrevious()->getCode(), '23')) { // Duplicate entry
                $this->addFlash(
                    'notice_error',
                    'Error! Exists error!'
                );

                return $this->redirect($this->generateUrl('test'));
            }
        }

        return $this->redirect($this->generateUrl('test'));
    }
}


A view-ra tegyünk ki két gombot, amikkel tudjuk  felfelé és lefelé pozícionálni a sorokat.

 {% set position =  entity.position %}
 {% set position_up =  position + 1 %}
 {% set position_down =  position - 1 %}


<td>
	<button type="button" class="btn btn-success"
		onclick="window.location='{{ path('test_sortable', { 'id': entity.id,'position': position_up }) }}'">
	<span class="glyphicon glyphicon-pencil"></span> {{ position_up }}
	</button>
</td>
<td>
        <button type="button" class="btn btn-success"
                onclick="window.location='{{ path('test_sortable', { 'id': entity.id,'position': position_down })}}'">
	<span class="glyphicon glyphicon-pencil"></span> {{ position_down }}
        </button>
</td>

A service.yaml fájlba tegyük be:
    gedmo.listener.sortable:
            class: Gedmo\Sortable\SortableListener
            tags:
                - { name: doctrine.event_subscriber, connection: default }
            calls:
                - [ setAnnotationReader, [ "@annotation_reader" ] ]

Olvasnivaló:
https://symfony.com/doc/master/bundles/SonataAdminBundle/cookbook/recipe_sortable_listing.html
https://github.com/Atlantic18/DoctrineExtensions/blob/HEAD//doc/sortable.md
https://packagist.org/packages/gedmo/doctrine-extensions
2018.09.13.