Bladeren bron

Evolution #387: Ordre des tags

Sevajol Bastien 11 jaren geleden
bovenliggende
commit
b269a43e73

+ 116 - 0
src/Muzich/CoreBundle/Command/TagOrderCommand.php Bestand weergeven

@@ -0,0 +1,116 @@
1
+<?php
2
+
3
+namespace Muzich\CoreBundle\Command;
4
+
5
+use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
6
+use Symfony\Component\Console\Input\InputArgument;
7
+use Symfony\Component\Console\Input\InputInterface;
8
+use Symfony\Component\Console\Input\InputOption;
9
+use Symfony\Component\Console\Output\OutputInterface;
10
+
11
+use Muzich\CoreBundle\Entity\User;
12
+use Muzich\CoreBundle\Searcher\ElementSearcher;
13
+use Muzich\CoreBundle\lib\Tag as TagLib;
14
+
15
+class TagOrderCommand extends ContainerAwareCommand
16
+{
17
+  protected function configure()
18
+  {
19
+    $this
20
+      ->setName('tagengine:order')
21
+      ->setDescription('Ordonne la liste des tags sur les pages utilisateurs')
22
+    ;
23
+  }
24
+  
25
+  protected function execute(InputInterface $input, OutputInterface $output)
26
+  {
27
+    $doctrine = $this->getContainer()->get('doctrine');
28
+    $em = $doctrine->getEntityManager();
29
+    $tag_lib = new TagLib();
30
+
31
+    $output->writeln('#');
32
+    $output->writeln('## Script d\'ordonance des listes de tags sur les pages'
33
+      .' utilisateurs ##');
34
+    $output->writeln('#');
35
+
36
+    // Premier point on récupère les utilisateurs qui ont mis a jour leurs 
37
+    // favoris
38
+    $output->writeln('<info>Gestion de l\'ordre des tags sur les pages de '
39
+      .'partages favoris</info>');
40
+ 
41
+    $users = $em->createQuery(
42
+        "SELECT u FROM MuzichCoreBundle:User u"
43
+        . " WHERE u.datas LIKE :favupd"
44
+      )->setParameter('favupd', '%"'.User::DATA_FAV_UPDATED.'":true%')
45
+      ->getResult()
46
+    ;
47
+    
48
+    if (count($users))
49
+    {
50
+      $output->writeln('<info>Traitement de '.count($users).' utilisateurs</info>');
51
+      foreach ($users as $user)
52
+      {
53
+        // On récupère ses éléments favoris
54
+        $search_object = new ElementSearcher();
55
+        $search_object->init(array(
56
+          'user_id'  => $user->getId(),
57
+          'favorite' => true
58
+        ));
59
+        $elements_favorite = $search_object->getElements($doctrine, $user->getId());
60
+        
61
+        // On récupère la nouvelle liste de tags ordonnés
62
+        $tags_ordered = $tag_lib->getOrderedTagsWithElements($elements_favorite);
63
+        // On enregistre ça en base
64
+        $user->setData(User::DATA_TAGS_ORDER_PAGE_FAV, $tags_ordered);
65
+        $user->setData(User::DATA_FAV_UPDATED, false);
66
+        $em->persist($user);
67
+        $em->flush();
68
+      }
69
+    
70
+    }
71
+    else
72
+    {
73
+      $output->writeln('<info>Aucun utilisateur a traiter</info>');
74
+    }
75
+    
76
+    // Deuxième point on récupère les utilisateurs qui ont mis a jour leurs 
77
+    // diffusion
78
+    $output->writeln('<info>Gestion de l\'ordre des tags sur les diffusions</info>');
79
+ 
80
+    $users = $em->createQuery(
81
+        "SELECT u FROM MuzichCoreBundle:User u"
82
+        . " WHERE u.datas LIKE :favupd"
83
+      )->setParameter('favupd', '%"'.User::DATA_DIFF_UPDATED.'":true%')
84
+      ->getResult()
85
+    ;
86
+    
87
+    if (count($users))
88
+    {
89
+      $output->writeln('<info>Traitement de '.count($users).' utilisateurs</info>');
90
+      foreach ($users as $user)
91
+      {
92
+        // On récupère ses éléments diffusés
93
+        $search_object = new ElementSearcher();
94
+        $search_object->init(array(
95
+          'user_id'  => $user->getId()
96
+        ));
97
+        $elements_diffused = $search_object->getElements($doctrine, $user->getId());
98
+        
99
+        // On récupère la nouvelle liste de tags ordonnés
100
+        $tags_ordered = $tag_lib->getOrderedTagsWithElements($elements_diffused);
101
+        // On enregistre ça en base
102
+        $user->setData(User::DATA_TAGS_ORDER_DIFF, $tags_ordered);
103
+        $user->setData(User::DATA_DIFF_UPDATED, false);
104
+        $em->persist($user);
105
+        $em->flush();
106
+      }
107
+    
108
+    }
109
+    else
110
+    {
111
+      $output->writeln('<info>Aucun utilisateur a traiter</info>');
112
+    }
113
+    
114
+    $output->writeln('<info>Terminé !</info>');
115
+  }
116
+}

