function routeAsGET($path, $dataSource, $options = array()) { if (br()->request()->isAt($path)) { if (is_string($dataSource)) { $dataSource = new $dataSource(); } br()->request()->continueRoute(false); $event = 'select'; if ($matches = br()->request()->isAt(rtrim($path, '/') . '/([-0-9a-z]+)')) { $event = 'selectOne'; } $this->checkPermissions($options, array($event, 'select')); $dataSourceOptions = array(); $dataSourceOptions['source'] = 'RESTBinder'; $filter = array(); if ($rowid = br()->request()->get('rowid')) { $filter[br()->db()->rowidField()] = br()->db()->rowid($rowid); $dataSourceOptions['limit'] = 1; } $selectOne = false; if ($matches = br()->request()->isAt(rtrim($path, '/') . '/([-0-9a-z]+)')) { $keyValue = $matches[1]; if ($keyValue === '-') { $keyValue = null; } $filter[br()->db()->rowidField()] = br()->db()->rowid($keyValue); $selectOne = true; } if ($filterMappings = br($options, 'filterMappings')) { foreach ($filterMappings as $mapping) { $get = is_array($mapping['get']) ? $mapping['get'] : array($mapping['get']); foreach ($get as $getParam) { $value = br()->request()->get($getParam); if ($value || is_string($value) && strlen($value)) { $fields = br($mapping, 'field', br($mapping, 'fields', $getParam)); switch (br($mapping, 'type', '=')) { case "=": if (is_array($value)) { $valuesArray = true; if (br($value, '$nn')) { $filter[] = array($fields => array('$nn' => '')); $valuesArray = false; } if (br($value, '$ne')) { $filter[] = array($fields => array('$ne' => $value['$ne'])); $valuesArray = false; } if (br($value, '<')) { $filter[] = array($fields => array('$lt' => $value['<'])); $valuesArray = false; } if (br($value, '$lt')) { $filter[] = array($fields => array('$lt' => $value['$lt'])); $valuesArray = false; } if (br($value, '>')) { $filter[] = array($fields => array('$gt' => $value['>'])); $valuesArray = false; } if (br($value, '$gt')) { $filter[] = array($fields => array('$gt' => $value['$gt'])); $valuesArray = false; } if (br($value, '<=')) { $filter[] = array($fields => array('$lte' => $value['<='])); $valuesArray = false; } if (br($value, '$lte')) { $filter[] = array($fields => array('$lte' => $value['$lte'])); $valuesArray = false; } if (br($value, '>=')) { $filter[] = array($fields => array('$gte' => $value['>='])); $valuesArray = false; } if (br($value, '$gte')) { $filter[] = array($fields => array('$gte' => $value['$gte'])); $valuesArray = false; } if (br($value, '$in')) { $filter[] = array($fields => array('$in' => $value['$in'])); $valuesArray = false; } if ($valuesArray) { $filter[$fields] = $value; } } else { if ($value == 'null') { $filter[$fields] = null; } else { if ($value == '$null') { $filter[$fields] = null; } else { $filter[$fields] = $value; } } } break; case "regexp": if (is_array($fields)) { $subFilter = array(); foreach ($fields as $field) { $subFilter[] = array($field => br()->db()->regexpCondition($value)); } $filter['$or'] = $subFilter; } else { $filter[$fields] = br()->db()->regexpCondition($value); } break; case "like": if (is_array($fields)) { $subFilter = array(); foreach ($fields as $field) { $subFilter[] = array($field => array('$like' => $value)); } $filter['$or'] = $subFilter; } else { $filter[$fields] = array('$like' => $value); } break; case "contains": if (is_array($fields)) { $subFilter = array(); foreach ($fields as $field) { $subFilter[] = array($field => array('$contains' => $value)); } $filter['$or'] = $subFilter; } else { $filter[$fields] = array('$contains' => $value); } break; case "fulltext": if (is_array($fields)) { $subFilter = array(); foreach ($fields as $field) { $subFilter[] = array($field => $value); } $filter['$fulltext'] = $subFilter; } else { $filter[$fields] = array('$fulltext' => $value); } break; case "filter": $filters = br($mapping, 'filters', br($mapping, 'filter')); if (!is_array($filters)) { $filters = array($filters); } foreach ($filters as $filter) { foreach ($filter as $filterField => $filterValue) { $filter[$filterField] = $filterValue; } } break; case "date:month": $startMonth = new MongoDate(strtotime($value . '-01')); br()->importLib('DateTime'); $dateTime = new BrDateTime($startMonth->sec); $dateTime->incMonth(); $endMonth = new MongoDate($dateTime->asDate()); $filter[$fields] = array('$gte' => $startMonth, '$lt' => $endMonth); break; } } } } } $limit = br()->request()->get('__limit'); if (strlen($limit)) { if (is_numeric($limit)) { $dataSourceOptions['limit'] = $limit; } } $skip = br()->request()->get('__skip'); if (strlen($skip)) { if (is_numeric($skip)) { $dataSourceOptions['skip'] = $skip; } } if ($page = br()->request()->get('__page')) { $dataSourceOptions['page'] = $page; } if ($dataSets = br()->request()->get('__dataSets')) { $dataSourceOptions['dataSets'] = $dataSets; } if ($renderMode = br()->request()->get('__renderMode')) { $dataSourceOptions['renderMode'] = $renderMode; } if ($order = br()->request()->get('__order')) { if (!is_array($order)) { $order = array($order => 1); } $verifiedOrder = array(); foreach ($order as $name => $direction) { if (preg_match('#^[.A-Za-z_0-9]+$#', $name)) { $verifiedOrder[$name] = $direction; } } $dataSourceOrder = $verifiedOrder; } else { $dataSourceOrder = array(); } if ($fields = br()->request()->get('__fields')) { if (!is_array($fields)) { $fields = array($fields); } $verifiedFields = array(); foreach ($fields as $name) { if (preg_match('#^[.A-Za-z_0-9]+$#', $name)) { $verifiedFields[] = $name; } } $dataSourceFields = $verifiedFields; } else { $dataSourceFields = array(); } try { if (br()->request()->get('__result') == 'count') { $allowEmptyFilter = br($options, 'allowEmptyFilter'); if (!$filter && !$allowEmptyFilter) { $result = 0; } else { $result = $dataSource->selectCount($filter, array(), array(), array('source' => 'RESTBinder')); } } else { $allowEmptyFilter = br($options, 'allowEmptyFilter'); if (!$filter && !$allowEmptyFilter) { $dataSourceOptions['limit'] = 0; } if ($selectOne) { $result = $dataSource->selectOne($filter, $dataSourceFields, array(), $dataSourceOptions); if (!$result) { br()->response()->send404('Record not found'); } } else { $result = $dataSource->select($filter, $dataSourceFields, $dataSourceOrder, $dataSourceOptions); } } if (br()->request()->get('crossdomain')) { br()->response()->sendJSONP($result); } else { br()->response()->sendJSON($result); } } catch (Exception $e) { $this->returnException($e); } } return $this; }
function daysTill($date = null) { if (!$date) { $date = time(); } $date = new BrDateTime($date); $diff = ($this->asDate() - $date->asDate()) / 60 / 60 / 24; return $diff; }