/** * Returns a dataformatter instance based on the request * extension or mimetype. Falls back to {@link self::$default_extension}. * * @param boolean $includeAcceptHeader Determines wether to inspect and prioritize any HTTP Accept headers * @return DataFormatter */ protected function getDataFormatter($includeAcceptHeader = false) { $extension = $this->request->getExtension(); $contentTypeWithEncoding = $this->request->getHeader('Content-Type'); preg_match('/([^;]*)/', $contentTypeWithEncoding, $contentTypeMatches); $contentType = $contentTypeMatches[0]; $accept = $this->request->getHeader('Accept'); $mimetypes = $this->request->getAcceptMimetypes(); // get formatter if (!empty($extension)) { $formatter = DataFormatter::for_extension($extension); } elseif ($includeAcceptHeader && !empty($accept) && $accept != '*/*') { $formatter = DataFormatter::for_mimetypes($mimetypes); if (!$formatter) { $formatter = DataFormatter::for_extension(self::$default_extension); } } elseif (!empty($contentType)) { $formatter = DataFormatter::for_mimetype($contentType); } else { $formatter = DataFormatter::for_extension(self::$default_extension); } if (!$formatter) { return false; } // set custom fields if ($customAddFields = $this->request->getVar('add_fields')) { $formatter->setCustomAddFields(explode(',', $customAddFields)); } if ($customFields = $this->request->getVar('fields')) { $formatter->setCustomFields(explode(',', $customFields)); } $formatter->setCustomRelations($this->getAllowedRelations($this->urlParams['ClassName'])); $apiAccess = singleton($this->urlParams['ClassName'])->stat('api_access'); if (is_array($apiAccess)) { $formatter->setCustomAddFields(array_intersect((array) $formatter->getCustomAddFields(), (array) $apiAccess['view'])); if ($formatter->getCustomFields()) { $formatter->setCustomFields(array_intersect((array) $formatter->getCustomFields(), (array) $apiAccess['view'])); } else { $formatter->setCustomFields((array) $apiAccess['view']); } if ($formatter->getCustomRelations()) { $formatter->setCustomRelations(array_intersect((array) $formatter->getCustomRelations(), (array) $apiAccess['view'])); } else { $formatter->setCustomRelations((array) $apiAccess['view']); } } // set relation depth $relationDepth = $this->request->getVar('relationdepth'); if (is_numeric($relationDepth)) { $formatter->relationDepth = (int) $relationDepth; } return $formatter; }