| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920 | <?php
namespace Muzich\CoreBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use \Doctrine\Common\Collections\ArrayCollection;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\EntityManager;
use Muzich\CoreBundle\Entity\UsersTagsFavorites;
use Symfony\Component\Validator\Constraints as Assert;
use Muzich\CoreBundle\Validator as MuzichAssert;
use Muzich\CoreBundle\Entity\ElementTagsProposition;
use Muzich\CoreBundle\Entity\Tag;
/**
 * Cet entité est l'utilisateur ayant effectué la requête.
 * 
 * @ORM\Entity
 * @ORM\Table(name="m_user")
 * @ORM\Entity(repositoryClass="Muzich\CoreBundle\Repository\UserRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class User extends BaseUser
{
  
  /**
   * Data ordre des tags de sa page favoris
   * @var string 
   */
  const DATA_TAGS_ORDER_PAGE_FAV = "data_tags_order_page_fav";
  
  /**
   * Data ordre des tags de ses diffusions
   * @var string 
   */
  const DATA_TAGS_ORDER_DIFF     = "data_tags_order_diff";
  
  /**
   * Data, les favoris ont ils été modifiés
   * @var string 
   */
  const DATA_FAV_UPDATED         = "data_fav_updated";
  
  /**
   * Data, les favoris ont ils été modifiés
   * @var string 
   */
  const DATA_DIFF_UPDATED        = "data_diff_updated";
  
 /**
  * @ORM\Id
  * @ORM\Column(type="integer")
  * @ORM\generatedValue(strategy="AUTO")
  */
  protected $id;
  
  /**
   * @Gedmo\Slug(fields={"username"})
   * @ORM\Column(length=128, unique=true)
   */
  protected $slug;
  
  /**
   * @ORM\Column(type="text", nullable=true)
   * @ORM\Column(length=256)
   */
  protected $email_requested;
  
 /**
  * @ORM\Column(type="integer", nullable=true)
  */
  protected $email_requested_datetime;
  
  /**
   * Cet attribut contient les enregistrements UsersTagsFavorites lié 
   * a cet utilisateur dans le cadre des Tags Favoris.
   * 
   * @ORM\OneToMany(targetEntity="UsersTagsFavorites", mappedBy="user")
   */
  protected $tags_favorites;
  
  /**
   * Cet attribut contient les enregistrements UsersElementsFavorites lié 
   * a cet utilisateur dans le cadre des éléments Favoris.
   * 
   * @ORM\OneToMany(targetEntity="UsersElementsFavorites", mappedBy="user")
   */
  protected $elements_favorites;
  
  /**
   * Liste des Elements appartenant a cet utilisateur.
   * 
   * @ORM\OneToMany(targetEntity="Element", mappedBy="owner")
   */
  protected $elements;
  
  /**
   * Liste des propositions de tags effectués par cet utilisateur
   * 
   * @ORM\OneToMany(targetEntity="ElementTagsProposition", mappedBy="user")
   */
  protected $element_tags_propositions;
  
  /**
   * Users que cet utilisateur suit.
   * 
   * @ORM\OneToMany(targetEntity="FollowUser", mappedBy="follower")
   */
  protected $followeds_users;
  
  /**
   * Users qui suivent cet utilisateur.
   * 
   * @ORM\OneToMany(targetEntity="FollowUser", mappedBy="followed")
   */
  protected $followers_users;
  
  /**
   * Cet attribut contient les enregistrements FollowGroup lié 
   * a cet utilisateur dans le cadre des groupes suivis.
   * 
   * @ORM\OneToMany(targetEntity="FollowGroup", mappedBy="follower")
   */
  protected $followed_groups;
  
  /**
   * Liste des Groupes appartenant a cet utilisateur.
   * 
   * @ORM\OneToMany(targetEntity="Group", mappedBy="owner")
   */
  protected $groups_owned;
  
  /**
   * Compteur de signalements inutiles
   * 
   * @ORM\Column(type="integer", nullable=true)
   * @var int 
   */
  protected $bad_report_count;
  
  /**
   * Compteur de contenus refusés par la modération
   * 
   * @ORM\Column(type="integer", nullable=true)
   * @var int 
   */
  protected $moderated_element_count;
  
  /**
   * Compteur de contenus refusés par la modération
   * 
   * @ORM\Column(type="integer", nullable=true)
   * @var int 
   */
  protected $moderated_tag_count;
  
  /**
   * Compteur de contenus refusés par la modération
   * 
   * @ORM\Column(type="integer", nullable=true)
   * @var int 
   */
  protected $moderated_comment_count;
  /**
   * @ORM\Column(type="text", nullable=true)
   * @ORM\Column(length=256)
   */
  protected $town;
  /**
   * @ORM\Column(type="text", nullable=true)
   * @ORM\Column(length=128)
   */
  protected $country;
  
  /**
   * Reputation
   * 
   * @ORM\Column(type="integer", nullable=true)
   * @var int 
   */
  protected $reputation;
  
  /**
   * Liste des Events appartenant a cet utilisateur.
   * 
   * @ORM\OneToMany(targetEntity="Event", mappedBy="user")
   */
  protected $events;
  
  /**
   * Contient des données pratique pour par exemple influencer l'affichange dans twig.
   * 
   * @var array 
   */
  protected $live_datas = array();
  
  /**
   * Contient des données pratique, comme l'ordre des tags de sa page favoris etc.
   * 
   * @ORM\Column(type="text", nullable=true)
   * @var type string
   */
  protected $datas = null;
  
  /**
   * Tableau contenant les id => name des tags favoris
   * de l'user. Ces donnée sont faites pour optimiser les calculs.
   * Ce chamsp est mis ajour a chaque fois qu'un UsersTagsFavorite est manipulé.
   * 
   * @ORM\Column(type="text", unique=false, nullable=true)
   * @var array 
   */
  private $tags_favorites_quick;
  
  /**
   * 
   */
  public function __construct()
  {
    $this->tags_favorites = new ArrayCollection();
    $this->elements = new ArrayCollection();
    $this->elements_favorites = new ArrayCollection();
    $this->followeds_users = new ArrayCollection();
    $this->followers_users = new ArrayCollection();
    $this->followed_groups = new ArrayCollection();
    $this->groups = new ArrayCollection();
    $this->groups_owned = new ArrayCollection();
    parent::__construct();
  }
  
  public function __toString()
  {
    return $this->getName();
  }
  /**
   * Get id
   *
   * @return integer 
   */
  public function getId()
  {
    return $this->id;
  }
  /**
   * Get tags_favorites
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getTagsFavorites()
  {
    return $this->tags_favorites;
  }
  
  /**
   * Add tags_favorites
   *
   * @param UsersTagsFavorites $tagsFavorites
   */
  public function addUsersTagsFavorites(UsersTagsFavorites $tagsFavorites)
  {
    $this->tags_favorites[] = $tagsFavorites;
  }
  
  /**
   * Add elements_favorites
   *
   * @param UsersElementsFavorites $elementsFavorites
   */
  public function addUsersElementsFavorites(UsersElementsFavorites $elementsFavorites)
  {
    $this->elements_favorites[] = $elementsFavorites;
  }
  /**
   * Get elements_favorites
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getElementsFavorites()
  {
    return $this->elements_favorites;
  }
  /**
   * Add elements
   *
   * @param Element $elements
   */
  public function addElement(Element $elements)
  {
    $this->elements[] = $elements;
  }
  /**
   * Get elements
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getElements()
  {
    return $this->elements;
  }
  /**
   * Add elements
   *
   * @param Element $elements
   */
  public function addElementTagsProposition(ElementTagsProposition $proposition)
  {
    $this->element_tags_propositions[] = $proposition;
  }
  /**
   * Get elements
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getElementTagsPropositions()
  {
    return $this->element_tags_propositions;
  }
  /**
   * Add followeds_users
   *
   * @param FollowUser $followedsUsers
   */
  public function addFollowUser(FollowUser $followedsUsers)
  {
    $this->followeds_users[] = $followedsUsers;
  }
  /**
   * Get followeds_users
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getFollowedsUsers()
  {
    $users = array();
    foreach ($this->followeds_users as $follow_user)
    {
      $users[] = $follow_user->getFollowed();
    }
    return $users;
  }
  /**
   * Get followers_users
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getFollowersUsers()
  {
    $users = array();
    foreach ($this->followers_users as $follow_user)
    {
      $users[] = $follow_user->getFollower();
    }
    return $users;
  }
  /**
   * Add followed_groups
   *
   * @param FollowGroup $followedGroups
   */
  public function addFollowGroup(FollowGroup $followedGroups)
  {
    $this->followed_groups[] = $followedGroups;
  }
  /**
   * Get followed_groups
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getFollowedGroups()
  {
    $groups = array();
    foreach ($this->followed_groups as $follow_group)
    {
      $groups[] = $follow_group->getGroup();
    }
    return $groups;
  }
  /**
   * Add groups
   *
   * @param Group $groups
   */
  public function addGroupOwned(Group $groups)
  {
    $this->groups[] = $groups;
  }
  /**
   * Get groups
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getGroupsOwned()
  {
    return $this->groups_owned;
  }
  /**
   * Get groups in array (id => name)
   *
   * @return Doctrine\Common\Collections\Collection 
   */
  public function getGroupsOwnedArray()
  {
    $groups = array();
    foreach ($this->groups_owned as $group)
    {
      $groups[$group->getId()] = $group->getName();
    }
    return $groups;
  }
  
  public function getSlug()
  {
    return $this->slug;
  }
  
  public function setSlug($slug)
  {
    $this->slug = $slug;
  }
  
  public function getEmailRequested()
  {
    return $this->email_requested;
  }
  
  public function setEmailRequested($email_requested)
  {
    $this->email_requested = $email_requested;
  }
  
  public function getBadReportCount()
  {
    return $this->bad_report_count;
  }
  
  public function setBadReportCount($count)
  {
    $this->bad_report_count = $count;
  }
  
  public function addBadReport()
  {
    $this->setBadReportCount($this->getBadReportCount()+1);
  }
  
  public function getTown()
  {
    return $this->town;
  }
  
  public function setTown($town)
  {
    $this->town = $town;
  }
  
  public function getCountry()
  {
    return $this->country;
  }
  
  public function setCountry($country)
  {
    $this->country = $country;
  }
  
  public function setReputation($reputation)
  {
    $this->reputation = $reputation;
  }
  
  public function getReputation()
  {
    if ($this->reputation === null)
    {
      return 0;
    }
    return $this->reputation;
  }
  
  public function getEvents()
  {
    return $this->events;
  }
  
  public function setEvents($events)
  {
    $this->events = $events;
  }
  
  public function getModeratedElementCount()
  {
    if ($this->moderated_element_count === null)
    {
      return 0;
    }
    return $this->moderated_element_count;
  }
  
  public function setModeratedElementCount($count)
  {
    $this->moderated_element_count = $count;
  }
  
  public function addModeratedElementCount()
  {
    $this->setModeratedElementCount($this->getModeratedElementCount()+1);
  }
  
  public function getModeratedTagCount()
  {
    if ($this->moderated_tag_count === null)
    {
      return 0;
    }
    return $this->moderated_tag_count;
  }
  
  public function setModeratedTagCount($count)
  {
    $this->moderated_tag_count = $count;
  }
  
  public function addModeratedTagCount()
  {
    $this->setModeratedTagCount($this->getModeratedTagCount()+1);
  }
  
  public function getModeratedCommentCount()
  {
    if ($this->moderated_comment_count === null)
    {
      return 0;
    }
    return $this->moderated_comment_count;
  }
  
  public function setModeratedCommentCount($count)
  {
    $this->moderated_comment_count = $count;
  }
  
  public function addModeratedCommentCount()
  {
    $this->setModeratedCommentCount($this->getModeratedCommentCount()+1);
  }
  
  /*
   * 
   * 
   */
  
  public function getName()
  {
    return $this->getUsername();
  }
  
