vendor/lexik/form-filter-bundle/Event/Subscriber/AbstractDoctrineSubscriber.php line 103

Open in your IDE?
  1. <?php
  2. namespace Lexik\Bundle\FormFilterBundle\Event\Subscriber;
  3. use Lexik\Bundle\FormFilterBundle\Filter\FilterOperands;
  4. use Lexik\Bundle\FormFilterBundle\Filter\Form\Type\BooleanFilterType;
  5. use Lexik\Bundle\FormFilterBundle\Event\GetFilterConditionEvent;
  6. use Doctrine\DBAL\Connection;
  7. use Doctrine\DBAL\Types\Types;
  8. /**
  9. * Provide Doctrine ORM and DBAL filters.
  10. *
  11. * @author Cédric Girard <[email protected]>
  12. * @author Jeremy Barthe <[email protected]>
  13. */
  14. abstract class AbstractDoctrineSubscriber
  15. {
  16. /**
  17. * @param GetFilterConditionEvent $event
  18. */
  19. public function filterValue(GetFilterConditionEvent $event)
  20. {
  21. $expr = $event->getFilterQuery()->getExpr();
  22. $values = $event->getValues();
  23. if ('' !== $values['value'] && null !== $values['value']) {
  24. $paramName = $this->generateParameterName($event->getField());
  25. if (is_array($values['value']) && sizeof($values['value']) > 0) {
  26. $event->setCondition(
  27. $expr->in($event->getField(), ':'.$paramName),
  28. array($paramName => array($values['value'], Connection::PARAM_STR_ARRAY))
  29. );
  30. } elseif (!is_array($values['value'])) {
  31. $event->setCondition(
  32. $expr->eq($event->getField(), ':'.$paramName),
  33. array($paramName => array($values['value'], Types::STRING))
  34. );
  35. }
  36. }
  37. }
  38. /**
  39. * @param GetFilterConditionEvent $event
  40. */
  41. public function filterBoolean(GetFilterConditionEvent $event)
  42. {
  43. $expr = $event->getFilterQuery()->getExpr();
  44. $values = $event->getValues();
  45. if (!empty($values['value'])) {
  46. $paramName = $this->generateParameterName($event->getField());
  47. $value = (bool) (BooleanFilterType::VALUE_YES == $values['value']);
  48. $event->setCondition(
  49. $expr->eq($event->getField(), ':'.$paramName),
  50. array($paramName => array($value, Types::BOOLEAN))
  51. );
  52. }
  53. }
  54. /**
  55. * @param GetFilterConditionEvent $event
  56. */
  57. public function filterCheckbox(GetFilterConditionEvent $event)
  58. {
  59. $expr = $event->getFilterQuery()->getExpr();
  60. $values = $event->getValues();
  61. if (!empty($values['value'])) {
  62. $paramName = $this->generateParameterName($event->getField());
  63. $event->setCondition(
  64. $expr->eq($event->getField(), ':'.$paramName),
  65. array($paramName => array($values['value'], Types::STRING))
  66. );
  67. }
  68. }
  69. /**
  70. * @param GetFilterConditionEvent $event
  71. */
  72. public function filterDate(GetFilterConditionEvent $event)
  73. {
  74. $expr = $event->getFilterQuery()->getExpr();
  75. $values = $event->getValues();
  76. if ($values['value'] instanceof \DateTime) {
  77. $paramName = $this->generateParameterName($event->getField());
  78. $event->setCondition(
  79. $expr->eq($event->getField(), ':'.$paramName),
  80. array($paramName => array($values['value'], Types::DATE_MUTABLE))
  81. );
  82. }
  83. }
  84. /**
  85. * @param GetFilterConditionEvent $event
  86. */
  87. public function filterDateRange(GetFilterConditionEvent $event)
  88. {
  89. $expr = $event->getFilterQuery()->getExpressionBuilder();
  90. $values = $event->getValues();
  91. $value = $values['value'];
  92. if (isset($value['left_date'][0]) || isset($value['right_date'][0])) {
  93. $event->setCondition($expr->dateInRange($event->getField(), $value['left_date'][0], $value['right_date'][0]));
  94. }
  95. }
  96. /**
  97. * @param GetFilterConditionEvent $event
  98. */
  99. public function filterDateTime(GetFilterConditionEvent $event)
  100. {
  101. $expr = $event->getFilterQuery()->getExpr();
  102. $values = $event->getValues();
  103. if ($values['value'] instanceof \DateTime) {
  104. $paramName = $this->generateParameterName($event->getField());
  105. $event->setCondition(
  106. $expr->eq($event->getField(), ':'.$paramName),
  107. array($paramName => array($values['value'], Types::DATETIME_MUTABLE))
  108. );
  109. }
  110. }
  111. /**
  112. * @param GetFilterConditionEvent $event
  113. */
  114. public function filterDateTimeRange(GetFilterConditionEvent $event)
  115. {
  116. $expr = $event->getFilterQuery()->getExpressionBuilder();
  117. $values = $event->getValues();
  118. $value = $values['value'];
  119. if (isset($value['left_datetime'][0]) || $value['right_datetime'][0]) {
  120. $event->setCondition($expr->datetimeInRange($event->getField(), $value['left_datetime'][0], $value['right_datetime'][0]));
  121. }
  122. }
  123. /**
  124. * @param GetFilterConditionEvent $event
  125. */
  126. public function filterNumber(GetFilterConditionEvent $event)
  127. {
  128. $expr = $event->getFilterQuery()->getExpr();
  129. $values = $event->getValues();
  130. if ('' !== $values['value'] && null !== $values['value']) {
  131. $paramName = sprintf('p_%s', str_replace('.', '_', $event->getField()));
  132. $op = empty($values['condition_operator']) ? FilterOperands::OPERATOR_EQUAL : $values['condition_operator'];
  133. $event->setCondition(
  134. $expr->$op($event->getField(), ':'.$paramName),
  135. array($paramName => array($values['value'], is_int($values['value']) ? Types::INTEGER : Types::FLOAT))
  136. );
  137. }
  138. }
  139. /**
  140. * @param GetFilterConditionEvent $event
  141. */
  142. public function filterNumberRange(GetFilterConditionEvent $event)
  143. {
  144. $expr = $event->getFilterQuery()->getExpr();
  145. $values = $event->getValues();
  146. $value = $values['value'];
  147. $expression = $expr->andX();
  148. $params = array();
  149. if (isset($value['left_number'][0])) {
  150. $hasSelector = (FilterOperands::OPERAND_SELECTOR === $value['left_number']['condition_operator']);
  151. if (!$hasSelector && isset($value['left_number'][0])) {
  152. $leftValue = $value['left_number'][0];
  153. $leftCond = $value['left_number']['condition_operator'];
  154. } elseif ($hasSelector && isset($value['left_number'][0]['text'])) {
  155. $leftValue = $value['left_number'][0]['text'];
  156. $leftCond = $value['left_number'][0]['condition_operator'];
  157. }
  158. if (isset($leftValue, $leftCond)) {
  159. $leftParamName = sprintf('p_%s_left', str_replace('.', '_', $event->getField()));
  160. $expression->add($expr->$leftCond($event->getField(), ':'.$leftParamName));
  161. $params[$leftParamName] = array($leftValue, is_int($leftValue) ? Types::INTEGER : Types::FLOAT);
  162. }
  163. }
  164. if (isset($value['right_number'][0])) {
  165. $hasSelector = (FilterOperands::OPERAND_SELECTOR === $value['right_number']['condition_operator']);
  166. if (!$hasSelector && isset($value['right_number'][0])) {
  167. $rightValue = $value['right_number'][0];
  168. $rightCond = $value['right_number']['condition_operator'];
  169. } elseif ($hasSelector && isset($value['right_number'][0]['text'])) {
  170. $rightValue = $value['right_number'][0]['text'];
  171. $rightCond = $value['right_number'][0]['condition_operator'];
  172. }
  173. if (isset($rightValue, $rightCond)) {
  174. $rightParamName = sprintf('p_%s_right', str_replace('.', '_', $event->getField()));
  175. $expression->add($expr->$rightCond($event->getField(), ':'.$rightParamName));
  176. $params[$rightParamName] = array($rightValue, is_int($rightValue) ? Types::INTEGER : Types::FLOAT);
  177. }
  178. }
  179. if ($expression->count()) {
  180. $event->setCondition($expression, $params);
  181. }
  182. }
  183. /**
  184. * @param GetFilterConditionEvent $event
  185. */
  186. public function filterText(GetFilterConditionEvent $event)
  187. {
  188. $expr = $event->getFilterQuery()->getExpressionBuilder();
  189. $values = $event->getValues();
  190. if ('' !== $values['value'] && null !== $values['value']) {
  191. if (isset($values['condition_pattern'])) {
  192. $event->setCondition($expr->stringLike($event->getField(), $values['value'], $values['condition_pattern']));
  193. } else {
  194. $event->setCondition($expr->stringLike($event->getField(), $values['value']));
  195. }
  196. }
  197. }
  198. /**
  199. * @param string $field
  200. * @return string
  201. */
  202. protected function generateParameterName($field)
  203. {
  204. return sprintf('p_%s', str_replace('.', '_', $field));
  205. }
  206. }