/** * 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(); }