PageRenderTime 126ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/vendor/sonata-project/doctrine-orm-admin-bundle/Filter/AbstractDateFilter.php

https://gitlab.com/cuza/Clinic_Recods
PHP | 188 lines | 112 code | 32 blank | 44 comment | 28 complexity | a4d7d1582a6494e1204221882bead95d MD5 | raw file
  1. <?php
  2. /*
  3. * This file is part of the Sonata Project 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\Datagrid\ProxyQueryInterface;
  12. use Sonata\AdminBundle\Form\Type\Filter\DateRangeType;
  13. use Sonata\AdminBundle\Form\Type\Filter\DateType;
  14. abstract class AbstractDateFilter extends Filter
  15. {
  16. /**
  17. * Flag indicating that filter will have range.
  18. *
  19. * @var bool
  20. */
  21. protected $range = false;
  22. /**
  23. * Flag indicating that filter will filter by datetime instead by date.
  24. *
  25. * @var bool
  26. */
  27. protected $time = false;
  28. /**
  29. * {@inheritdoc}
  30. */
  31. public function filter(ProxyQueryInterface $queryBuilder, $alias, $field, $data)
  32. {
  33. // check data sanity
  34. if (!$data || !is_array($data) || !array_key_exists('value', $data)) {
  35. return;
  36. }
  37. if ($this->range) {
  38. // additional data check for ranged items
  39. if (!array_key_exists('start', $data['value']) || !array_key_exists('end', $data['value'])) {
  40. return;
  41. }
  42. if (!$data['value']['start'] || !$data['value']['end']) {
  43. return;
  44. }
  45. // date filter should filter records for the whole days
  46. if ($this->time === false) {
  47. if ($data['value']['start'] instanceof \DateTime) {
  48. $data['value']['start']->setTime(0, 0, 0);
  49. }
  50. if ($data['value']['end'] instanceof \DateTime) {
  51. $data['value']['end']->setTime(23, 59, 59);
  52. }
  53. }
  54. // transform types
  55. if ($this->getOption('input_type') === 'timestamp') {
  56. $data['value']['start'] = $data['value']['start'] instanceof \DateTime ? $data['value']['start']->getTimestamp() : 0;
  57. $data['value']['end'] = $data['value']['end'] instanceof \DateTime ? $data['value']['end']->getTimestamp() : 0;
  58. }
  59. // default type for range filter
  60. $data['type'] = !isset($data['type']) || !is_numeric($data['type']) ? DateRangeType::TYPE_BETWEEN : $data['type'];
  61. $startDateParameterName = $this->getNewParameterName($queryBuilder);
  62. $endDateParameterName = $this->getNewParameterName($queryBuilder);
  63. if ($data['type'] == DateRangeType::TYPE_NOT_BETWEEN) {
  64. $this->applyWhere($queryBuilder, sprintf('%s.%s < :%s OR %s.%s > :%s', $alias, $field, $startDateParameterName, $alias, $field, $endDateParameterName));
  65. } else {
  66. $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, '>=', $startDateParameterName));
  67. $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, '<=', $endDateParameterName));
  68. }
  69. $queryBuilder->setParameter($startDateParameterName, $data['value']['start']);
  70. $queryBuilder->setParameter($endDateParameterName, $data['value']['end']);
  71. } else {
  72. if (!$data['value']) {
  73. return;
  74. }
  75. // default type for simple filter
  76. $data['type'] = !isset($data['type']) || !is_numeric($data['type']) ? DateType::TYPE_EQUAL : $data['type'];
  77. // just find an operator and apply query
  78. $operator = $this->getOperator($data['type']);
  79. // transform types
  80. if ($this->getOption('input_type') === 'timestamp') {
  81. $data['value'] = $data['value'] instanceof \DateTime ? $data['value']->getTimestamp() : 0;
  82. }
  83. // null / not null only check for col
  84. if (in_array($operator, array('NULL', 'NOT NULL'))) {
  85. $this->applyWhere($queryBuilder, sprintf('%s.%s IS %s ', $alias, $field, $operator));
  86. return;
  87. }
  88. $parameterName = $this->getNewParameterName($queryBuilder);
  89. // date filter should filter records for the whole day
  90. if ($this->time === false && $data['type'] == DateType::TYPE_EQUAL) {
  91. $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, '>=', $parameterName));
  92. $queryBuilder->setParameter($parameterName, $data['value']);
  93. $endDateParameterName = $this->getNewParameterName($queryBuilder);
  94. $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, '<', $endDateParameterName));
  95. if ($this->getOption('input_type') === 'timestamp') {
  96. $endValue = strtotime('+1 day', $data['value']);
  97. } else {
  98. $endValue = clone $data['value'];
  99. $endValue->add(new \DateInterval('P1D'));
  100. }
  101. $queryBuilder->setParameter($endDateParameterName, $endValue);
  102. return;
  103. }
  104. $this->applyWhere($queryBuilder, sprintf('%s.%s %s :%s', $alias, $field, $operator, $parameterName));
  105. $queryBuilder->setParameter($parameterName, $data['value']);
  106. }
  107. }
  108. /**
  109. * Resolves DataType:: constants to SQL operators.
  110. *
  111. * @param int $type
  112. *
  113. * @return string
  114. */
  115. protected function getOperator($type)
  116. {
  117. $type = intval($type);
  118. $choices = array(
  119. DateType::TYPE_EQUAL => '=',
  120. DateType::TYPE_GREATER_EQUAL => '>=',
  121. DateType::TYPE_GREATER_THAN => '>',
  122. DateType::TYPE_LESS_EQUAL => '<=',
  123. DateType::TYPE_LESS_THAN => '<',
  124. DateType::TYPE_NULL => 'NULL',
  125. DateType::TYPE_NOT_NULL => 'NOT NULL',
  126. );
  127. return isset($choices[$type]) ? $choices[$type] : '=';
  128. }
  129. /**
  130. * {@inheritdoc}
  131. */
  132. public function getDefaultOptions()
  133. {
  134. return array(
  135. 'input_type' => 'datetime',
  136. );
  137. }
  138. /**
  139. * {@inheritdoc}
  140. */
  141. public function getRenderSettings()
  142. {
  143. $name = 'sonata_type_filter_date';
  144. if ($this->time) {
  145. $name .= 'time';
  146. }
  147. if ($this->range) {
  148. $name .= '_range';
  149. }
  150. return array($name, array(
  151. 'field_type' => $this->getFieldType(),
  152. 'field_options' => $this->getFieldOptions(),
  153. 'label' => $this->getLabel(),
  154. ));
  155. }
  156. }