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; } } [/sourcecode] <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
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
@Cethy : Oui en effet, c’est sans doute plus simple ainsi.
Merci pour l’info.
Merci, je cherchais exactement ça, nikel!