Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony3] problème pour ordonner des liens

    27 juillet 2017 à 12:24:05

    Bonjour,

    Actuellement je souhaiterais afficher des liens sur la page d'accueil d'un site qui peuvent être ajouté et ordonnés à partir du backoffice pour cela j'ai créé une entité lien avec l'intitulé du lien, l'url et l'ordre qui est un entier unique non null.

    Pour le backoffice l'ordre des liens est entré par l'intermédiaire d'un formulaire avec une liste déroulante affichant  des valeurs entière d'ordre possible (par exemple si il y a déjà 3 liens affiche des valeurs de 1 à 4 pour l'insertion).

    Pour le moment je m'occupe que de l'insertion de nouveaux liens et pour mon problème j'ai pensé à utiliser les événements doctrine notamment l’événement prePersist (en créant un listener) dans lequel je récupère tous les liens qui ont un ordre supérieur ou égal à l'ordre du nouveau liens et je leur incrémente à tous leur ordre.

    Seulement lorsque je fait cela je déclenche quand même une UniqueConstraintViolationException, j'ai l'impression que c'est une question d'ordre des requêtes au moment du flush mais je ne sait pas comment traiter celà.

    Après si je me suis embêté pour rien et qu'il y a une façon plus simple de procéder je suis preneur aussi.

    un peu de code pour illustrer celà:

    l'entité (un extrait):

    ?php
    
    namespace GL\WebsiteAdminBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * Link
     * Lien des Partenaires affiché en page d'accueil
     * 
     * @ORM\Table(name="link")
     * @ORM\Entity(repositoryClass="GL\WebsiteAdminBundle\Repository\LinkRepository")
     * 
     */
    class Link
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
    
        /**
         * Libellé du lien
         * 
         * @Assert\Type("string")
         * @Assert\NotBlank()
         * @Assert\Length(max=50, maxMessage="Le nom du lien doit faire au maximum 50 caractères")
         * 
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=50)
         */
        private $name;
    
        /**
         * URL du lien
         * @var string
         * 
         * @Assert\Url(
         *    message = "l'url '{{ value }}' n'est pas une url valide.",
         * )
         *
         * @ORM\Column(name="url", type="string", length=255)
         */
        private $url;
    
        /**
         * Image du lien affiché
         * 
         * @Assert\Valid
         * @ORM\OneToOne(targetEntity="GL\WebsiteAdminBundle\Entity\Image", cascade={"persist", "remove"})
         * @ORM\JoinColumn(name="image_id", referencedColumnName="id", nullable=false)
         */
        private $image;
        
        /**
         * Ordre d'affichage du lien
         * @var int
         * 
         * @Assert\Type("int")
         *
         * @ORM\Column(name="number_order", type="integer", nullable=false, unique=true)
         */
        private $order;
    
    // getter et setter



    Le listener:

    <?php
    
    namespace GL\WebsiteAdminBundle\DoctrineListener;
    
    use GL\WebsiteAdminBundle\Services\LinkOrder;
    use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
    use GL\WebsiteAdminBundle\Entity\Link;
    
    /**
     * Description of LinkListener
     *
     * @author Gauthier_LANTOINE
     */
    class LinkListener {
    
        public function prePersist(LifecycleEventArgs $args){
            $link = $args->getObject();
            
        
            if (!$link instanceof Link) {
              return;
            }
            
            $repository = $args->getEntityManager()->getRepository('GLWebsiteAdminBundle:Link');
            
            if($repository->isOrderAllreadyExist($link)){
                
                $links = $repository->getLinksFromTheOrder($link->getOrder());
                
                foreach ($links as $linkToChangeOrder) {
                    $linkToChangeOrder->setOrder($linkToChangeOrder->getOrder()+ 1);
                }
            }
            
        }
        
        public function preUpdate(LifecycleEventArgs $args){
            $entity = $args->getObject();
        
            if (!$entity instanceof Link) {
              return;
            }
            
            
        }
    }



    • Partager sur Facebook
    • Partager sur Twitter
      27 juillet 2017 à 17:23:22

      Hello,

      Pourquoi tu t'embêtes à ajouter une liste déroulante en guise de priorité. Ce ne serait pas mieux pour toi d'utiliser un simple drag&drop de liste en JS? Par exemple https://rubaxa.github.io/Sortable/ est pas mal.

      Tu édites un peu le fonctionnement de la lib pour setter l'ordre des liens dans ton formulaire et quand tu submits le travail d'ordre sera déjà effectué.

      + simple niveau code 

      + simple d'utilisation

      • Partager sur Facebook
      • Partager sur Twitter
        1 août 2017 à 11:26:55

        Pour mon cas précis ça ne change pas grand chose à mon problème qui est de persister l'ordre des liens en base de données, alors oui j'aurais pu faire avec un drag and drop pour la présentation mais au final il faut que l'ordre soit sauvegardé en base de données.

        La seule solution que je vois c'est de supprimer la contrainte d'unicité du champs ordre en base de données mais bon c'est pas terrible...

        • Partager sur Facebook
        • Partager sur Twitter
          1 août 2017 à 11:34:52

          As-tu essayé de flush à la fin de ton prepersist ?

          Sinon que fait getLinksFromTheOrder ?

          • Partager sur Facebook
          • Partager sur Twitter
            1 août 2017 à 13:43:43

            Un flush dans un event prePersist me donne une erreur 500, getLinksFromtheOrder($order) permet d'obtenir la liste des liens ayant un ordre supérieur ou égal à celui envoyé en paramêtre.
            • Partager sur Facebook
            • Partager sur Twitter

            [Symfony3] problème pour ordonner des liens

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown