Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 function daysInCurrentMonth()
 {
     $date = new BrDateTime($this->asDateTime());
     $date->day = 1;
     $date->incMonth();
     $date->decDay();
     return $date->day;
 }