예제 #1
0
 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;
     }
 }
예제 #2
0
 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;
 }