1: <?php
2: namespace TIC\ListBundle\Repository;
3:
4: #use Doctrine\ORM\EntityRepository;
5: #use TIC\CoreBundle\Base\Repository as BaseRepository;
6:
7: // TIC CoreBundle
8: use TIC\DormBundle\Base\TICRepository as BaseRepository;
9: use Doctrine\ORM\QueryBuilder;
10:
11: /**
12: * ListItemRepository
13: */
14: class ListItemRepository extends BaseRepository
15: {
16:
17: /**
18: * @var Listing default order
19: */
20: public $sortBy = array('ranking' => 'ASC', 'label' => 'ASC');
21:
22: /**
23: * Application des filtres sur un query builder.
24: *
25: * @param array $filters
26: * @param mixed $qb
27: * @return QueryBuilder
28: */
29: public function qbFilters(array $filters = array(), $qb = null): QueryBuilder
30: {
31: $alias = is_string($qb) ? $qb : (isset($this->alias) ? $this->alias : 'a');
32: $qb = parent::qbFilters($filters, $qb);
33:
34: foreach ($filters as $type => $value) switch ($type) {
35: # case 'enabled': if ($value !== null) $qb->andWhere("a.enabled = :enabled")->setParameter('enabled', $value); break;
36: # case 'locales': // jointure avec hydratation de toutes les traductions des libélés
37: # case 'locale': // jointure avec hydratation de la traduction dans la locale des libellés
38: # case 'allorcur':
39: case 'allorval':
40: if ($value === true) break;
41: if ($value === null || $value === false) { $qb->andWhere($alias.'.enabled = true'); break; }
42: $qb->andWhere('('.$alias.'.enabled = true OR '.$alias.'.value = :curval)')->setParameter('curval', is_object($value)?$value->getValue():$value);
43: break;
44:
45: case 'list' :
46: case 'info' : if ($value) $qb->andWhere($alias.'.info = :info')->setParameter('info', $value); break;
47: case 'ref' :
48: case 'value' : if ($value) $qb->andWhere($alias.'.'.$type.' = :'.$type)->setParameter($type, $value); break;
49: }
50: return $qb;
51: }
52:
53:
54: /**
55: * Retourne le QueryBuilder pour récupérer les éléments d'une liste donnée.
56: */
57: public function qbList($list, $all_or_current = false, $locale = true) {
58: $filters = array(
59: 'list' => $list,
60: 'allorcur' => $all_or_current,
61: # 'allorval' => $all_or_current,
62: 'locale' => $locale,
63: );
64: return $this->qbFilters($filters)->orderBy('a.ranking', 'ASC')->addOrderBy('a.label', 'ASC');
65: }
66:
67:
68: /**
69: * Retourne les valeurs et libelés des éléments disponibles d'une liste donnée.
70: */
71: public function listChoices($list, $locale = 'fr') {
72: $filters = array(
73: 'list' => $list,
74: 'locale' => $locale,
75: 'enabled' => true,
76: );
77: return $this->qbFilters($filters)->select('a.value, COALESCE(atrans.label, a.label)')
78: ->orderBy('a.ranking', 'ASC')->addOrderBy('atrans.label', 'ASC')->addOrderBy('a.label', 'ASC')
79: ->getQuery()->getResult('keyval')
80: ;
81: }
82:
83:
84: /**
85: * Retourne une liste d'entités en fonction des filtres personnalisés (cf. qbFilters).
86: * @param array $filters Filtres optionnels pour la recherche via qbFilters
87: * @return array Liste triée de tous les éléments correspondants
88: */
89: public function listJoinAll($filters = array()) {
90: if (! isset($filters['locale'])) $filters['locales'] = true;
91: return $this->qbFilters($filters)->orderBy('a.ranking', 'ASC')->addOrderBy('a.label', 'ASC')->getQuery()->getResult();
92: }
93:
94: /**
95: * Retourne une entité en fonction des filtres personnalisés (cf. qbFilters).
96: */
97: public function getOne($filters = array()) {
98: return $this->qbFilters($filters)->getQuery()->getOneOrNullResult();
99: }
100:
101: }
102: