Source of file ListInfoRepository.php

Size: 2,392 Bytes - Last Modified: 2023-11-16T22:56:03+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/list-bundle/src/Repository/ListInfoRepository.php

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
<?php
namespace TIC\ListBundle\Repository;

use Doctrine\ORM\EntityRepository;
#use TIC\CoreBundle\Base\Repository as BaseRepository;

// TIC CoreBundle
use TIC\DormBundle\Base\TICRepository as BaseRepository;
use Doctrine\ORM\QueryBuilder;


/**
 * ListInfoRepository
 */
class ListInfoRepository extends BaseRepository
{

	/**
	 * @var Listing default order
	 */
	public $sortBy = array('ref' => 'ASC');

        /**
         * Application des filtres sur un query builder.
         *
         * @param  array  $filters
         * @param  mixed  $qb
         * @return QueryBuilder
         */
        public function qbFilters(array $filters = array(), $qb = null): QueryBuilder
	{
		$alias = is_string($qb) ? $qb : (isset($this->alias) ? $this->alias : 'a');
		if (! is_object($qb)) $qb = $this->createQueryBuilder($alias);

		foreach ($filters as $type => $value) switch ($type) {
			case 'editable':
			case 'valuable':
			case 'referable':
			case 'translatable':
			case 'deactivatable':
			case 'sortable':
			case 'iconable':
				if ($value !== null) $qb->andWhere($alias.'.'.$type.' = :'.$type)->setParameter($type, (bool)$value);
				break;
			case 'ref':
				if ($value) $qb->andWhere($alias.'.ref = :ref')->setParameter('ref', $value);
				break;
			case 'items':  // jointure avec hydratation des éléments
				if ($value) $qb->leftJoin($alias.'.items', 'i')->addSelect('i');
				break;
			case 'locale': // jointure avec hydratation des éléments avec leur traduction dans la locale
				if ($value) $qb->leftJoin($alias.'.items', 'i')->addSelect('i');
				if ($value) $qb->leftJoin('i.translations', 't', 'WITH', 't.locale = :locale')->addSelect('t')->setParameter('locale', $value);
				break;
		}
		return $qb;
	}


	/**
	 * Retourne une simple énumération des références des listes existantes.
	 */
	public function listReferences() {
		return $this->createQueryBuilder('a')->select('a.ref')->orderBy('a.ref')->getQuery()->getResult('column');
	}


	/**
	 * @TODO: key by label|value|ref|id ; label i18n ?
	 * Note: préférable d'utiliser une méthode du ListItemRepository ?
	 */
	public function getChoices($ref, $all=false) {
		$choices = array();

		$list = $this->find($ref);
		if ($list) foreach ($list->getItems() as $item) {
			if (! $all && ! $item->getEnabled()) continue;
			$choices[$item->getValue()] = $item->getLabel();
		}

		return $choices;
	}


}