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($valueTypes::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($leftValueis_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($rightValueis_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. }