If $key is an array, the behaviour will be the same as calling the method
multiple times for each (key, value) pair in the $key array.
Note that the parameter $value will not be used if $key is an array.
The $key can also use dot notation in order to set a value deeper inside the Data array.
Works the same way if $addProperty is true, but uses objects instead of arrays.
public setData ( string | array $key, mixed $value = null, mixed $addProperty = false ) : mixed | ||
$key | string | array | The key that identifies the data. |
$value | mixed | The data. Will not be used if $key is an array |
$addProperty | mixed | Whether or not to also set the data as a property of this object. |
return | mixed | The $Value that was set. |
/** * The settings page for vanillicon. * * @param Gdn_Controller $sender */ public function settingsController_vanillicon_create($sender) { $sender->permission('Garden.Settings.Manage'); $cf = new ConfigurationModule($sender); $items = array('v1' => 'Vanillicon 1', 'v2' => 'Vanillicon 2'); $cf->initialize(array('Plugins.Vanillicon.Type' => array('LabelCode' => 'Vanillicon Set', 'Control' => 'radiolist', 'Description' => 'Which vanillicon set do you want to use?', 'Items' => $items, 'Options' => array('display' => 'after'), 'Default' => 'v1'))); $sender->setData('Title', sprintf(t('%s Settings'), 'Vanillicon')); $cf->renderAll(); }
/** * Homepage of VanillaForums.org. * * @param Gdn_Controller $sender */ public function homeController_homepage_create($sender) { try { $AddonModel = new AddonModel(); $Addon = $AddonModel->getSlug('vanilla-core', true); $sender->setData('CountDownloads', val('CountDownloads', $Addon)); $sender->setData('Version', val('Version', $Addon)); $sender->setData('DateUploaded', val('DateInserted', $Addon)); } catch (Exception $ex) { } $sender->title('The most powerful custom community solution in the world'); $sender->setData('Description', "Vanilla is forum software that powers discussions on hundreds of thousands of sites. Built for flexibility and integration, Vanilla is the best, most powerful community solution in the world."); $sender->Head->addTag('meta', array('name' => 'description', 'content' => $sender->data('Description'))); $sender->clearJsFiles(); $sender->addJsFile('jquery.js', 'vforg'); $sender->addJsFile('easySlider1.7.js', 'vforg'); saveToConfig('Garden.Embed.Allow', false, false); // Prevent JS errors $sender->clearCssFiles(); $sender->addCssFile('vforg-home.css', 'vforg'); $sender->MasterView = 'empty'; $sender->render('index', 'home', 'vforg'); }
/** * * @param Gdn_Controller $Sender * @param array $Args */ public function base_connectData_handler($Sender, $Args) { if (val(0, $Args) != 'facebook') { return; } if (isset($_GET['error'])) { // TODO global nope x2 throw new Gdn_UserException(val('error_description', $_GET, t('There was an error connecting to Facebook'))); } $AppID = c('Plugins.Facebook.ApplicationID'); $Secret = c('Plugins.Facebook.Secret'); $Code = val('code', $_GET); // TODO nope $Query = ''; if ($Sender->Request->get('display')) { $Query = 'display=' . urlencode($Sender->Request->get('display')); } $RedirectUri = concatSep('&', $this->redirectUri(), $Query); $AccessToken = $Sender->Form->getFormValue('AccessToken'); // Get the access token. if (!$AccessToken && $Code) { // Exchange the token for an access token. $Code = urlencode($Code); $AccessToken = $this->getAccessToken($Code, $RedirectUri); $NewToken = true; } // Get the profile. try { $Profile = $this->getProfile($AccessToken); } catch (Exception $Ex) { if (!isset($NewToken)) { // There was an error getting the profile, which probably means the saved access token is no longer valid. Try and reauthorize. if ($Sender->deliveryType() == DELIVERY_TYPE_ALL) { redirect($this->authorizeUri()); } else { $Sender->setHeader('Content-type', 'application/json'); $Sender->deliveryMethod(DELIVERY_METHOD_JSON); $Sender->RedirectUrl = $this->authorizeUri(); } } else { $Sender->Form->addError('There was an error with the Facebook connection.'); } } $Form = $Sender->Form; //new Gdn_Form(); $ID = val('id', $Profile); $Form->setFormValue('UniqueID', $ID); $Form->setFormValue('Provider', self::ProviderKey); $Form->setFormValue('ProviderName', 'Facebook'); $Form->setFormValue('FullName', val('name', $Profile)); $Form->setFormValue('Email', val('email', $Profile)); $Form->setFormValue('Photo', "//graph.facebook.com/{$ID}/picture?width=200&height=200"); $Form->addHidden('AccessToken', $AccessToken); if (c('Plugins.Facebook.UseFacebookNames')) { $Form->setFormValue('Name', val('name', $Profile)); saveToConfig(array('Garden.User.ValidationRegex' => UserModel::USERNAME_REGEX_MIN, 'Garden.User.ValidationLength' => '{3,50}', 'Garden.Registration.NameUnique' => false), '', false); } // Save some original data in the attributes of the connection for later API calls. $Attributes = array(); $Attributes[self::ProviderKey] = array('AccessToken' => $AccessToken, 'Profile' => $Profile); $Form->setFormValue('Attributes', $Attributes); $Sender->setData('Verified', true); }
/** * * * @param Gdn_Controller $Sender * @param array $Args */ public function base_connectData_handler($Sender, $Args) { if (val(0, $Args) != 'twitter') { return; } $Form = $Sender->Form; //new Gdn_Form(); $RequestToken = val('oauth_token', $_GET); $AccessToken = $Form->getFormValue('AccessToken'); if ($AccessToken) { $AccessToken = $this->getOAuthToken($AccessToken); $this->accessToken($AccessToken); } // Get the access token. if ($RequestToken && !$AccessToken) { // Get the request secret. $RequestToken = $this->getOAuthToken($RequestToken); $Consumer = new OAuthConsumer(c('Plugins.Twitter.ConsumerKey'), c('Plugins.Twitter.Secret')); $Url = 'https://api.twitter.com/oauth/access_token'; $Params = array('oauth_verifier' => val('oauth_verifier', $_GET)); $Request = OAuthRequest::from_consumer_and_token($Consumer, $RequestToken, 'POST', $Url, $Params); $SignatureMethod = new OAuthSignatureMethod_HMAC_SHA1(); $Request->sign_request($SignatureMethod, $Consumer, $RequestToken); $Post = $Request->to_postdata(); $Curl = $this->_Curl($Request); $Response = curl_exec($Curl); if ($Response === false) { $Response = curl_error($Curl); } $HttpCode = curl_getinfo($Curl, CURLINFO_HTTP_CODE); curl_close($Curl); if ($HttpCode == '200') { $Data = OAuthUtil::parse_parameters($Response); $AccessToken = new OAuthToken(val('oauth_token', $Data), val('oauth_token_secret', $Data)); // Save the access token to the database. $this->setOAuthToken($AccessToken->key, $AccessToken->secret, 'access'); $this->accessToken($AccessToken->key, $AccessToken->secret); // Delete the request token. $this->deleteOAuthToken($RequestToken); } else { // There was some sort of error. throw new Exception('There was an error authenticating with twitter.', 400); } $NewToken = true; } // Get the profile. try { $Profile = $this->getProfile($AccessToken); } catch (Exception $Ex) { if (!isset($NewToken)) { // There was an error getting the profile, which probably means the saved access token is no longer valid. Try and reauthorize. if ($Sender->deliveryType() == DELIVERY_TYPE_ALL) { redirect($this->_AuthorizeHref()); } else { $Sender->setHeader('Content-type', 'application/json'); $Sender->deliveryMethod(DELIVERY_METHOD_JSON); $Sender->RedirectUrl = $this->_authorizeHref(); } } else { throw $Ex; } } $ID = val('id', $Profile); $Form->setFormValue('UniqueID', $ID); $Form->setFormValue('Provider', self::ProviderKey); $Form->setFormValue('ProviderName', 'Twitter'); $Form->setValue('ConnectName', val('screen_name', $Profile)); $Form->setFormValue('Name', val('screen_name', $Profile)); $Form->setFormValue('FullName', val('name', $Profile)); $Form->setFormValue('Photo', val('profile_image_url_https', $Profile)); $Form->addHidden('AccessToken', $AccessToken->key); // Save some original data in the attributes of the connection for later API calls. $Attributes = array(self::ProviderKey => array('AccessToken' => array($AccessToken->key, $AccessToken->secret), 'Profile' => $Profile)); $Form->setFormValue('Attributes', $Attributes); $Sender->setData('Verified', true); }
/** * * * @param Gdn_Controller $Controller * @param string $Type * @return void */ protected function attachUploadsToComment($Controller, $Type = 'comment') { $RawType = ucfirst($Type); if (StringEndsWith($Controller->RequestMethod, 'Comment', true) && $Type != 'comment') { $Type = 'comment'; $RawType = 'Comment'; if (!isset($Controller->Comment)) { return; } $Controller->EventArguments['Comment'] = $Controller->Comment; } $MediaList = $this->mediaCache(); if (!is_array($MediaList)) { return; } $Param = $Type == 'comment' ? 'CommentID' : 'DiscussionID'; $MediaKey = $Type . '/' . val($Param, val($RawType, $Controller->EventArguments)); if (array_key_exists($MediaKey, $MediaList)) { include_once $Controller->fetchViewLocation('fileupload_functions', '', 'plugins/FileUpload'); $Controller->setData('CommentMediaList', $MediaList[$MediaKey]); $Controller->setData('GearImage', $this->getWebResource('images/gear.png')); $Controller->setData('Garbage', $this->getWebResource('images/trash.png')); $Controller->setData('CanDownload', $this->CanDownload); echo $Controller->fetchView($this->getView('link_files.php')); } }
/** * Render the email. * * @return string The rendered email. */ public function toString() { if ($this->isPlaintext()) { return $this->plainTextEmail(); } $controller = new Gdn_Controller(); $controller->setData('email', $this->objectToArray($this)); $email = $controller->fetchView($this->view); // Append plaintext version $email .= self::PLAINTEXT_START . $this->plainTextEmail(); return $email; }
/** * Add a method to the ModerationController to handle merging discussions. * * @param Gdn_Controller $Sender */ public function moderationController_mergeDiscussions_create($Sender) { $Session = Gdn::session(); $Sender->Form = new Gdn_Form(); $Sender->title(t('Merge Discussions')); $DiscussionModel = new DiscussionModel(); $CheckedDiscussions = Gdn::userModel()->getAttribute($Session->User->UserID, 'CheckedDiscussions', array()); if (!is_array($CheckedDiscussions)) { $CheckedDiscussions = array(); } $DiscussionIDs = $CheckedDiscussions; $Sender->setData('DiscussionIDs', $DiscussionIDs); $CountCheckedDiscussions = count($DiscussionIDs); $Sender->setData('CountCheckedDiscussions', $CountCheckedDiscussions); $Discussions = $DiscussionModel->SQL->whereIn('DiscussionID', $DiscussionIDs)->get('Discussion')->resultArray(); $Sender->setData('Discussions', $Discussions); // Make sure none of the selected discussions are ghost redirects. $discussionTypes = array_column($Discussions, 'Type'); if (in_array('redirect', $discussionTypes)) { throw Gdn_UserException('You cannot merge redirects.', 400); } // Perform the merge if ($Sender->Form->authenticatedPostBack()) { // Create a new discussion record $MergeDiscussion = false; $MergeDiscussionID = $Sender->Form->getFormValue('MergeDiscussionID'); foreach ($Discussions as $Discussion) { if ($Discussion['DiscussionID'] == $MergeDiscussionID) { $MergeDiscussion = $Discussion; break; } } $RedirectLink = $Sender->Form->getFormValue('RedirectLink'); if ($MergeDiscussion) { $ErrorCount = 0; // Verify that the user has permission to perform the merge. $Category = CategoryModel::categories($MergeDiscussion['CategoryID']); if ($Category && !$Category['PermsDiscussionsEdit']) { throw permissionException('Vanilla.Discussions.Edit'); } $DiscussionModel->defineSchema(); $MaxNameLength = val('Length', $DiscussionModel->Schema->getField('Name')); // Assign the comments to the new discussion record $DiscussionModel->SQL->update('Comment')->set('DiscussionID', $MergeDiscussionID)->whereIn('DiscussionID', $DiscussionIDs)->put(); $CommentModel = new CommentModel(); foreach ($Discussions as $Discussion) { if ($Discussion['DiscussionID'] == $MergeDiscussionID) { continue; } // Create a comment out of the discussion. $Comment = arrayTranslate($Discussion, array('Body', 'Format', 'DateInserted', 'InsertUserID', 'InsertIPAddress', 'DateUpdated', 'UpdateUserID', 'UpdateIPAddress', 'Attributes', 'Spam', 'Likes', 'Abuse')); $Comment['DiscussionID'] = $MergeDiscussionID; $CommentModel->Validation->results(true); $CommentID = $CommentModel->save($Comment); if ($CommentID) { // Move any attachments (FileUpload plugin awareness) if (class_exists('MediaModel')) { $MediaModel = new MediaModel(); $MediaModel->reassign($Discussion['DiscussionID'], 'discussion', $CommentID, 'comment'); } if ($RedirectLink) { // The discussion needs to be changed to a moved link. $RedirectDiscussion = array('Name' => SliceString(sprintf(t('Merged: %s'), $Discussion['Name']), $MaxNameLength), 'Type' => 'redirect', 'Body' => formatString(t('This discussion has been <a href="{url,html}">merged</a>.'), array('url' => DiscussionUrl($MergeDiscussion))), 'Format' => 'Html'); $DiscussionModel->setField($Discussion['DiscussionID'], $RedirectDiscussion); $CommentModel->updateCommentCount($Discussion['DiscussionID']); $CommentModel->removePageCache($Discussion['DiscussionID']); } else { // Delete discussion that was merged. $DiscussionModel->delete($Discussion['DiscussionID']); } } else { $Sender->informMessage($CommentModel->Validation->resultsText()); $ErrorCount++; } } // Update counts on all affected discussions. $CommentModel->updateCommentCount($MergeDiscussionID); $CommentModel->removePageCache($MergeDiscussionID); // Clear selections Gdn::userModel()->saveAttribute($Session->UserID, 'CheckedDiscussions', false); ModerationController::informCheckedDiscussions($Sender); if ($ErrorCount == 0) { $Sender->jsonTarget('', '', 'Refresh'); } } } $Sender->render('MergeDiscussions', '', 'plugins/SplitMerge'); }
/** * Delete a Tag * * @param Gdn_Controller $Sender */ public function controller_delete($Sender) { $Sender->permission('Garden.Settings.Manage'); $TagID = val(1, $Sender->RequestArgs); $TagModel = new TagModel(); $Tag = $TagModel->getID($TagID, DATASET_TYPE_ARRAY); if ($Sender->Form->authenticatedPostBack()) { // Delete tag & tag relations. $SQL = Gdn::sql(); $SQL->delete('TagDiscussion', array('TagID' => $TagID)); $SQL->delete('Tag', array('TagID' => $TagID)); $Sender->informMessage(formatString(t('<b>{Name}</b> deleted.'), $Tag)); $Sender->jsonTarget("#Tag_{$Tag['TagID']}", null, 'Remove'); } $Sender->setData('Title', t('Delete Tag')); $Sender->render('delete', '', 'plugins/Tagging'); }
/** * The settings page for vanillicon. * * @param Gdn_Controller $sender */ public function settingsController_vanillicon_create($sender) { $sender->permission('Garden.Settings.Manage'); $cf = new ConfigurationModule($sender); $items = array('v1' => 'Vanillicon 1', 'v2' => 'Vanillicon 2 (beta)'); $cachePath = self::getCachePath(); $writable = is_writable($cachePath); $txtNotWritable = '<p style="color: #c00;">' . T('<b>Warning:</b> the cache directory is not writable. If you want to use the cache mechanism, you have to enable write permissions for') . '</p><code>' . $cachePath . '</code><br><br><br>'; $txtProxyActive = '<p style="color: #090;">' . T('<b>Congratulations: The privacy of your users is respected!</b> All requests to vanillicon.com are made by your server and not by your users.') . '</p><br>'; $cf->initialize(array('Plugins.Vanillicon.Type' => array('LabelCode' => 'Vanillicon Proxy', 'Control' => 'radiolist', 'Description' => $txtProxyActive . ($writable ? '' : $txtNotWritable) . ' ' . T('Which vanillicon set do you want to use?'), 'Items' => $items, 'Options' => array('list' => true, 'listclass' => 'icon-list', 'display' => 'after'), 'Default' => 'v1'))); $sender->addSideMenu(); $sender->setData('Title', sprintf(t('%s Settings'), 'Vanillicon')); $cf->renderAll(); }
/** * Edit a Tag * * @param Gdn_Controller $Sender */ public function controller_edit($Sender) { $Sender->addSideMenu('settings/tagging'); $Sender->title(t('Edit Tag')); $TagID = val(1, $Sender->RequestArgs); // Set the model on the form. $TagModel = new TagModel(); $Sender->Form->setModel($TagModel); $Tag = $TagModel->getID($TagID); $Sender->Form->setData($Tag); // Make sure the form knows which item we are editing. $Sender->Form->addHidden('TagID', $TagID); if ($Sender->Form->authenticatedPostBack()) { // Make sure the tag is valid $TagData = $Sender->Form->getFormValue('Name'); if (!TagModel::validateTag($TagData)) { $Sender->Form->addError('@' . t('ValidateTag', 'Tags cannot contain commas.')); } // Make sure that the tag name is not already in use. if ($TagModel->getWhere(array('TagID <>' => $TagID, 'Name' => $TagData))->numRows() > 0) { $Sender->setData('MergeTagVisible', true); if (!$Sender->Form->getFormValue('MergeTag')) { $Sender->Form->addError('The specified tag name is already in use.'); } } if ($Sender->Form->Save()) { $Sender->informMessage(t('Your changes have been saved.')); } } $Sender->render('addedit', '', 'plugins/Tagging'); }