Voting Plugin, Adding Popular week, month, etc.
I am adding the functions, Popular Weekly, Popular Monthly, and so on to my voting plugin.
Ive got it down how to expand and create new discussion controllers, but i am not positive how to limit it to posts for the week, month, etc.
Heres my new function for the Popular this week.
Also i am having trouble with my pagers not working correctly, only displays first page, seems offset isn't working right.
public function DiscussionsController_PopularThisWeek_Create($Sender) {
// if (!C('Plugins.Voting.Enabled'))
// return;
$Sender->Title(T('Popular This Week')); // This sets title of page
$Sender->Head->Title($Sender->Head->Title());
$Offset = GetValue('0', $Sender->RequestArgs, '0');
// Get rid of announcements from this view
if ($Sender->Head) {
$Sender->AddJsFile('discussions.js');
$Sender->AddJsFile('bookmark.js');
$Sender->AddJsFile('options.js');
$Sender->Head->AddRss($Sender->SelfUrl.'/feed.rss', $Sender->Head->Title());
}
if (!is_numeric($Offset) || $Offset < 0)
$Offset = 0;
// Add Modules
$Sender->AddModule('NewDiscussionModule');
$BookmarkedModule = new BookmarkedModule($Sender);
$BookmarkedModule->GetData();
$Sender->AddModule($BookmarkedModule);
$Sender->SetData('Category', FALSE, TRUE); // I think this would be where i need to limit the dates somehow.
$Limit = C('Vanilla.Discussions.PerPage', 30);
$DiscussionModel = new DiscussionModel();
$CountDiscussions = $DiscussionModel->GetCount();
$Sender->SetData('CountDiscussions', $CountDiscussions);
$Sender->AnnounceData = FALSE;
$Sender->SetData('Announcements', array(), TRUE);
$DiscussionModel->SQL->OrderBy('d.Score', 'desc');
$Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit);
$Sender->SetData('Discussions', $Sender->DiscussionData, TRUE); // Or possibly right here
$Sender->SetJson('Loading', $Offset . ' to ' . $Limit);
// Build a pager.
$PagerFactory = new Gdn_PagerFactory();
$Sender->Pager = $PagerFactory->GetPager('Pager', $Sender);
$Sender->Pager->ClientID = 'Pager';
$Sender->Pager->Configure(
$Offset,
$Limit,
$CountDiscussions,
'discussions/popular/%1$s'
);
// Deliver json data if necessary
if ($Sender->DeliveryType() != DELIVERY_TYPE_ALL) {
$Sender->SetJson('LessRow', $Sender->Pager->ToString('less'));
$Sender->SetJson('MoreRow', $Sender->Pager->ToString('more'));
$Sender->View = 'discussions';
}
// Set a definition of the user's current timezone from the db. jQuery
// will pick this up, compare to the browser, and update the user's
// timezone if necessary.
$CurrentUser = Gdn::Session()->User;
if (is_object($CurrentUser)) {
$ClientHour = $CurrentUser->HourOffset + date('G', time());
$Sender->AddDefinition('SetClientHour', $ClientHour);
}
// Render the controller
$Sender->View = 'index';
$Sender->Render();
}
Tagged:
0
Comments
So far ive got it to limit posts to a specific date and so on, Trying to make a function to create a date format the same as stored in the database, but 1 week earlier than the current timestamp.
Heres what i got so far:
$Whereas = array("DateInserted >" => date( 'Y-n-j g:i:s' )); $Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit, $Whereas);This only works because, this date is setup as 12hr cycle, instead of 24hour. So it wont work really well.
I just need to now make a function to take that date and subtract 1 week from it, 1 day, and so on.
here's an example that you could modify.:
http://vanillaforums.org/discussion/comment/168515/#Comment_168515
I may not provide the completed solution you might desire, but I do try to provide honest suggestions to help you solve your issue.
Looks like i figured out how todo it in a way.
Set it to one week, and it works lol.
// This is to sort posts by Discussion Score $DiscussionModel->SQL->OrderBy('d.Score', 'desc'); // This is to set how old you want posts to display $currentdate = date( 'Y-n-j G:i:s' ); $newdate = $newdate = strtotime ( '-1 week' , strtotime ( $currentdate ) ) ; $newdate = date( 'Y-n-j G:i:s', $newdate ); // Setting date limit here $Whereas = array("DateInserted >" => $newdate); $Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit, $Whereas);Actually thats a much cleaner method, I have updated my code as follows:
// Setting date limit here $Whereas = array("DateInserted >" => Gdn_Format::ToDateTime(strtotime('-1 week'))); $Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit, $Whereas); $Sender->SetData('Discussions', $Sender->DiscussionData, TRUE);This is what i finally ended up with, it makes two more tabs, so a total of 3 tabs, Popular All Time, Popular Today, And Popular This Week. Enjoy. Trying to fix the paging bug atm still.
/** * Add the "Popular Questions" tab. */ public function Base_BeforeDiscussionTabs_Handler($Sender) {// if (!C('Plugins.Voting.Enabled'))
// return;
echo ' <li'.($Sender->RequestMethod == 'popular' ? ' class="Active"' : '').'>' .Anchor(T('Popular All Time'), '/discussions/popular', 'PopularDiscussions TabLink') .'</li>'; echo ' <li'.($Sender->RequestMethod == 'populartoday' ? ' class="Active"' : '').'>' .Anchor(T('Popular Today'), '/discussions/populartoday', 'PopularDiscussions TabLink') .'</li>'; echo ' <li'.($Sender->RequestMethod == 'popularthisweek' ? ' class="Active"' : '').'>' .Anchor(T('Popular This Week'), '/discussions/popularthisweek', 'PopularDiscussions TabLink') .'</li>'; }// public function CategoriesController_BeforeDiscussionContent_Handler($Sender) {
// $this->DiscussionsController_BeforeDiscussionContent_Handler($Sender);
// }
/**
* Load popular discussions.
*/
public function DiscussionsController_Popular_Create($Sender) {
// if (!C('Plugins.Voting.Enabled'))
// return;
$Sender->Title(T('Popular of All Time')); $Sender->Head->Title($Sender->Head->Title()); $Offset = GetValue('0', $Sender->RequestArgs, '0'); // Get rid of announcements from this view if ($Sender->Head) { $Sender->AddJsFile('discussions.js'); $Sender->AddJsFile('bookmark.js'); $Sender->AddJsFile('options.js'); $Sender->Head->AddRss($Sender->SelfUrl.'/feed.rss', $Sender->Head->Title()); } if (!is_numeric($Offset) || $Offset < 0) $Offset = 0; // Add Modules $Sender->AddModule('NewDiscussionModule'); $BookmarkedModule = new BookmarkedModule($Sender); $BookmarkedModule->GetData(); $Sender->AddModule($BookmarkedModule); $Sender->SetData('Category', FALSE, TRUE); $Limit = C('Vanilla.Discussions.PerPage', 30); $DiscussionModel = new DiscussionModel(); $CountDiscussions = $DiscussionModel->GetCount(); $Sender->SetData('CountDiscussions', $CountDiscussions); $Sender->AnnounceData = FALSE; $Sender->SetData('Announcements', array(), TRUE); $DiscussionModel->SQL->OrderBy('d.Score', 'desc'); $Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit); $Sender->SetData('Discussions', $Sender->DiscussionData, TRUE); $Sender->SetJson('Loading', $Offset . ' to ' . $Limit); // Build a pager. $PagerFactory = new Gdn_PagerFactory(); $Sender->Pager = $PagerFactory->GetPager('Pager', $Sender); $Sender->Pager->ClientID = 'Pager'; $Sender->Pager->Configure( $Offset, $Limit, $CountDiscussions, 'discussions/popular/%1$s' ); // Deliver json data if necessary if ($Sender->DeliveryType() != DELIVERY_TYPE_ALL) { $Sender->SetJson('LessRow', $Sender->Pager->ToString('less')); $Sender->SetJson('MoreRow', $Sender->Pager->ToString('more')); $Sender->View = 'discussions'; } // Set a definition of the user's current timezone from the db. jQuery // will pick this up, compare to the browser, and update the user's // timezone if necessary. $CurrentUser = Gdn::Session()->User; if (is_object($CurrentUser)) { $ClientHour = $CurrentUser->HourOffset + date('G', time()); $Sender->AddDefinition('SetClientHour', $ClientHour); } // Render the controller $Sender->View = 'index'; $Sender->Render();}
public function DiscussionsController_PopularThisWeek_Create($Sender) {
// if (!C('Plugins.Voting.Enabled'))
// return;
$Sender->Title(T('Popular This Week')); $Sender->Head->Title($Sender->Head->Title()); $Offset = GetValue('0', $Sender->RequestArgs, '0'); // Get rid of announcements from this view if ($Sender->Head) { $Sender->AddJsFile('discussions.js'); $Sender->AddJsFile('bookmark.js'); $Sender->AddJsFile('options.js'); $Sender->Head->AddRss($Sender->SelfUrl.'/feed.rss', $Sender->Head->Title()); } if (!is_numeric($Offset) || $Offset < 0) $Offset = 0; // Add Modules $Sender->AddModule('NewDiscussionModule'); $BookmarkedModule = new BookmarkedModule($Sender); $BookmarkedModule->GetData(); $Sender->AddModule($BookmarkedModule); $Sender->SetData('Category', FALSE, TRUE); $Limit = C('Vanilla.Discussions.PerPage', 30); $DiscussionModel = new DiscussionModel(); $CountDiscussions = $DiscussionModel->GetCount(array("DateInserted >" => Gdn_Format::ToDateTime(strtotime('-1 week')))); $Sender->SetData('CountDiscussions', $CountDiscussions); $Sender->AnnounceData = FALSE; $Sender->SetData('Announcements', array(), TRUE); // This is to sort posts by Discussion Score $DiscussionModel->SQL->OrderBy('d.Score', 'desc'); // Setting date limit here $Whereas = array("DateInserted >" => Gdn_Format::ToDateTime(strtotime('-1 week'))); $Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit, $Whereas); $Sender->SetData('Discussions', $Sender->DiscussionData, TRUE); $Sender->SetJson('Loading', $Offset . ' to ' . $Limit); // Build a pager. $PagerFactory = new Gdn_PagerFactory(); $Sender->Pager = $PagerFactory->GetPager('Pager', $Sender); $Sender->Pager->ClientID = 'Pager'; $Sender->Pager->Configure( $Offset, $Limit, $CountDiscussions, 'discussions/popular/%1$s' ); // Deliver json data if necessary if ($Sender->DeliveryType() != DELIVERY_TYPE_ALL) { $Sender->SetJson('LessRow', $Sender->Pager->ToString('less')); $Sender->SetJson('MoreRow', $Sender->Pager->ToString('more')); $Sender->View = 'discussions'; } // Set a definition of the user's current timezone from the db. jQuery // will pick this up, compare to the browser, and update the user's // timezone if necessary. $CurrentUser = Gdn::Session()->User; if (is_object($CurrentUser)) { $ClientHour = $CurrentUser->HourOffset + date('G', time()); $Sender->AddDefinition('SetClientHour', $ClientHour); } // Render the controller $Sender->View = 'index'; $Sender->Render();}
public function DiscussionsController_PopularToday_Create($Sender) {
// if (!C('Plugins.Voting.Enabled'))
// return;
$Sender->Title(T('Popular This Week')); $Sender->Head->Title($Sender->Head->Title()); $Offset = GetValue('0', $Sender->RequestArgs, '0'); // Get rid of announcements from this view if ($Sender->Head) { $Sender->AddJsFile('discussions.js'); $Sender->AddJsFile('bookmark.js'); $Sender->AddJsFile('options.js'); $Sender->Head->AddRss($Sender->SelfUrl.'/feed.rss', $Sender->Head->Title()); } if (!is_numeric($Offset) || $Offset < 0) $Offset = 0; // Add Modules $Sender->AddModule('NewDiscussionModule'); $BookmarkedModule = new BookmarkedModule($Sender); $BookmarkedModule->GetData(); $Sender->AddModule($BookmarkedModule); $Sender->SetData('Category', FALSE, TRUE); $Limit = C('Vanilla.Discussions.PerPage', 30); $DiscussionModel = new DiscussionModel(); $CountDiscussions = $DiscussionModel->GetCount(array("DateInserted >" => Gdn_Format::ToDateTime(strtotime('-1 day')))); $Sender->SetData('CountDiscussions', $CountDiscussions); $Sender->AnnounceData = FALSE; $Sender->SetData('Announcements', array(), TRUE); // This is to sort posts by Discussion Score $DiscussionModel->SQL->OrderBy('d.Score', 'desc'); // Setting date limit here $Whereas = array("DateInserted >" => Gdn_Format::ToDateTime(strtotime('-1 day'))); $Sender->DiscussionData = $DiscussionModel->Get($Offset, $Limit, $Whereas); $Sender->SetData('Discussions', $Sender->DiscussionData, TRUE); $Sender->SetJson('Loading', $Offset . ' to ' . $Limit); // Build a pager. $PagerFactory = new Gdn_PagerFactory(); $Sender->Pager = $PagerFactory->GetPager('Pager', $Sender); $Sender->Pager->ClientID = 'Pager'; $Sender->Pager->Configure( $Offset, $Limit, $CountDiscussions, 'discussions/popular/%1$s' ); // Deliver json data if necessary if ($Sender->DeliveryType() != DELIVERY_TYPE_ALL) { $Sender->SetJson('LessRow', $Sender->Pager->ToString('less')); $Sender->SetJson('MoreRow', $Sender->Pager->ToString('more')); $Sender->View = 'discussions'; } // Set a definition of the user's current timezone from the db. jQuery // will pick this up, compare to the browser, and update the user's // timezone if necessary. $CurrentUser = Gdn::Session()->User; if (is_object($CurrentUser)) { $ClientHour = $CurrentUser->HourOffset + date('G', time()); $Sender->AddDefinition('SetClientHour', $ClientHour); } // Render the controller $Sender->View = 'index'; $Sender->Render();}