+ 5 - 0
src/Muzich/CoreBundle/Controller/CoreController.php Bestand weergeven

@@ -18,6 +18,7 @@ use Muzich\CoreBundle\Managers\TagManager;
18 18
 use Muzich\CoreBundle\Entity\UsersTagsFavorites;
19 19
 use Muzich\CoreBundle\Managers\ElementReportManager;
20 20
 use Muzich\CoreBundle\Propagator\EventUser;
21
+use Muzich\CoreBundle\Entity\User;
21 22
 
22 23
 class CoreController extends Controller
23 24
 {
@@ -273,6 +274,10 @@ class CoreController extends Controller
273 274
         }
274 275
       }
275 276
 
277
+      // On signale que cet user a modifié ses diffusions
278
+      $user->setData(User::DATA_DIFF_UPDATED, true);
279
+      $em->persist($user);
280
+      
276 281
       $em->persist($element);
277 282
       $em->flush();
278 283
 

+ 11 - 0
src/Muzich/CoreBundle/Controller/ElementController.php Bestand weergeven

@@ -9,6 +9,7 @@ use Muzich\CoreBundle\Entity\ElementTagsProposition;
9 9
 use Symfony\Component\HttpFoundation\Request;
10 10
 use Muzich\CoreBundle\Entity\Element;
11 11
 use Muzich\CoreBundle\Util\TagLike;
12
+use Muzich\CoreBundle\Entity\User;
12 13
 
13 14
 class ElementController extends Controller
