public function RenderData($Data = NULL) { if ($Data === NULL) { $Data = array(); // Remove standard and "protected" data from the top level. foreach ($this->Data as $Key => $Value) { if (in_array($Key, array('Title'))) { continue; } if (isset($Key[0]) && $Key[0] == '_') { continue; } // protected $Data[$Key] = $Value; } } // Massage the data for better rendering. foreach ($Data as $Key => $Value) { if (is_a($Value, 'Gdn_DataSet')) { $Data[$Key] = $Value->ResultArray(); } } // Remove values that should not be transmitted via api $Remove = array('Email', 'Password', 'HashMethod', 'DateOfBirth', 'TransientKey', 'Permissions', 'Attributes'); if (!Gdn::Session()->CheckPermission('Garden.Moderation.Manage')) { $Remove[] = 'InsertIPAddress'; $Remove[] = 'UpdateIPAddress'; $Remove[] = 'LastIPAddress'; } $Data = RemoveKeysFromNestedArray($Data, $Remove); // Make sure the database connection is closed before exiting. $this->Finalize(); // Check for a special view. $ViewLocation = $this->FetchViewLocation(($this->View ? $this->View : $this->RequestMethod) . '_' . strtolower($this->DeliveryMethod()), FALSE, FALSE, FALSE); if (file_exists($ViewLocation)) { include $ViewLocation; return; } switch ($this->DeliveryMethod()) { case DELIVERY_METHOD_XML: header('Content-Type: text/xml', TRUE); echo '<?xml version="1.0" encoding="utf-8"?>' . "\n"; $this->_RenderXml($Data); exit; break; case DELIVERY_METHOD_JSON: default: header('Content-Type: application/json', TRUE); if ($Callback = $this->Request->Get('callback', FALSE)) { // This is a jsonp request. exit($Callback . '(' . json_encode($Data) . ');'); } else { // This is a regular json request. exit(json_encode($Data)); } break; } }
function RemoveKeysFromNestedArray($Array, $Matches) { if (is_array($Array)) { foreach ($Array as $Key => $Value) { $IsMatch = FALSE; foreach ($Matches as $Match) { if (StringEndsWith($Key, $Match)) { unset($Array[$Key]); $IsMatch = TRUE; } } if (!$IsMatch && (is_array($Value) || is_object($Value))) { $Array[$Key] = RemoveKeysFromNestedArray($Value, $Matches); } } } else { if (is_object($Array)) { $Arr = get_object_vars($Array); foreach ($Arr as $Key => $Value) { $IsMatch = FALSE; foreach ($Matches as $Match) { if (StringEndsWith($Key, $Match)) { unset($Array->{$Key}); $IsMatch = TRUE; } } if (!$IsMatch && (is_array($Value) || is_object($Value))) { $Array->{$Key} = RemoveKeysFromNestedArray($Value, $Matches); } } } } return $Array; }
public function RenderData($Data = NULL) { if ($Data === NULL) { $Data = array(); // Remove standard and "protected" data from the top level. foreach ($this->Data as $Key => $Value) { if ($Key && in_array($Key, array('Title', 'Breadcrumbs'))) { continue; } if (isset($Key[0]) && $Key[0] === '_') { continue; } // protected $Data[$Key] = $Value; } unset($this->Data); } // Massage the data for better rendering. foreach ($Data as $Key => $Value) { if (is_a($Value, 'Gdn_DataSet')) { $Data[$Key] = $Value->ResultArray(); } } $CleanOutut = C('Api.Clean', TRUE); if ($CleanOutut) { // Remove values that should not be transmitted via api $Remove = array('Password', 'HashMethod', 'TransientKey', 'Permissions', 'Attributes', 'AccessToken'); if (!Gdn::Session()->CheckPermission('Garden.Moderation.Manage')) { $Remove[] = 'InsertIPAddress'; $Remove[] = 'UpdateIPAddress'; $Remove[] = 'LastIPAddress'; $Remove[] = 'AllIPAddresses'; $Remove[] = 'Fingerprint'; if (C('Api.Clean.Email', TRUE)) { $Remove[] = 'Email'; } $Remove[] = 'DateOfBirth'; } $Data = RemoveKeysFromNestedArray($Data, $Remove); } if (Debug() && ($Trace = Trace())) { // Clear passwords from the trace. array_walk_recursive($Trace, function (&$Value, $Key) { if (in_array(strtolower($Key), array('password'))) { $Value = '***'; } }); $Data['Trace'] = $Trace; } // Make sure the database connection is closed before exiting. $this->EventArguments['Data'] =& $Data; $this->Finalize(); // Add error information from the form. if (isset($this->Form) && sizeof($this->Form->ValidationResults())) { $this->StatusCode(400); $Data['Code'] = 400; $Data['Exception'] = Gdn_Validation::ResultsAsText($this->Form->ValidationResults()); } // $this->SendHeaders(); // Check for a special view. $ViewLocation = $this->FetchViewLocation(($this->View ? $this->View : $this->RequestMethod) . '_' . strtolower($this->DeliveryMethod()), FALSE, FALSE, FALSE); if (file_exists($ViewLocation)) { include $ViewLocation; return; } // Add schemes to to urls. if (!C('Garden.AllowSSL') || C('Garden.ForceSSL')) { $r = array_walk_recursive($Data, array('Gdn_Controller', '_FixUrlScheme'), Gdn::Request()->Scheme()); } @ob_clean(); switch ($this->DeliveryMethod()) { case DELIVERY_METHOD_XML: safeHeader('Content-Type: text/xml', TRUE); echo '<?xml version="1.0" encoding="utf-8"?>' . "\n"; $this->_RenderXml($Data); return TRUE; break; case DELIVERY_METHOD_PLAIN: return TRUE; break; case DELIVERY_METHOD_JSON: default: if (($Callback = $this->Request->Get('callback', FALSE)) && $this->AllowJSONP()) { safeHeader('Content-Type: application/javascript', TRUE); // This is a jsonp request. echo $Callback . '(' . json_encode($Data) . ');'; return TRUE; } else { safeHeader('Content-Type: application/json', TRUE); // This is a regular json request. echo json_encode($Data); return TRUE; } break; } return FALSE; }