ModelFilter.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 Doctrine\Common\Collections\Collection;
  12. use Doctrine\ORM\Mapping\ClassMetadataInfo;
  13. use Sonata\AdminBundle\Form\Type\EqualType;
  14. class ModelFilter extends Filter
  15. {
  16. /**
  17. * @param QueryBuilder $queryBuilder
  18. * @param string $alias
  19. * @param string $field
  20. * @param mixed $data
  21. * @return
  22. */
  23. public function filter($queryBuilder, $alias, $field, $data)
  24. {
  25. if (!$data || !is_array($data) || !array_key_exists('value', $data)) {
  26. return;
  27. }
  28. if ($data['value'] instanceof Collection) {
  29. $this->handleMultiple($queryBuilder, $alias, $field, $data);
  30. } else {
  31. $this->handleModel($queryBuilder, $alias, $field, $data);
  32. }
  33. }
  34. protected function handleMultiple($queryBuilder, $alias, $field, $data)
  35. {
  36. if ($data['value']->count() == 0) {
  37. return;
  38. }
  39. $parameterName = $this->getNewParameterName();
  40. if (isset($data['type']) && $data['type'] == EqualType::TYPE_IS_NOT_EQUAL) {
  41. $this->applyWhere($queryBuilder, $queryBuilder->expr()->notIn($alias, ':'.$parameterName));
  42. } else {
  43. $this->applyWhere($queryBuilder, $queryBuilder->expr()->in($alias, ':'.$parameterName));
  44. }
  45. $queryBuilder->setParameter($parameterName, $data['value']->toArray());
  46. }
  47. protected function handleModel($queryBuilder, $alias, $field, $data)
  48. {
  49. if (empty($data['value'])) {
  50. return;
  51. }
  52. $parameterName = $this->getNewParameterName();
  53. if (isset($data['type']) && $data['type'] == EqualType::TYPE_IS_NOT_EQUAL) {
  54. $this->applyWhere($queryBuilder, sprintf('%s != :%s', $alias, $parameterName));
  55. } else {
  56. $this->applyWhere($queryBuilder, sprintf('%s = :%s', $alias, $parameterName));
  57. }
  58. $queryBuilder->setParameter($parameterName, $data['value']);
  59. }
  60. protected function association($queryBuilder, $data)
  61. {
  62. list($alias, $field) = parent::association($queryBuilder, $data);
  63. $types = array(
  64. ClassMetadataInfo::ONE_TO_ONE,
  65. ClassMetadataInfo::ONE_TO_MANY,
  66. ClassMetadataInfo::MANY_TO_MANY,
  67. ClassMetadataInfo::MANY_TO_ONE,
  68. );
  69. if (!in_array($this->getOption('mapping_type'), $types)) {
  70. throw new \RunTimeException('Invalid mapping type');
  71. }
  72. $newAlias = $alias.'_'.$field;
  73. $queryBuilder->leftJoin(sprintf('%s.%s', $alias, $field), $newAlias);
  74. return array($newAlias, false);
  75. }
  76. public function getDefaultOptions()
  77. {
  78. return array(
  79. 'mapping_type' => false,
  80. 'field_name' => false,
  81. 'field_type' => 'entity',
  82. 'field_options' => array(),
  83. 'operator_type' => 'sonata_type_equal',
  84. 'operator_options' => array(),
  85. );
  86. }
  87. public function getRenderSettings()
  88. {
  89. return array('sonata_type_filter_default', array(
  90. 'field_type' => $this->getFieldType(),
  91. 'field_options' => $this->getFieldOptions(),
  92. 'operator_type' => $this->getOption('operator_type'),
  93. 'operator_options' => $this->getOption('operator_options'),
  94. 'label' => $this->getLabel()
  95. ));
  96. }
  97. }