14 15
 {
@@ -136,6 +137,11 @@ class ElementController extends Controller
136 137
       $factory->proceedFill($user);
137 138
       // Si il y avais un groupe on le remet
138 139
       $element->setGroup($group);
140
+      
141
+      // On signale que cet user a modifié ses diffusions
142
+      $user->setData(User::DATA_DIFF_UPDATED, true);
143
+      $em->persist($user);
144
+      
139 145
       $em->persist($element);
140 146
       $em->flush();
141 147
       
@@ -208,6 +214,11 @@ class ElementController extends Controller
208 214
       
209 215
       $em->persist($element->getOwner());
210 216
       $em->remove($element);
217
+      
218
+      // On signale que cet user a modifié ses diffusions
219
+      $this->getUser()->setData(User::DATA_DIFF_UPDATED, true);
220
+      $em->persist($this->getUser());
221
+      
211 222
       $em->flush();
212 223
       
213 224
       if ($this->getRequest()->isXmlHttpRequest())

+ 84 - 0
src/Muzich/CoreBundle/Entity/User.php Bestand weergeven

@@ -24,6 +24,30 @@ use Muzich\CoreBundle\Entity\Tag;
24 24
 class User extends BaseUser
25 25
 {
26 26
   
27
+  /**
28
+   * Data ordre des tags de sa page favoris
29
+   * @var string 
30
+   */
31
+  const DATA_TAGS_ORDER_PAGE_FAV = "data_tags_order_page_fav";
32
+  
33
+  /**
34
+   * Data ordre des tags de ses diffusions
35
+   * @var string 
36
+   */
37
+  const DATA_TAGS_ORDER_DIFF     = "data_tags_order_diff";
38
+  
39
+  /**
40
+   * Data, les favoris ont ils été modifiés
41
+   * @var string 
42
+   */
43
+  const DATA_FAV_UPDATED         = "data_fav_updated";
44
+  
45
+  /**
46
+   * Data, les favoris ont ils été modifiés
47
+   * @var string 
48
+   */
49
+  const DATA_DIFF_UPDATED        = "data_diff_updated";
50
+  
27 51
  /**
28 52
   * @ORM\Id
29 53
   * @ORM\Column(type="integer")
@@ -174,6 +198,14 @@ class User extends BaseUser
174 198
   protected $live_datas = array();
175 199
   
176 200
   /**
201
+   * Contient des données pratique, comme l'ordre des tags de sa page favoris etc.
202
+   * 
203
+   * @ORM\Column(type="text", nullable=true)
204
+   * @var type string
205
+   */
206
+  protected $datas = null;
207
+  
208
+  /**
177 209
    * Tableau contenant les id => name des tags favoris
178 210
    * de l'user. Ces donnée sont faites pour optimiser les calculs.
179 211
    * Ce chamsp est mis ajour a chaque fois qu'un UsersTagsFavorite est manipulé.
@@ -833,4 +865,56 @@ class User extends BaseUser
833 865
     return false;
834 866
   }
835 867
   
868
+  /**
869
+   *
870
+   * @return type array
871
+   */
872
+  public function getDatas()
873
+  {
874
+    if ($this->datas === null)
875
+    {
876
+      return array();
877
+    }
878
+    return json_decode($this->datas, true);
879
+  }
880
+  
881
+  /**
882
+   *
883
+   * @param string $data_id
884
+   * @param ~ $default
885
+   * @return all 
886
+   */
887
+  public function getData($data_id, $default)
888
+  {
889
+    $datas = $this->getDatas();
890
+    if (array_key_exists($data_id, $datas))
891
+    {
892
+      return $datas[$data_id];
893
+    }
894
+    
895
+    return $default;
896
+  }
897
+  
898
+  
899
+  /**
900
+   *
901
+   * @param array $datas 
902
+   */
903
+  public function setDatas($datas)
904
+  {
905
+    $this->datas = json_encode($datas);
906
+  }
907
+  
908
+  /**
909
+   *
910
+   * @param string $data_id
911
+   * @param all $data_value 
912
+   */
913
+  public function setData($data_id, $data_value)
914
+  {
915
+    $datas = $this->getDatas();
916
+    $datas[$data_id] = $data_value;
917
+    $this->setDatas($datas);
918
+  }
919
+  
836 920
 }

+ 31 - 1
src/Muzich/CoreBundle/Extension/MyTwigExtension.php Bestand weergeven

@@ -26,7 +26,8 @@ class MyTwigExtension extends \Twig_Extension {
26 26
   public function getFunctions() {
27 27
     return array(
28 28
       'date_or_relative_date'  => new \Twig_Filter_Method($this, 'date_or_relative_date'),
29
-      'event_const'  => new \Twig_Filter_Method($this, 'event_const')
29
+      'event_const'            => new \Twig_Filter_Method($this, 'event_const'),
30
+      'css_list_length_class'  => new \Twig_Filter_Method($this, 'getCssLengthClassForList')
30 31
     );
31 32
   }
32 33
   
@@ -141,5 +142,34 @@ class MyTwigExtension extends \Twig_Extension {
141 142
     }
142 143
     return null;
143 144
   }
145
+  
146
+  /**
147
+   * Cette fonction retourne une classe CSS (string) permettant de donner
148
+   * de l'importance a des élements de liste en foncyion de leur position dans
149
+   * la liste.
150
+   * 
151
+   * @param int $position
152
+   * @param int $count
153
+   * @return string 
154
+   */
155
+  public function getCssLengthClassForList($position, $count)
156
+  {
157
+    // On établie 3 type de taille
158
+    // grand, moyen, standart
159
+    // chacun correspondant a 1/3
160
+    
161
+    if ($position <= $count/3)
162
+    {
163
+      return 'list_length_big';
164
+    }
165
+    elseif ($position <= ($count/3)*2)
166
+    {
167
+      return 'list_length_medium';
168
+    }
169
+    else
170
+    {
171
+      return 'list_length_default';
172
+    }
173
+  }
144 174
 
145 175
 }

+ 3 - 2
src/Muzich/CoreBundle/Resources/views/Tag/tagsList.favorite.html.twig Bestand weergeven

@@ -7,9 +7,10 @@
7 7
     'user_id': user_id, 
8 8
     'tags_ids_json' : ''
9 9
   }) }}" />
10
+         
10 11
   <ul id="favorite_tags">
