/** * The value['type'] determines how the attributeAndRelations is structured. * @param string $attributeName * @param array $attributeAndRelations * @param mixed $value */ public static function resolveAttributesAndRelations($attributeName, &$attributeAndRelations, $value) { assert('is_string($attributeName)'); assert('$attributeAndRelations == "resolveEntireMappingByRules"'); assert('empty($value) || $value == null || is_array($value)'); $delimiter = FormModelUtil::DELIMITER; $parts = explode($delimiter, $attributeName); if (count($parts) != 2) { throw new NotSupportedException(); } list($realAttributeName, $type) = $parts; if (isset($value['type']) && $value['type'] != null) { if ($value['type'] == self::TYPE_YESTERDAY || $value['type'] == self::TYPE_TODAY || $value['type'] == self::TYPE_TOMORROW || $value['type'] == self::TYPE_ON) { $dateValue = static::resolveValueDataIntoUsableValue($value); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($dateValue); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($dateValue); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_AFTER) { $dateValue = static::resolveValueDataIntoUsableValue($value); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($dateValue); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue)); } elseif ($value['type'] == self::TYPE_BEFORE) { $dateValue = static::resolveValueDataIntoUsableValue($value); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($dateValue); $attributeAndRelations = array(array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue)); } elseif ($value['type'] == self::TYPE_BETWEEN) { $firstDateValue = static::resolveValueDataForBetweenIntoUsableFirstDateValue($value); $secondDateValue = static::resolveValueDataForBetweenIntoUsableSecondDateValue($value); if ($firstDateValue == null) { $greaterThanValue = null; } else { $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($firstDateValue); } if ($secondDateValue == null) { $lessThanValue = null; } else { $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($secondDateValue); } $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_NEXT_7_DAYS) { $today = static::calculateNewDateByDaysFromNow(0); $todayPlusSevenDays = static::calculateNewDateByDaysFromNow(7); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($today); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($todayPlusSevenDays); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_LAST_7_DAYS) { $today = static::calculateNewDateByDaysFromNow(0); $todayMinusSevenDays = static::calculateNewDateByDaysFromNow(-7); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($todayMinusSevenDays); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_LAST_30_DAYS) { $today = static::calculateNewDateByDaysFromNow(0); $todayMinusThirtyDays = static::calculateNewDateByDaysFromNow(-30); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($todayMinusThirtyDays); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_THIS_MONTH) { $firstDateValue = DateTimeUtil::getFirstDayOfAMonthDate(); $secondDateValue = DateTimeUtil::getLastDayOfAMonthDate(); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($firstDateValue); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($secondDateValue); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_LAST_MONTH) { $firstDateValue = DateTimeUtil::getFirstDayOfLastMonthDate(); $secondDateValue = DateTimeUtil::getLastDayOfLastMonthDate(); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($firstDateValue); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($secondDateValue); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_NEXT_MONTH) { $firstDateValue = DateTimeUtil::getFirstDayOfNextMonthDate(); $secondDateValue = DateTimeUtil::getLastDayOfNextMonthDate(); $greaterThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($firstDateValue); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($secondDateValue); $attributeAndRelations = array(array($realAttributeName, null, 'greaterThanOrEqualTo', $greaterThanValue, true), array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue, true)); } elseif ($value['type'] == self::TYPE_BEFORE_TODAY) { $today = static::calculateNewDateByDaysFromNow(0); $lessThanValue = DateTimeUtil::convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($today); $attributeAndRelations = array(array($realAttributeName, null, 'lessThanOrEqualTo', $lessThanValue)); } else { throw new NotSupportedException(); } } else { $attributeAndRelations = array(array($realAttributeName, null, null, 'resolveValueByRules')); } }