/** * Update the main event constraints * * @param Demand $demand * @param bool $respectEnableFields * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $constraints * @return void */ protected function updateEventConstraints(Demand $demand, $respectEnableFields, \TYPO3\CMS\Extbase\Persistence\QueryInterface $query, array &$constraints) { // reset datetime constraint unset($constraints['datetime']); $eventRestriction = $demand->getEventRestriction(); if ($eventRestriction === Demand::EVENT_RESTRICTION_NO_EVENTS) { $constraints[] = $query->equals('isEvent', 0); } elseif ($eventRestriction === Demand::EVENT_RESTRICTION_ONLY_EVENTS) { $dateField = $demand->getDateField(); $begin = mktime(0, 0, 0, $demand->getMonth(), 1, $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth() + 1, 0, $demand->getYear()); $eventsWithNoEndDate = array($query->logicalAnd($query->greaterThanOrEqual($demand->getDateField(), $begin), $query->lessThanOrEqual($demand->getDateField(), $end))); $eventsWithEndDate = array($query->logicalAnd($query->greaterThanOrEqual('datetime', $begin), $query->lessThanOrEqual('datetime', $end), $query->lessThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $begin)), $query->logicalAnd($query->lessThanOrEqual($dateField, $end), $query->greaterThanOrEqual('eventEnd', $end))); $dateConstraints1 = array($query->logicalAnd($eventsWithNoEndDate), $query->logicalOr($eventsWithEndDate)); $constraints['datetime'] = $query->logicalOr($dateConstraints1); $organizers = $demand->getOrganizers(); if (!empty($organizers)) { $constraints[] = $query->in('organizer', $organizers); } $locations = $demand->getLocations(); if (!empty($locations)) { $constraints[] = $query->in('location', $locations); } } }
/** * Returns an array of constraints created from a given demand object. * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param \DWenzel\T3events\Domain\Model\Dto\DemandInterface $demand * @return array<\TYPO3\CMS\Extbase\Persistence\Generic\Qom\Constraint> */ public function createConstraintsFromDemand(QueryInterface $query, DemandInterface $demand) { /** @var \CPSIT\T3eventsReservation\Domain\Model\Dto\PersonDemand $demand */ $constraints = []; if ($demand->getTypes()) { $personTypes = explode(',', $demand->getTypes()); $personConstraints = []; foreach ($personTypes as $personType) { $personConstraints[] = $query->equals('type', $personType); } if (count($personConstraints)) { $constraints[] = $query->logicalAnd($personConstraints); } } if ($demand->getLessonDeadline()) { $constraints[] = $query->logicalAnd($query->lessThan('lesson.deadline', $demand->getLessonDeadline())); } if ($demand->getLessonDate()) { if ($demand->getLessonPeriod() === 'futureOnly') { $constraints[] = $query->greaterThanOrEqual('reservation.lesson.date', $demand->getLessonDate()); } elseif ($demand->getLessonPeriod() === 'pastOnly') { $constraints[] = $query->lessThanOrEqual('reservation.lesson.date', $demand->getLessonDate()); } } if ((bool) ($genreConstraints = $this->createGenreConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $genreConstraints, $demand->getCategoryConjunction()); } if ((bool) ($searchConstraints = $this->createSearchConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $searchConstraints, 'OR'); } if ((bool) ($eventTypeConstraints = $this->createEventTypeConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $eventTypeConstraints, $demand->getCategoryConjunction()); } if ((bool) ($categoryConstraints = $this->createCategoryConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $categoryConstraints, $demand->getCategoryConjunction()); } if ((bool) ($periodConstraints = $this->createPeriodConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $periodConstraints); } if ((bool) ($audienceConstraints = $this->createAudienceConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $audienceConstraints); } return $constraints; }
/** * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param \DWenzel\T3events\Domain\Model\Dto\DemandInterface $demand * @return array */ public function createConstraintsFromDemand(QueryInterface $query, DemandInterface $demand) { /** @var ReservationDemand $demand */ $constraints = []; if ($demand->getLessonDeadline()) { $constraints[] = $query->logicalAnd($query->lessThan('lesson.deadline', $demand->getLessonDeadline())); } if ($demand->getStatus()) { $statusArr = GeneralUtility::intExplode(',', $demand->getStatus()); $statusConstraints = []; foreach ($statusArr as $status) { $statusConstraints[] = $query->equals('status', $status); } $constraints[] = $query->logicalOr($statusConstraints); } if ($demand->getMinAge()) { $constraints[] = $query->logicalAnd($query->lessThan('tstamp', time() - $demand->getMinAge())); } if ($demand->getLessonDate()) { if ($demand->getPeriod() === 'futureOnly') { $constraints[] = $query->greaterThanOrEqual('lesson.date', $demand->getLessonDate()); } elseif ($demand->getPeriod() === 'pastOnly') { $constraints[] = $query->lessThanOrEqual('lesson.date', $demand->getLessonDate()); } } if ((bool) ($genreConstraints = $this->createGenreConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $genreConstraints, $demand->getCategoryConjunction()); } if ((bool) ($searchConstraints = $this->createSearchConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $searchConstraints, 'OR'); } if ((bool) ($eventTypeConstraints = $this->createEventTypeConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $eventTypeConstraints, $demand->getCategoryConjunction()); } if ((bool) ($periodConstraints = $this->createPeriodConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $periodConstraints); } if ((bool) ($audienceConstraints = $this->createAudienceConstraints($query, $demand))) { $this->combineConstraints($query, $constraints, $audienceConstraints); } return $constraints; }
/** * Update the main event constraints * * @param Demand $demand * @param bool $respectEnableFields * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param array $constraints * @return void */ protected function updateEventConstraints(Demand $demand, $respectEnableFields, \TYPO3\CMS\Extbase\Persistence\QueryInterface $query, array &$constraints) { $eventRestriction = $demand->getEventRestriction(); if ($eventRestriction === Demand::EVENT_RESTRICTION_NO_EVENTS) { $constraints[] = $query->equals('isEvent', 0); } elseif ($eventRestriction === Demand::EVENT_RESTRICTION_ONLY_EVENTS) { $constraints[] = $query->equals('isEvent', 1); $monthFromDemand = $demand->getMonth(); $yearFromDemand = $demand->getYear(); if (!empty($monthFromDemand) && !empty($yearFromDemand)) { // reset datetime constraint unset($constraints['datetime']); $dateField = $demand->getDateField(); $begin = mktime(0, 0, 0, $demand->getMonth(), 1, $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth() + 1, 0, $demand->getYear()); $eventsWithNoEndDate = array($query->logicalAnd($query->greaterThanOrEqual($demand->getDateField(), $begin), $query->lessThanOrEqual($demand->getDateField(), $end))); $eventsWithEndDate = array($query->logicalAnd($query->greaterThanOrEqual('datetime', $begin), $query->lessThanOrEqual('datetime', $end), $query->lessThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $end)), $query->logicalAnd($query->lessThanOrEqual($dateField, $begin), $query->greaterThanOrEqual('eventEnd', $begin)), $query->logicalAnd($query->lessThanOrEqual($dateField, $end), $query->greaterThanOrEqual('eventEnd', $end))); $dateConstraints1 = array($query->logicalAnd($eventsWithNoEndDate), $query->logicalOr($eventsWithEndDate)); $constraints['datetime'] = $query->logicalOr($dateConstraints1); } $archiveRestriction = $demand->getArchiveRestriction(); if (!empty($archiveRestriction)) { $timestamp = time(); $beginningOfDay = strtotime("midnight", $timestamp); $endOfDay = strtotime("tomorrow", $beginningOfDay) - 1; $activeConstraint = $query->logicalOr($query->greaterThan('datetime', $timestamp), $query->logicalAnd($query->equals('full_day', 0), $query->lessThan('datetime', $timestamp), $query->greaterThan('event_end', $timestamp)), $query->logicalAnd($query->equals('full_day', 1), $query->lessThan('datetime', $beginningOfDay), $query->greaterThan('event_end', $beginningOfDay), $query->lessThan('event_end', $endOfDay)), $query->logicalAnd($query->equals('full_day', 1), $query->lessThan('datetime', $timestamp), $query->greaterThan('event_end', $endOfDay)), $query->logicalAnd($query->equals('full_day', 1), $query->greaterThanOrEqual('datetime', $beginningOfDay), $query->equals('event_end', 0))); // reset existing archived constraint unset($constraints['archived']); if ($demand->getArchiveRestriction() == 'archived') { $constraints['archived'] = $query->logicalNot($activeConstraint); } elseif ($demand->getArchiveRestriction() == 'active') { $constraints['archived'] = $activeConstraint; } } $organizers = $demand->getOrganizers(); if (!empty($organizers)) { $constraints[] = $query->in('organizer', $organizers); } $locations = $demand->getLocations(); if (!empty($locations)) { $constraints[] = $query->in('location', $locations); } } }
/** * Get the search constraints * * @param QueryInterface $query * @param DemandInterface $demand * @return array * @throws \UnexpectedValueException */ protected function getSearchConstraints(QueryInterface $query, DemandInterface $demand) { $constraints = []; if ($demand->getSearch() === null) { return $constraints; } /* @var $searchObject \GeorgRinger\News\Domain\Model\Dto\Search */ $searchObject = $demand->getSearch(); $searchSubject = $searchObject->getSubject(); if (!empty($searchSubject)) { $searchFields = GeneralUtility::trimExplode(',', $searchObject->getFields(), true); $searchConstraints = []; if (count($searchFields) === 0) { throw new \UnexpectedValueException('No search fields defined', 1318497755); } foreach ($searchFields as $field) { if (!empty($searchSubject)) { $searchConstraints[] = $query->like($field, '%' . $searchSubject . '%'); } } if (count($searchConstraints)) { $constraints[] = $query->logicalOr($searchConstraints); } } $minimumDate = strtotime($searchObject->getMinimumDate()); if ($minimumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new \UnexpectedValueException('No date field is defined', 1396348732); } $constraints[] = $query->greaterThanOrEqual($field, $minimumDate); } $maximumDate = strtotime($searchObject->getMaximumDate()); if ($maximumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new \UnexpectedValueException('No date field is defined', 1396348733); } $constraints[] = $query->lessThanOrEqual($field, $maximumDate); } return $constraints; }
/** * Get a QueryInterface constraint from an array definition * * @param QueryInterface $query * @param array $demands * @param string $conjunction * * @return ConstraintInterface|null */ public static function getConstraintsForDemand($query, $demands, $conjunction = 'AND') { $constraints = array(); if (!is_array($demands) || empty($demands)) { return null; } foreach ($demands as $key => $demand) { if (!isset($demand['demand'])) { continue; } $constraint = $demand['demand']; switch ($constraint['operation']) { case 'EQUALS': $constraints[] = $query->equals($constraint['property'], $constraint['value']); break; case 'LIKE': $constraints[] = $query->like($constraint['property'], $constraint['value']); break; case 'CONTAINS': $constraints[] = $query->contains($constraint['property'], $constraint['value']); break; case 'LESSTHAN': $constraints[] = $query->lessThan($constraint['property'], $constraint['value']); break; case 'LESSTHANOREQUAL': $constraints[] = $query->lessThanOrEqual($constraint['property'], $constraint['value']); break; case 'GREATERTHAN': $constraints[] = $query->greaterThan($constraint['property'], $constraint['value']); break; case 'GREATERTHANOREQUAL': $constraints[] = $query->greaterThanOrEqual($constraint['property'], $constraint['value']); break; case 'AND': $tmp = self::getConstraintsForDemand($query, $constraint['operands'], 'AND'); if ($tmp !== null) { $constraints[] = $tmp; } break; case 'OR': $tmp = self::getConstraintsForDemand($query, $constraint['operands'], 'OR'); if ($tmp !== null) { $constraints[] = $tmp; } break; default: return null; } } if (count($constraints) == 0) { return null; } $result = null; switch ($conjunction) { case 'AND': $result = $query->logicalAnd($constraints); break; case 'OR': $result = $query->logicalOr($constraints); break; } return $result; }
/** * Sets the start- and enddate constraint to the given constraints array * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query Query * @param \DERHANSEN\SfEventMgt\Domain\Model\Dto\EventDemand $eventDemand EventDemand * @param array $constraints Constraints * * @return void */ protected function setStartEndDateConstraint($query, $eventDemand, &$constraints) { /* StartDate */ if ($eventDemand->getStartDate() !== NULL) { $constraints[] = $query->greaterThanOrEqual('startdate', $eventDemand->getStartDate()); } /* EndDate */ if ($eventDemand->getEndDate() !== NULL) { $constraints[] = $query->lessThanOrEqual('enddate', $eventDemand->getEndDate()); } }
/** * Get the search constraints * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param Tx_News_Domain_Model_DemandInterface $demand * @return array * @throws UnexpectedValueException */ protected function getSearchConstraints(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query, Tx_News_Domain_Model_DemandInterface $demand) { $constraints = array(); if ($demand->getSearch() === NULL) { return $constraints; } /* @var $searchObject Tx_News_Domain_Model_Dto_Search */ $searchObject = $demand->getSearch(); $searchSubject = $searchObject->getSubject(); if (!empty($searchSubject)) { $searchFields = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(',', $searchObject->getFields(), TRUE); $searchConstraints = array(); if (count($searchFields) === 0) { throw new UnexpectedValueException('No search fields defined', 1318497755); } foreach ($searchFields as $field) { if (!empty($searchSubject)) { $searchConstraints[] = $query->like($field, '%' . $searchSubject . '%'); } } if (count($searchConstraints)) { $constraints[] = $query->logicalOr($searchConstraints); } } $minimumDate = strtotime($searchObject->getMinimumDate()); if ($minimumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new UnexpectedValueException('No date field is defined', 1396348732); } $constraints[] = $query->greaterThanOrEqual($field, $minimumDate); } $maximumDate = strtotime($searchObject->getMaximumDate()); if ($maximumDate) { $field = $searchObject->getDateField(); if (empty($field)) { throw new UnexpectedValueException('No date field is defined', 1396348733); } $constraints[] = $query->lessThanOrEqual($field, $maximumDate); } return $constraints; }
/** * Sets the displayMode constraint to the given constraints array * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query Query * @param \DERHANSEN\SfEventMgt\Domain\Model\Dto\UserRegistrationDemand $demand * @param array $constraints Constraints * * @return void */ protected function setDisplayModeConstraint($query, $demand, &$constraints) { switch ($demand->getDisplayMode()) { case 'future': $constraints[] = $query->greaterThan('event.startdate', $demand->getCurrentDateTime()); break; case 'past': $constraints[] = $query->lessThanOrEqual('event.enddate', $demand->getCurrentDateTime()); break; default: } }