//  public function getLocalisationExploded()
//  {
//    $town = null;
//    $country = null;
//    if ($this->localisation)
//    {
//      if (($explode = explode(', ', $this->localisation)))
//      {
//        $town = $explode[0];
//        $country = $explode[1];
//      }
//    }
//    return array(
//      'town'    => $town,
//      'country' => $country
//    );
//  }
//  
//  public function setLocalisationExploded($town, $country)
//  {
//    $town = str_replace(', ', '', $town);
//    $town = str_replace(',', '', $town);
//    $country = str_replace(', ', '', $country);
//    $country = str_replace(',', '', $country);
//    
//    $this->localisation = $town. ', ' .$country;
//  }
  
//  /**
//  * @ORM\prePersist
//  */
//  public function setSlug()
//  {
//    if (!$this->slug)
//    {
//      
//    }
//  }
//  
  /**
   * Retourn si l'user_id transmis fait partis des enregistrements
   * followed de l'objet.
   * 
   * @param int $user_id 
   * @return boolean
   */
  public function isFollowingUser($user_id)
  {
    foreach ($this->followeds_users as $followed_user)
    {
      if ($followed_user->getFollowed()->getId() == $user_id)
      {
        return true;
      }
    }
    return false;
  }
  
  /**
   * Retourn si l'user_id transmis est l'un des User suivis
   * 
   * @param Symfony\Bundle\DoctrineBundle\Registry doctrine
   * @param int $user_id 
   * @return boolean
   */
  public function isFollowingUserByQuery($doctrine, $user_id)
  {
    return $doctrine
      ->getRepository('MuzichCoreBundle:User')
      ->isFollowingUser($this->getId(), $user_id)
    ;
  }
  
  /**
   * Retourn si l'group_id transmis est l'un des groupe suivis
   * 
   * @param Symfony\Bundle\DoctrineBundle\Registry doctrine
   * @param int $user_id 
   * @return boolean
   */
  public function isFollowingGroupByQuery($doctrine, $group_id)
  {
    return $doctrine
      ->getRepository('MuzichCoreBundle:User')
      ->isFollowingGroup($this->getId(), $group_id)
    ;
  }
  
  public function getPersonalHash($salt_context = null)
  {
    return hash('sha256', $this->getSalt().$this->getUsername().$salt_context);
  }
  
  /**
   * Ajoute a l'user les tags transmis (id) comme favoris.
   * 
   * @param EntityManager $em 
   * @param array $ids 
   */
  public function updateTagsFavoritesById(EntityManager $em, $ids)
  {
    $ids = json_decode($ids);
    $ids_to_add = $ids;
    
    // Pour chacun des tags favoris 
    foreach ($this->tags_favorites as $ii => $tag_favorite)
    {
      $trouve = false;
      foreach ($ids as $i => $id)
      {
        if ($id == $tag_favorite->getTag()->getId())
        {
          $trouve = true;
          // Si le tag était favoris déjà avant (et aussi maintenant)
          // il ne sera ni a ajouter, ni a supprimer.
          unset($ids_to_add[$i]);
        }
      }
      
      if (!$trouve)
      {
        // Si cet ancien tag n'est plus dans la liste, il faut le supprimer
        // (rappel: on supprime ici la relation, pas le tag)
        $em->remove($tag_favorite);
      }
    }
    
    if (count($ids_to_add))
    {
      $ids_to_add = array_merge($ids_to_add);
      $tag_favorite_position_max = $this->getTagFavoritePositionMax();
      $tags = $em->getRepository('MuzichCoreBundle:Tag')->findByIds($ids_to_add)->execute();
      
      // Pour les nouveaux ids restants
      foreach ($tags as $tag)
      {      
        $tag_favorite = new UsersTagsFavorites();
        $tag_favorite->setUser($this);
        $tag_favorite->setTag($tag);
        $tag_favorite->setPosition($tag_favorite_position_max);
        $tag_favorite_position_max++;
        $this->addUsersTagsFavorites($tag_favorite);
        $em->persist($tag_favorite);
      }
    }
    
    $em->flush();
  }
  
  /**
   * Retourne un tableau contenant les ids des tags préférés de l'user
   * 
   * @return type array
   */
  public function getTagFavoriteIds()
  {
    $ids = array();
    foreach ($this->tags_favorites as $tag_favorite)
    {
      $ids[$tag_favorite->getTag()->getId()] = $tag_favorite->getTag()->getId();
    }
    return $ids;
  }
  
  /**
   * Retourne la position max des tag favoris.
   * 
   * @return int 
   */
  public function getTagFavoritePositionMax()
  {
    $max = 0;
    foreach ($this->tags_favorites as $tag_favorite)
    {
      if ($tag_favorite->getPosition() > $max)
      {
        $max = $tag_favorite->getPosition();
      }
    }
    return $max;
  }
  /**
   * Set email_requested_datetime
   *
   * @param integer $emailRequestedDatetime
   */
  public function setEmailRequestedDatetime($emailRequestedDatetime)
  {
    $this->email_requested_datetime = $emailRequestedDatetime;
  }
  /**
   * Get email_requested_datetime
   *
   * @return integer 
   */
  public function getEmailRequestedDatetime()
  {
    return $this->email_requested_datetime;
  }
  
  public function addLiveData($id, $data)
  {
    $this->live_datas[$id] = $data;
  }
  
  public function removeLiveData($id)
  {
    if (array_key_exists($id, $this->live_datas))
    {
      unset($this->live_datas[$id]);
    }
  }
  
  public function hasLiveData($id, $data = null)
  {
    if (array_key_exists($id, $this->live_datas))
    {
      if ($this->live_datas[$id] == $data)
      {
        return true;
      }
    }
    return false;
  }
  
  public function getTagsFavoritesQuick()
  {
    if ($this->tags_favorites_quick == null)
    {
      return array();
    }
    
    return json_decode($this->tags_favorites_quick, true);
  }
  
  /**
   * 
   * @param array $tags_favorites_quick (id => name)
   */
  public function setTagsFavoritesQuick($tags_favorites_quick)
  {
    $this->tags_favorites_quick = json_encode($tags_favorites_quick);
  }
  
  /**
   * 
   * @param \Muzich\CoreBundle\Entity\Tag $tag
   */
  public function addTagFavoriteQuick(Tag $tag)
  {
    $tags_favorites_quick = $this->getTagsFavoritesQuick();
    if (!array_key_exists($tag->getId(), $tags_favorites_quick))
    {
      $tags_favorites_quick[$tag->getId()] = $tag->getName();
    }
    $this->setTagsFavoritesQuick($tags_favorites_quick);
  }
  
  /**
   * 
   * @param \Muzich\CoreBundle\Entity\Tag $tag
   */
  public function removeTagFavoriteQuick(Tag $tag)
  {
    $tags_favorites_quick = $this->getTagsFavoritesQuick();
    if (array_key_exists($tag->getId(), $tags_favorites_quick))
    {
      unset($tags_favorites_quick[$tag->getId()]);
    }
    $this->setTagsFavoritesQuick($tags_favorites_quick);
  }
  
  /**
   * Retourne vrai si le tag_id transmis fait partis des tags favoris de 
   * l'utilisateur
   * 
   * @param int $tag_id
   * @return boolean
   */
  public function haveTagsFavorite($tag_id)
  {
    $tags_favorites_quick = $this->getTagsFavoritesQuick();
    if (array_key_exists($tag_id, $tags_favorites_quick))
    {
      return true;
    }
    
    return false;
  }
  
  /**
   *
   * @return type array
   */
  public function getDatas()
  {
    if ($this->datas === null)
    {
      return array();
    }
    return json_decode($this->datas, true);
  }
  
  /**
   *
   * @param string $data_id
   * @param ~ $default
   * @return all 
   */
  public function getData($data_id, $default)
  {
    $datas = $this->getDatas();
    if (array_key_exists($data_id, $datas))
    {
      return $datas[$data_id];
    }
    
    return $default;
  }
  
  
  /**
   *
   * @param array $datas 
   */
  public function setDatas($datas)
  {
    $this->datas = json_encode($datas);
  }
  
  /**
   *
   * @param string $data_id
   * @param all $data_value 
   */
  public function setData($data_id, $data_value)
  {
    $datas = $this->getDatas();
    $datas[$data_id] = $data_value;
    $this->setDatas($datas);
  }
  
}
 |