/** * Returns an array of constraints created from a given demand object. * * @param \TYPO3\CMS\Extbase\Persistence\QueryInterface $query * @param Tx_News_Domain_Model_DemandInterface $demand * @throws UnexpectedValueException * @throws InvalidArgumentException * @throws Exception * @return array<\TYPO3\CMS\Extbase\Persistence\Generic\Qom\ConstraintInterface> */ protected function createConstraintsFromDemand(\TYPO3\CMS\Extbase\Persistence\QueryInterface $query, Tx_News_Domain_Model_DemandInterface $demand) { $constraints = array(); if ($demand->getCategories() && $demand->getCategories() !== '0') { $constraints[] = $this->createCategoryConstraint($query, $demand->getCategories(), $demand->getCategoryConjunction(), $demand->getIncludeSubCategories()); } if ($demand->getAuthor()) { $constraints[] = $query->equals('author', $demand->getAuthor()); } // archived if ($demand->getArchiveRestriction() == 'archived') { $constraints[] = $query->logicalAnd($query->lessThan('archive', $GLOBALS['EXEC_TIME']), $query->greaterThan('archive', 0)); } elseif ($demand->getArchiveRestriction() == 'active') { $constraints[] = $query->logicalOr($query->greaterThanOrEqual('archive', $GLOBALS['EXEC_TIME']), $query->equals('archive', 0)); } // Time restriction greater than or equal $timeRestrictionField = $demand->getDateField(); $timeRestrictionField = empty($timeRestrictionField) ? 'datetime' : $timeRestrictionField; if ($demand->getTimeRestriction()) { $timeLimit = 0; // integer = timestamp if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($demand->getTimeRestriction())) { $timeLimit = $GLOBALS['EXEC_TIME'] - $demand->getTimeRestriction(); } else { // try to check strtotime $timeFromString = strtotime($demand->getTimeRestriction()); if ($timeFromString) { $timeLimit = $timeFromString; } else { throw new Exception('Time limit Low could not be resolved to an integer. Given was: ' . htmlspecialchars($timeLimit)); } } $constraints[] = $query->greaterThanOrEqual($timeRestrictionField, $timeLimit); } // Time restriction less than or equal if ($demand->getTimeRestrictionHigh()) { $timeLimit = 0; // integer = timestamp if (\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($demand->getTimeRestrictionHigh())) { $timeLimit = $GLOBALS['EXEC_TIME'] + $demand->getTimeRestrictionHigh(); } else { // try to check strtotime $timeFromString = strtotime($demand->getTimeRestrictionHigh()); if ($timeFromString) { $timeLimit = $timeFromString; } else { throw new Exception('Time limit High could not be resolved to an integer. Given was: ' . htmlspecialchars($timeLimit)); } } $constraints[] = $query->lessThanOrEqual($timeRestrictionField, $timeLimit); } // top news if ($demand->getTopNewsRestriction() == 1) { $constraints[] = $query->equals('istopnews', 1); } elseif ($demand->getTopNewsRestriction() == 2) { $constraints[] = $query->equals('istopnews', 0); } // storage page if ($demand->getStoragePage() != 0) { $pidList = \TYPO3\CMS\Core\Utility\GeneralUtility::intExplode(',', $demand->getStoragePage(), TRUE); $constraints[] = $query->in('pid', $pidList); } // month & year OR year only if ($demand->getYear() > 0) { if (is_null($demand->getDateField())) { throw new InvalidArgumentException('No Datefield is set, therefore no Datemenu is possible!'); } if ($demand->getMonth() > 0) { if ($demand->getDay() > 0) { $begin = mktime(0, 0, 0, $demand->getMonth(), $demand->getDay(), $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth(), $demand->getDay(), $demand->getYear()); } else { $begin = mktime(0, 0, 0, $demand->getMonth(), 1, $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth() + 1, 0, $demand->getYear()); } } else { $begin = mktime(0, 0, 0, 1, 1, $demand->getYear()); $end = mktime(23, 59, 59, 12, 31, $demand->getYear()); } $constraints[] = $query->logicalAnd($query->greaterThanOrEqual($demand->getDateField(), $begin), $query->lessThanOrEqual($demand->getDateField(), $end)); } // Tags $tags = $demand->getTags(); if ($tags) { $tagList = explode(',', $tags); foreach ($tagList as $singleTag) { $constraints[] = $query->contains('tags', $singleTag); } } // Search $searchConstraints = $this->getSearchConstraints($query, $demand); if (!empty($searchConstraints)) { $constraints[] = $query->logicalAnd($searchConstraints); } // Exclude already displayed if ($demand->getExcludeAlreadyDisplayedNews() && isset($GLOBALS['EXT']['news']['alreadyDisplayed']) && !empty($GLOBALS['EXT']['news']['alreadyDisplayed'])) { $constraints[] = $query->logicalNot($query->in('uid', $GLOBALS['EXT']['news']['alreadyDisplayed'])); } // Clean not used constraints foreach ($constraints as $key => $value) { if (is_null($value)) { unset($constraints[$key]); } } return $constraints; }
/** * Returns an array of constraints created from a given demand object. * * @param Tx_Extbase_Persistence_QueryInterface $query * @param Tx_News_Domain_Model_DemandInterface $demand * @throws UnexpectedValueException * @throws InvalidArgumentException * @throws Exception * @return array<Tx_Extbase_Persistence_QOM_Constraint> */ protected function createConstraintsFromDemand(Tx_Extbase_Persistence_QueryInterface $query, Tx_News_Domain_Model_DemandInterface $demand) { $constraints = array(); if ($demand->getCategories() && $demand->getCategories() !== '0') { $constraints[] = $this->createCategoryConstraint($query, $demand->getCategories(), $demand->getCategoryConjunction(), $demand->getIncludeSubCategories()); } // archived if ($demand->getArchiveRestriction() == 'archived') { $constraints[] = $query->logicalAnd($query->lessThan('archive', $GLOBALS['EXEC_TIME']), $query->greaterThan('archive', 0)); } elseif ($demand->getArchiveRestriction() == 'active') { $constraints[] = $query->logicalOr($query->greaterThanOrEqual('archive', $GLOBALS['EXEC_TIME']), $query->equals('archive', 0)); } // Time restriction greater than or equal if ($demand->getTimeRestriction()) { $timeLimit = 0; // integer = timestamp if (Tx_News_Utility_Compatibility::canBeInterpretedAsInteger($demand->getTimeRestriction())) { $timeLimit = $GLOBALS['EXEC_TIME'] - $demand->getTimeRestriction(); } else { // try to check strtotime $timeFromString = strtotime($demand->getTimeRestriction()); if ($timeFromString) { $timeLimit = $timeFromString; } else { throw new Exception('Time limit Low could not be resolved to an integer. Given was: ' . htmlspecialchars($timeLimit)); } } $constraints[] = $query->greaterThanOrEqual('datetime', $timeLimit); } // Time restriction less than or equal if ($demand->getTimeRestrictionHigh()) { $timeLimit = 0; // integer = timestamp if (Tx_News_Utility_Compatibility::canBeInterpretedAsInteger($demand->getTimeRestrictionHigh())) { $timeLimit = $GLOBALS['EXEC_TIME'] + $demand->getTimeRestrictionHigh(); } else { // try to check strtotime $timeFromString = strtotime($demand->getTimeRestrictionHigh()); if ($timeFromString) { $timeLimit = $timeFromString; } else { throw new Exception('Time limit High could not be resolved to an integer. Given was: ' . htmlspecialchars($timeLimit)); } } $constraints[] = $query->lessThanOrEqual('datetime', $timeLimit); } // top news if ($demand->getTopNewsRestriction() == 1) { $constraints[] = $query->equals('istopnews', 1); } elseif ($demand->getTopNewsRestriction() == 2) { $constraints[] = $query->equals('istopnews', 0); } // storage page if ($demand->getStoragePage() != 0) { $pidList = t3lib_div::intExplode(',', $demand->getStoragePage(), TRUE); $constraints[] = $query->in('pid', $pidList); } // month & year OR year only if ($demand->getYear() > 0) { if (is_null($demand->getDateField())) { throw new InvalidArgumentException('No Datefield is set, therefore no Datemenu is possible!'); } if ($demand->getMonth() > 0) { if ($demand->getDay() > 0) { $begin = mktime(0, 0, 0, $demand->getMonth(), $demand->getDay(), $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth(), $demand->getDay(), $demand->getYear()); } else { $begin = mktime(0, 0, 0, $demand->getMonth(), 1, $demand->getYear()); $end = mktime(23, 59, 59, $demand->getMonth() + 1, 0, $demand->getYear()); } } else { $begin = mktime(0, 0, 0, 1, 1, $demand->getYear()); $end = mktime(23, 59, 59, 12, 31, $demand->getYear()); } $constraints[] = $query->logicalAnd($query->greaterThanOrEqual($demand->getDateField(), $begin), $query->lessThanOrEqual($demand->getDateField(), $end)); } // Tags $tags = $demand->getTags(); if ($tags) { $tagList = explode(',', $tags); foreach ($tagList as $singleTag) { $constraints[] = $query->contains('tags', $singleTag); } } // dummy records, used for UnitTests only! if ($demand->getIsDummyRecord()) { $constraints[] = $query->equals('isDummyRecord', 1); } // Search if ($demand->getSearch() !== NULL) { /* @var $searchObject Tx_News_Domain_Model_Dto_Search */ $searchObject = $demand->getSearch(); $searchFields = t3lib_div::trimExplode(',', $searchObject->getFields(), TRUE); $searchConstraints = array(); if (count($searchFields) === 0) { throw new UnexpectedValueException('No search fields defined', 1318497755); } $searchSubject = $searchObject->getSubject(); foreach ($searchFields as $field) { if (!empty($searchSubject)) { $searchConstraints[] = $query->like($field, '%' . $searchSubject . '%'); } } if (count($searchConstraints)) { $constraints[] = $query->logicalOr($searchConstraints); } } // Exclude already displayed if ($demand->getExcludeAlreadyDisplayedNews() && isset($GLOBALS['EXT']['news']['alreadyDisplayed']) && !empty($GLOBALS['EXT']['news']['alreadyDisplayed'])) { $constraints[] = $query->logicalNot($query->in('uid', $GLOBALS['EXT']['news']['alreadyDisplayed'])); } // Clean not used constraints foreach ($constraints as $key => $value) { if (is_null($value)) { unset($constraints[$key]); } } return $constraints; }