Symfony2 – Doctrine Sortable Behaviour

Inclure le bundle sf2 de stof dans son composer

Commencer par ajouter cette petite ligne dans votre composer :

"require": {
...
"stof/doctrine-extensions-bundle": "dev-master",
...

Activation du bundle dans le fichier AppKernel

Composer update , puis rajouter ce nouveau bundle dans l’AppKernel :

<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
  public function registerBundles()
  {
    $bundles = array(
      ...,
      new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
      ...,
    );
    // ...

    return $bundles;
  }
}
&#91;/sourcecode&#93;

<h2>Ajout des annotations</h2>

Ensuite, on ajoute les annotations qui vont bien :

[sourcecode language="php"]
<?php
namespace Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="items")
 * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
 */
class Item
{
    /** @ORM\Id @ORM\GeneratedValue @ORM\Column(type="integer") */
    private $id;

    /**
     * @ORM\Column(name="name", type="string", length=64)
     */
    private $name;

    /**
     * @Gedmo\SortablePosition
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

    /**
     * @Gedmo\SortableGroup
     * @ORM\Column(name="category", type="string", length=128)
     */
    private $category;

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setPosition($position)
    {
        $this->position = $position;
    }

    public function getPosition()
    {
        return $this->position;
    }

    public function setCategory($category)
    {
        $this->category = $category;
    }

    public function getCategory()
    {
        return $this->category;
    }
    
    // ...
}

Ajout du listener

Et pour que tout cela fonctionne correctement, ne pas oublier d’ajouter l’event subscriber à notre event manager dans la méthode Boot de notre bundle.
Sinon, la mise à jour du champ position n’est jamais faite…
Si vous avez oublié de surcharger la méthode boot de votre bundle et que vous avez tenté d’utiliser la classe SortableRepository, une belle exception devrait vous avoir mis la puce à l’oreille :

This repository can be attached only to ORM sortable listener

<?php

namespace Acme\AcmeBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeAcmeBundle extends Bundle
{
  public function boot()
  {
    // get the doctrine 2 entity manager
    $em = $this->container->get('doctrine.orm.default_entity_manager');

    // get the event manager
    $evm = $em->getEventManager();
    $evm->addEventSubscriber(new \Gedmo\Sortable\SortableListener);
  }
}

Pour des exemples d’utilisation, RDV ici : http://gediminasm.org/article/sortable-behavior-extension-for-doctrine2

Publié par Olivier Balais

Jeune ingénieur logiciel basé à Lyon (@overnetcity) passionné par les NTIC et le développement Web, je suis actuellement salarié chez Reputation VIP et effectue en parallèle des missions ponctuelles en temps que Freelance. Passionné depuis toujours par l'informatique et le développement, suite à une formation solide à l'INSA de Lyon, je me suis spécialisé dans la réalisation de bout en bout de projets web complexes.

Rejoindre la conversation

3 commentaires

  1. Au lieu d’ajouter l’event subscriber à ton bundle, tu peux le configurer globalement dans ton config.yml :

    stof_doctrine_extensions:
    orm:
    default:
    sortable: true

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *