Filter.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. /*
  3. * This file is part of the Sonata package.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Sonata\DoctrineORMAdminBundle\Filter;
  11. use Sonata\AdminBundle\Filter\Filter as BaseFilter;
  12. abstract class Filter extends BaseFilter
  13. {
  14. protected $active = false;
  15. public function apply($queryBuilder, $value)
  16. {
  17. $this->value = $value;
  18. list($alias, $field) = $this->association($queryBuilder, $value);
  19. $this->filter($queryBuilder, $alias, $field, $value);
  20. }
  21. protected function association($queryBuilder, $value)
  22. {
  23. $parentAssociationMappings = $this->getParentAssociationMappings();
  24. $alias = $this->getOption('alias', $queryBuilder->getRootAlias());
  25. $newAlias = 's_'.$alias;
  26. foreach($parentAssociationMappings as $parentAssociationMapping){
  27. $newAlias .= '_'.$parentAssociationMapping['fieldName'];
  28. $queryBuilder->leftJoin(sprintf('%s.%s', $alias, $parentAssociationMapping['fieldName']), $newAlias);
  29. $alias = $newAlias;
  30. }
  31. return array($alias, $this->getFieldName());
  32. }
  33. protected function applyWhere($queryBuilder, $parameter)
  34. {
  35. if ($this->getCondition() == self::CONDITION_OR) {
  36. $queryBuilder->orWhere($parameter);
  37. } else {
  38. $queryBuilder->andWhere($parameter);
  39. }
  40. // filter is active since it's added to the queryBuilder
  41. $this->active = true;
  42. }
  43. protected function getNewParameterName($queryBuilder)
  44. {
  45. // dots are not accepted in a DQL identifier so replace them
  46. // by underscores.
  47. return str_replace('.', '_', $this->getName()).'_'.$queryBuilder->getUniqueParameterId();
  48. }
  49. public function isActive()
  50. {
  51. return $this->active;
  52. }
  53. }