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

Ajout des annotations

Ensuite, on ajoute les annotations qui vont bien :

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

3 réflexions au sujet de « Symfony2 – Doctrine Sortable Behaviour »

  1. Cethy

    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

    Répondre

Laisser un commentaire

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

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>