Пример #1
0
 /**
  * Big user search method ! hell yeah !
  */
 public function searchPartialList($searches, $page, $limit, $count = false)
 {
     $baseFieldsName = User::getUserSearchableFields();
     $facetFields = $this->objectManager->getRepository('ClarolineCoreBundle:Facet\\FieldFacet')->findAll();
     $facetFieldsName = array();
     foreach ($facetFields as $facetField) {
         $facetFieldsName[] = $facetField->getName();
     }
     $qb = $this->objectManager->createQueryBuilder();
     $count ? $qb->select('count(u)') : $qb->select('u');
     $qb->from('Claroline\\CoreBundle\\Entity\\User', 'u')->where('u.isEnabled = true');
     //Admin can see everything, but the others... well they can only see their own organizations.
     if (!$this->container->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
         $currentUser = $this->container->get('security.token_storage')->getToken()->getUser();
         $qb->leftJoin('u.organizations', 'uo');
         $qb->leftJoin('uo.administrators', 'ua');
         $qb->andWhere('ua.id = :userId');
         $qb->setParameter('userId', $currentUser->getId());
     }
     foreach ($searches as $key => $search) {
         foreach ($search as $id => $el) {
             if (in_array($key, $baseFieldsName)) {
                 $qb->andWhere("UPPER (u.{$key}) LIKE :{$key}{$id}");
                 $qb->setParameter($key . $id, '%' . strtoupper($el) . '%');
             } elseif (in_array($key, $facetFieldsName)) {
                 $qb->join('u.fieldsFacetValue', "ffv{$id}");
                 $qb->join("ffv{$id}.fieldFacet", "f{$id}");
                 $qb->andWhere("UPPER (ffv{$id}.stringValue) LIKE :{$key}{$id}");
                 $qb->orWhere("ffv{$id}.floatValue = :{$key}{$id}");
                 $qb->andWhere("f{$id}.name LIKE :facet{$id}");
                 $qb->setParameter($key . $id, '%' . strtoupper($el) . '%');
                 $qb->setParameter("facet{$id}", $key);
             } elseif ($key === 'group_name') {
                 $qb->join('u.groups', "g{$id}");
                 $qb->andWhere("UPPER (g{$id}.name) LIKE :{$key}{$id}");
                 $qb->setParameter($key . $id, '%' . strtoupper($el) . '%');
             }
             if ($key === 'group_id') {
                 $qb->join('u.groups', "g{$id}");
                 $qb->andWhere("g{$id}.id = :{$key}{$id}");
                 $qb->setParameter($key . $id, $el);
             }
             if ($key === 'organization_name') {
                 $qb->join('u.organizations', "o{$id}");
                 $qb->andWhere("UPPER (o{$id}.name) LIKE :{$key}{$id}");
                 $qb->setParameter($key . $id, '%' . strtoupper($el) . '%');
             }
             if ($key === 'organization_id') {
                 $qb->join('u.organizations', "o{$id}");
                 $qb->andWhere('o{$id}.id = :id');
                 $qb->setParameter($key . $id, $el);
             }
         }
     }
     $event = $this->strictEventDispatcher->dispatch('user_edit_search_event', 'UserEditSearch', array($qb));
     $query = $qb->getQuery();
     if ($page !== null && $limit !== null && !$count) {
         $query->setMaxResults($limit);
         $query->setFirstResult($page * $limit);
     }
     return $count ? $query->getSingleScalarResult() : $query->getResult();
 }