/** * @param GetFilterConditionEvent $event * @throws \Exception */ public function filterEntity(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpr(); $values = $event->getValues(); if (is_object($values['value'])) { $paramName = $this->generateParameterName($event->getField()); if ($values['value'] instanceof Collection) { $ids = array(); foreach ($values['value'] as $value) { if (!is_callable(array($value, 'getId'))) { throw new \RuntimeException(sprintf('Can\'t call method "getId()" on an instance of "%s"', get_class($value))); } $ids[] = $value->getId(); } if (count($ids) > 0) { $event->setCondition($expr->in($event->getField(), ':' . $paramName), array($paramName => array($ids, Connection::PARAM_INT_ARRAY))); } } else { if (!is_callable(array($values['value'], 'getId'))) { throw new \RuntimeException(sprintf('Can\'t call method "getId()" on an instance of "%s"', get_class($values['value']))); } $event->setCondition($expr->eq($event->getField(), ':' . $paramName), array($paramName => array($values['value']->getId(), Type::INTEGER))); } } }
/** * @param GetFilterConditionEvent $event * @throws \Exception */ public function filterEntity(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpr(); $values = $event->getValues(); if (is_object($values['value'])) { $paramName = $this->generateParameterName($event->getField()); $filterField = $event->getField(); /** * @var QueryBuilder $queryBuilder */ $queryBuilder = $event->getQueryBuilder(); if ($dqlFrom = $event->getQueryBuilder()->getDQLPart('from')) { $rootPart = reset($dqlFrom); $fieldName = ltrim($event->getField(), $rootPart->getAlias() . '.'); $metadata = $queryBuilder->getEntityManager()->getClassMetadata($rootPart->getFrom()); if (isset($metadata->associationMappings[$fieldName]) and (!$metadata->associationMappings[$fieldName]['isOwningSide'] or $metadata->associationMappings[$fieldName]['type'] == ClassMetadataInfo::MANY_TO_MANY)) { $queryBuilder->leftJoin($event->getField(), $fieldName); $filterField = $fieldName; } } if ($values['value'] instanceof Collection) { $ids = array(); foreach ($values['value'] as $value) { $ids[] = $this->getValueIdentifier($value); } if (count($ids) > 0) { $event->setCondition($expr->in($filterField, ':' . $paramName), array($paramName => array($ids, Connection::PARAM_INT_ARRAY))); } } else { $event->setCondition($expr->eq($filterField, ':' . $paramName), array($paramName => array($this->getValueIdentifier($values['value']), Type::INTEGER))); } } }
/** * Apply a filter for a filter_autcomplete type. * This method should work whih both ORM and DBAL query builder. * * @param GetFilterConditionEvent $event */ public function filterAutocomplete(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpr(); $values = $event->getValues(); if ('' !== $values['value'] && null !== $values['value']) { $paramName = str_replace('.', '_', $event->getField()); $event->setCondition($expr->eq($event->getField(), ':' . $paramName), array($paramName => $values['value'])); } }
/** * filterDateTimeTextRange * * @param GetFilterConditionEvent $event */ public function filterDateTimeTextRange(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpressionBuilder(); $values = $event->getValues(); $value = $values['value']; if (isset($value['left_datetime']) || $value['right_datetime']) { $event->setCondition($expr->datetimeInRange($event->getField(), $value['left_datetime'], $value['right_datetime'])); } }
/** * Apply a filter for a filter_locale type. * * This method should work whih both ORM and DBAL query builder. */ public function filterTextLike(GetFilterConditionEvent $event) { $qb = $event->getQueryBuilder(); $expr = $event->getFilterQuery()->getExpressionBuilder(); $values = $event->getValues(); if ('' !== $values['value'] && null !== $values['value']) { if (isset($values['condition_pattern'])) { $qb->andWhere($expr->stringLike($event->getField(), "%" . $values['value'] . "%", $values['condition_pattern'])); } else { $qb->andWhere($expr->stringLike($event->getField(), "%" . $values['value'] . "%")); } } }
/** * @param GetFilterConditionEvent $event */ public function filterDateRange(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpressionBuilder(); $values = $event->getValues(); $value = $values['value']; // left date should start at midnight if (isset($value['left_date'][0]) && $value['left_date'][0] instanceof \DateTime) { $value['left_date'][0]->setTime(0, 0, 0); } // right adte should end one second before midnight if (isset($value['right_date'][0]) && $value['right_date'][0] instanceof \DateTime) { $value['right_date'][0]->setTime(23, 59, 59); } if (isset($value['left_date'][0]) || isset($value['right_date'][0])) { $event->setCondition($expr->dateTimeInRange($event->getField(), $value['left_date'][0], $value['right_date'][0])); } }
/** * @param GetFilterConditionEvent $event * @throws \Exception */ public function filterEntity(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpr(); $values = $event->getValues(); if (is_object($values['value'])) { $paramName = $this->generateParameterName($event->getField()); if ($values['value'] instanceof Collection) { $ids = array(); foreach ($values['value'] as $value) { $ids[] = $this->getValueIdentifier($value); } if (count($ids) > 0) { $event->setCondition($expr->in($event->getField(), ':' . $paramName), array($paramName => array($ids, Connection::PARAM_INT_ARRAY))); } } else { $event->setCondition($expr->eq($event->getField(), ':' . $paramName), array($paramName => array($this->getValueIdentifier($values['value']), Type::INTEGER))); } } }
/** * @param GetFilterConditionEvent $event */ public function filterDocument(GetFilterConditionEvent $event) { /** @var Expr $expr */ $expr = $event->getFilterQuery()->getExpr(); $values = $event->getValues(); if (is_object($values['value'])) { $field = $event->getField(); $multipleLevels = false !== strpos($field, '.'); if ($multipleLevels) { // replace the form field name by the referenced document name $parts = explode('.', $field); $parts[count($parts) - 1] = $values['reference_name']; $field = implode('.', $parts); } if ($values['value'] instanceof Collection) { $ids = array(); foreach ($values['value'] as $object) { $ids[] = new \MongoId($object->getId()); } if (count($ids) > 0) { $event->setCondition($expr->field($field . '.$id')->in($ids)); } } elseif ($multipleLevels) { $id = new \MongoId($values['value']->getId()); $event->setCondition($expr->field($field . '.$id')->equals($id)); } else { if ('one' === $values['reference_type']) { $condition = $expr->field($field)->references($values['value']); } else { $condition = $expr->field($field)->includesReferenceTo($values['value']); } $event->setCondition($condition); } } }
/** * @param GetFilterConditionEvent $event */ public function filterText(GetFilterConditionEvent $event) { $expr = $event->getFilterQuery()->getExpressionBuilder(); $values = $event->getValues(); if ('' !== $values['value'] && null !== $values['value']) { if (isset($values['condition_pattern'])) { $event->setCondition($expr->stringLike($event->getField(), $values['value'], $values['condition_pattern'])); } else { $event->setCondition($expr->stringLike($event->getField(), $values['value'])); } } }