11
-    {% for tag in tags %}
12
-      <li {% if loop.index0 > cloud_tags_limit_to_display %}style="display: none;"{% endif %}>
12
+    {% for key, tag in tags %}
13
+      <li class="{{ css_list_length_class(key, tags|length) }}" {% if loop.index0 > cloud_tags_limit_to_display %}style="display: none;"{% endif %}>
13 14
         <a id="filtering_tag_{{ tag.id }}" href="#" class="button tag">
14 15
           {{ tag.name }}
15 16
         </a>

+ 98 - 0
src/Muzich/CoreBundle/lib/Tag.php Bestand weergeven

@@ -0,0 +1,98 @@
1
+<?php
2
+
3
+namespace Muzich\CoreBundle\lib;
4
+
5
+/**
6
+ *  Boite a outils pour les Tags. 
7
+ */
8
+class Tag
9
+{
10
+  
11
+  /**
12
+   *
13
+   * @param array $elements Tableau d'éléments
14
+   * @return array Tableau de tags [0 => id_tag, 1 => id_tag] rangé du tag le 
15
+   * plus utilisé au tag le moins utilisé
16
+   */
17
+  public function getOrderedTagsWithElements($elements)
18
+  {
19
+    $tags_count = array();
20
+    $tags_ordered = array();
21
+    
22
+    foreach ($elements as $element)
23
+    {
24
+      foreach ($element->getTags() as $tag)
25
+      {
26
+        // Si on a déjà un compteur pour ce tag
27
+        if (array_key_exists($tag->getId(), $tags_count))
28
+        {
29
+          // On incrémente
30
+          $tags_count[$tag->getId()] = $tags_count[$tag->getId()] + 1;
31
+        }
32
+        else
33
+        {
34
+          // On commence le compteur
35
+          $tags_count[$tag->getId()] = 1;
36
+        }
37
+      }
38
+    }
39
+    
40
+    // On trie le tableau avec les valeurs décroissantes
41
+    // Comme les valeurs sont les count, on aura les tags les plus
42
+    // utilisés en haut du tableau
43
+    arsort($tags_count);
44
+    
45
+    foreach ($tags_count as $tag_id => $count)
46
+    {
47
+      $tags_ordered[] = $tag_id;
48
+    }
49
+    
50
+    return $tags_ordered;
51
+  }
52
+  
53
+  /**
54
+   * @desc Range une liste de tags [0 => Tag] en fonction d'une
55
+   * réfèrence sous la forme [0 => tag_id, 1 => tag_id]
56
+   * 
57
+   * @param array $tags
58
+   * @param array $reference 
59
+   * @return array
60
+   */
61
+  public function sortTagWithOrderedReference($tags, $reference)
62
+  {
63
+    // tableau des tags rangés
64
+    $tag_ordered = array();
65
+    // tableau des tags pas encore dans la référence
66
+    $tag_not_fond = array();
67
+    
68
+    foreach ($tags as $tag)
69
+    {
70
+      $position = array_search($tag->getId(), $reference);
71
+      // Si on l'a trouvé dans la réference
72
+      if ($position !== false)
73
+      {
74
+        // On le met dans le tableau des tags rangé, avec la clé de la réference
75
+        $tag_ordered[$position] = $tag;
76
+      }
77
+      else
78
+      {
79
+        // Si il n'étais pas dans la réference on le met en attente dans 
80
+        // ce tableau
81
+        $tag_not_fond[] = $tag;
82
+      }
83
+    }
84
+    
85
+    // Une fois les tags réferencés dans le tableau ordonné, on ajoute ceux qui
86
+    // ne l'était pas
87
+    foreach ($tag_not_fond as $tag)
88
+    {
89
+      $tag_ordered[] = $tag;
90
+    }
91
+    
92
+    // On trie le tableau en fonction des clés.
93
+    ksort($tag_ordered);
94
+    
95
+    return $tag_ordered;
96
+  }
97
+  
98
+}

+ 20 - 2
src/Muzich/FavoriteBundle/Controller/FavoriteController.php Bestand weergeven

@@ -7,6 +7,9 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
7 7
 use Muzich\CoreBundle\Entity\UsersElementsFavorites;
8 8
 use Muzich\CoreBundle\Searcher\ElementSearcher;
9 9
 use Muzich\CoreBundle\Propagator\EventElement;
10
+use Muzich\CoreBundle\Entity\User;
11
+use Muzich\CoreBundle\lib\Tag as TagLib;
12
+
10 13
 //use Muzich\CoreBundle\Entity\Group;
11 14
 //use Muzich\CoreBundle\Form\Group\GroupForm;
