/** * Calculates timezone offset which needs to be removed. * * @param Base\Model $resource Currently processed resource. * * @static * @access private * * @return void */ private static function removeTimezoneEffect(Base\Model $resource) { foreach ($resource::timezoneAwareFields() as $datetime_field) { if ($resource->{$datetime_field}) { $resource->{$datetime_field} = Helpers\DateTime::formatGmt($resource->{$datetime_field}); } } }
/** * Assigns filtering of the results. * * @param DB\Query $query Current query object instance of BaseModel or its children. * @param array $params Query params to format filtering criteria. * * @access private * @static * @uses Core\DB() * @uses Core\DbCache() * @uses Core\Helpers\SQL * * @return Core\Modules\DB\Query */ private static function assignFilter(DB\Query $query, array $params) { if (isset($params['filtering']) && !empty($params['filtering']) && is_array($params['filtering'])) { $model_fields = $query->getObject()->getSchema(); if ($query->getObject()->hasAndBelongsToMany) { $model_fields = array_merge($model_fields, $query->getObject()->hasAndBelongsToMany); } foreach ($params['filtering'] as $field => $value) { if ($value && isset($model_fields[$field])) { if (is_array($value)) { if (isset($value['start'], $value['end']) && !empty($value['start']) && !empty($value['end'])) { if (in_array($model_fields[$field]['type'], array('date', 'datetime'), true)) { $decorator = 'Core\\Modules\\DB\\Decorators\\Interfaces\\TimezoneAwareness'; if (is_subclass_of($query->getObject(), $decorator)) { $value['start'] = Core\Helpers\DateTime::formatGmt($value['start'] . date(' H:i:s'), 'Y-m-d'); $value['end'] = Core\Helpers\DateTime::formatGmt($value['end'] . date(' H:i:s'), 'Y-m-d'); } $query = $query->where("(DATE({$field}) BETWEEN " . Core\DB()->escapeString($value['start']) . ' AND ' . Core\DB()->escapeString($value['end']) . ')'); } else { $query = $query->where("{$field} BETWEEN " . Core\DB()->escapeString($value['start']) . ' AND ' . Core\DB()->escapeString($value['end'])); } } else { if (isset($query->getObject()->hasAndBelongsToMany[$field]) && $query->getObject()->hasAndBelongsToMany[$field]) { $related = $query->getObject()->hasAndBelongsToMany[$field]; $obj = $query->getObject(); $primaryKey = $obj->primaryKeyField(); $prefix = Core\Config()->DB['tables_prefix']; foreach ($value as $v) { $query = $query->join("{$related['table']} as {$related['table']}{$v}", "{$prefix}{$obj::$tableName}.{$primaryKey} = " . "{$related['table']}{$v}.{$related['key']}" . ' AND ' . "{$related['table']}{$v}.{$related['relative_key']} = {$v}"); } } } } elseif (strlen($value)) { if ($model_fields[$field]['type'] === 'string') { $value_to_match = trim(Core\DB()->escapeString($value), "'"); $query = $query->where("{$field} LIKE \"%{$value_to_match}%\""); } else { $query = $query->where($field . ' = ' . Core\DB()->escapeString($value)); } } } } } return $query; }