12 15
 //use Symfony\Component\HttpFoundation\Request;
@@ -42,7 +45,7 @@ class FavoriteController extends Controller
42 45
       )->getSingleResult();
43 46
     }
44 47
     
45
-    $em = $this->getDoctrine()->getEntityManager();
48
+    $em = $this->getEntityManager();
46 49
     
47 50
     if ($user->getPersonalHash() != $token || !is_numeric($id)
48 51
       || !($element = $em->getRepository('MuzichCoreBundle:Element')->findOneById($id))
@@ -71,7 +74,11 @@ class FavoriteController extends Controller
71 74
         $em->persist($user);
72 75
       }
73 76
       
77
+      // On signale que cet user a modifié sa liste de favoris
78
+      $user->setData(User::DATA_FAV_UPDATED, true);
79
+      
74 80
       $em->persist($favorite);
81
+      $em->persist($user);
75 82
       $em->flush();
76 83
     }
77 84
     
@@ -130,6 +137,9 @@ class FavoriteController extends Controller
130 137
         $event->removedFromFavorites($element);
131 138
       }
132 139
       
140
+      // On signale que cet user a modifié sa liste de favoris
141
+      $user->setData(User::DATA_FAV_UPDATED, true);
142
+      
133 143
       $em->persist($element->getOwner());
134 144
       $em->remove($fav);
135 145
       $em->flush();
@@ -160,16 +170,24 @@ class FavoriteController extends Controller
160 170
    */
161 171
   public function myListAction()
162 172
   {
173
+    $user = $this->getUser();
174
+    
163 175
     $search_object = $this->createSearchObject(array(
164
-      'user_id'  => $this->getUserId(),
176
+      'user_id'  => $user->getId(),
165 177
       'favorite' => true,
166 178
       'count'    => $this->container->getParameter('search_default_count')
167 179
     ));
168 180
     
181
+    // Récupération des tags
169 182
     $tags = $this->getDoctrine()->getRepository('MuzichCoreBundle:UsersElementsFavorites')
170 183
       ->getTags($this->getUserId(), $this->getUserId())      
171 184
     ;
172 185
     
186
+    // Organisation des tags en fonction de leurs utilisation
187
+    $tag_lib = new TagLib();
188
+    $tags = $tag_lib->sortTagWithOrderedReference($tags, 
189
+      $user->getData(User::DATA_TAGS_ORDER_PAGE_FAV, array()));
190
+    
173 191
     $tags_id = array();
174 192
     foreach ($tags as $tag)
175 193
     {

+ 7 - 0
src/Muzich/HomeBundle/Controller/ShowController.php Bestand weergeven

@@ -7,6 +7,8 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
7 7
 use Muzich\CoreBundle\Form\Element\ElementAddForm;
8 8
 use Muzich\CoreBundle\Entity\Element;
9 9
 use Muzich\CoreBundle\Searcher\ElementSearcher;
10
+use Muzich\CoreBundle\lib\Tag as TagLib;
11
+use Muzich\CoreBundle\Entity\User;
10 12
 
11 13
 class ShowController extends Controller
12 14
 {
@@ -30,6 +32,11 @@ class ShowController extends Controller
30 32
       ->getElementsTags($viewed_user->getId(), $this->getUserId())      
31 33
     ;
32 34
     
35
+    // Organisation des tags en fonction de leurs utilisation
36
+    $tag_lib = new TagLib();
37
+    $tags = $tag_lib->sortTagWithOrderedReference($tags, 
38
+    $viewed_user->getData(User::DATA_TAGS_ORDER_DIFF, array()));
39
+    
33 40
     $tags_id = array();
34 41
     foreach ($tags as $tag)
35 42
     {

+ 14 - 0
web/bundles/muzichcore/css/main.css Bestand weergeven

@@ -893,6 +893,20 @@ ul#favorite_tags li
893 893
   float:left; /*pour IE*/
894 894
 }
895 895
 
896
+ul#favorite_tags li.list_length_big a.button
897
+{
898
+  font-size: 16px;
899
+  padding-top: 2px;
900
+  padding-bottom: 2px;
901
+}
902
+
903
+ul#favorite_tags li.list_length_medium a.button
904
+{
905
+  font-size: 15px;
906
+  padding-top: 3px;
907
+  padding-bottom: 3px;
908
+}
909
+
896 910
 a.more
897 911
 {
898 912
   margin-top: 5px;