public function Get($Begin, $End, $Offset = '0', $Limit = '')
 {
     // Validate parameters, set today as default
     $BeginDate = strtotime($Begin);
     if ($BeginDate <= 0) {
         $BeginDate = date('Y-m-d');
     } else {
         $BeginDate = date('Y-m-d', $BeginDate);
     }
     $EndDate = strtotime($End);
     if ($EndDate <= 0) {
         $EndDate = date('Y-m-d');
     } else {
         $EndDate = date('Y-m-d', $EndDate);
     }
     if (!is_numeric($Offset)) {
         $Offset = 0;
     }
     if (!is_numeric($Limit)) {
         $Limit = '';
     }
     $Sql = GDN::SQL();
     $Sql->Select('d.Name, d.Body, d.Format')->Select('d.InsertUserID', '', 'UserID')->Select('DAY FROM d.EventCalendarDate', 'EXTRACT', 'EventCalendarDay')->From('Discussion d')->Where('d.EventCalendarDate >=', $BeginDate)->Where('d.EventCalendarDate <=', $EndDate)->OrderBy('d.EventCalendarDate')->Limit($Limit, $Offset);
     // add permission restrictions if necessary
     $Perms = DiscussionModel::CategoryPermissions();
     if ($Perms !== TRUE) {
         $Sql->WhereIn('d.CategoryID', $Perms);
     }
     // return $Sql->GetSelect();
     return $Sql->Get()->ResultArray();
 }
   public function GetData($Limit = 10) {
      $this->Data = FALSE;
      if (Gdn::Session()->IsValid() && C('Vanilla.Modules.ShowBookmarkedModule', TRUE)) {
         $BookmarkIDs = Gdn::SQL()
            ->Select('DiscussionID')
            ->From('UserDiscussion')
            ->Where('UserID', Gdn::Session()->UserID)
            ->Where('Bookmarked', 1)
            ->Get()->ResultArray();
         $BookmarkIDs = ConsolidateArrayValuesByKey($BookmarkIDs, 'DiscussionID');

         if (count($BookmarkIDs)) {
            $DiscussionModel = new DiscussionModel();
            DiscussionModel::CategoryPermissions();

            $DiscussionModel->SQL->WhereIn('d.DiscussionID', $BookmarkIDs);
            
            $this->Data = $DiscussionModel->Get(
               0,
               $Limit
            );
         } else {
            $this->Data = FALSE;
         }
      }
   }
 public function getData()
 {
     if (Gdn::session()->isValid()) {
         $BookmarkIDs = Gdn::sql()->select('DiscussionID')->from('UserDiscussion')->where('UserID', Gdn::session()->UserID)->where('Bookmarked', 1)->get()->resultArray();
         $BookmarkIDs = consolidateArrayValuesByKey($BookmarkIDs, 'DiscussionID');
         if (count($BookmarkIDs)) {
             $DiscussionModel = new DiscussionModel();
             DiscussionModel::CategoryPermissions();
             $DiscussionModel->SQL->whereIn('d.DiscussionID', $BookmarkIDs);
             $Bookmarks = $DiscussionModel->get(0, $this->Limit, array('w.Bookmarked' => '1'));
             $this->setData('Bookmarks', $Bookmarks);
         } else {
             $this->setData('Bookmarks', new Gdn_DataSet());
         }
     }
 }
 /**
  *
  * Get comments for a user. This is an optimized version of CommentModel->GetByUser().
  *
  * @since 2.1
  * @access public
  *
  * @param int $UserID Which user to get comments for.
  * @param int $Limit Max number to get.
  * @param int $Offset Number to skip.
  * @param int $LastCommentID A hint for quicker paging.
  * @return Gdn_DataSet SQL results.
  */
 public function getByUser2($UserID, $Limit, $Offset, $LastCommentID = false)
 {
     $Perms = DiscussionModel::CategoryPermissions();
     if (is_array($Perms) && empty($Perms)) {
         return new Gdn_DataSet(array());
     }
     // The point of this query is to select from one comment table, but filter and sort on another.
     // This puts the paging into an index scan rather than a table scan.
     $this->SQL->select('c2.*')->select('d.Name', '', 'DiscussionName')->select('d.CategoryID')->from('Comment c')->join('Comment c2', 'c.CommentID = c2.CommentID')->join('Discussion d', 'c2.DiscussionID = d.DiscussionID')->where('c.InsertUserID', $UserID)->orderBy('c.CommentID', 'desc');
     if ($LastCommentID) {
         // The last comment id from the last page was given and can be used as a hint to speed up the query.
         $this->SQL->where('c.CommentID <', $LastCommentID)->limit($Limit);
     } else {
         $this->SQL->limit($Limit, $Offset);
     }
     $Data = $this->SQL->get();
     $Result =& $Data->result();
     $this->LastCommentCount = $Data->numRows();
     if (count($Result) > 0) {
         $this->LastCommentID = $Result[count($Result) - 1]->CommentID;
     } else {
         $this->LastCommentID = null;
     }
     // Now that we have th comments we can filter out the ones we don't have permission to.
     if ($Perms !== true) {
         $Remove = array();
         foreach ($Data->result() as $Index => $Row) {
             if (!in_array($Row->CategoryID, $Perms)) {
                 $Remove[] = $Index;
             }
         }
         if (count($Remove) > 0) {
             foreach ($Remove as $Index) {
                 unset($Result[$Index]);
             }
             $Result = array_values($Result);
         }
     }
     Gdn::userModel()->joinUsers($Data, array('InsertUserID', 'UpdateUserID'));
     $this->EventArguments['Comments'] =& $Data;
     $this->fireEvent('AfterGet');
     return $Data;
 }
 /**
  * Get full data for a single category by its URL slug. Respects permissions.
  * 
  * @since 2.0.0
  * @access public
  *
  * @param string $UrlCode Unique category slug from URL.
  * @return object SQL results.
  */
 public function GetFullByUrlCode($UrlCode)
 {
     $Data = (object) self::Categories($UrlCode);
     // Check to see if the user has permission for this category.
     // Get the category IDs.
     $CategoryIDs = DiscussionModel::CategoryPermissions();
     if (is_array($CategoryIDs) && !in_array(GetValue('CategoryID', $Data), $CategoryIDs)) {
         $Data = FALSE;
     }
     return $Data;
 }
 /**
  *
  * Get discussions for a user.
  *
  * Events: BeforeGetByUser
  *
  * @since 2.1
  * @access public
  *
  * @param int $UserID Which user to get discussions for.
  * @param int $Limit Max number to get.
  * @param int $Offset Number to skip.
  * @param int $LastDiscussionID A hint for quicker paging.
  * @param int $WatchUserID User to use for read/unread data.
  * @return Gdn_DataSet SQL results.
  */
 public function getByUser($UserID, $Limit, $Offset, $LastDiscussionID = false, $WatchUserID = false)
 {
     $Perms = DiscussionModel::CategoryPermissions();
     if (is_array($Perms) && empty($Perms)) {
         return new Gdn_DataSet(array());
     }
     // Allow us to set perspective of a different user.
     if (!$WatchUserID) {
         $WatchUserID = $UserID;
     }
     // The point of this query is to select from one comment table, but filter and sort on another.
     // This puts the paging into an index scan rather than a table scan.
     $this->SQL->select('d2.*')->select('d2.InsertUserID', '', 'FirstUserID')->select('d2.DateInserted', '', 'FirstDate')->select('d2.DateLastComment', '', 'LastDate')->select('d2.LastCommentUserID', '', 'LastUserID')->from('Discussion d')->join('Discussion d2', 'd.DiscussionID = d2.DiscussionID')->where('d.InsertUserID', $UserID)->orderBy('d.DiscussionID', 'desc');
     // Join in the watch data.
     if ($WatchUserID > 0) {
         $this->SQL->select('w.UserID', '', 'WatchUserID')->select('w.DateLastViewed, w.Dismissed, w.Bookmarked')->select('w.CountComments', '', 'CountCommentWatch')->select('w.Participated')->join('UserDiscussion w', 'd2.DiscussionID = w.DiscussionID and w.UserID = ' . $WatchUserID, 'left');
     } else {
         $this->SQL->select('0', '', 'WatchUserID')->select('now()', '', 'DateLastViewed')->select('0', '', 'Dismissed')->select('0', '', 'Bookmarked')->select('0', '', 'CountCommentWatch')->select('d.Announce', '', 'IsAnnounce');
     }
     if ($LastDiscussionID) {
         // The last comment id from the last page was given and can be used as a hint to speed up the query.
         $this->SQL->where('d.DiscussionID <', $LastDiscussionID)->limit($Limit);
     } else {
         $this->SQL->limit($Limit, $Offset);
     }
     $this->fireEvent('BeforeGetByUser');
     $Data = $this->SQL->get();
     $Result =& $Data->result();
     $this->LastDiscussionCount = $Data->numRows();
     if (count($Result) > 0) {
         $this->LastDiscussionID = $Result[count($Result) - 1]->DiscussionID;
     } else {
         $this->LastDiscussionID = null;
     }
     // Now that we have th comments we can filter out the ones we don't have permission to.
     if ($Perms !== true) {
         $Remove = array();
         foreach ($Data->result() as $Index => $Row) {
             if (!in_array($Row->CategoryID, $Perms)) {
                 $Remove[] = $Index;
             }
         }
         if (count($Remove) > 0) {
             foreach ($Remove as $Index) {
                 unset($Result[$Index]);
             }
             $Result = array_values($Result);
         }
     }
     // Change discussions returned based on additional criteria
     $this->AddDiscussionColumns($Data);
     // Join in the users.
     Gdn::userModel()->joinUsers($Data, array('FirstUserID', 'LastUserID'));
     CategoryModel::JoinCategories($Data);
     if (c('Vanilla.Views.Denormalize', false)) {
         $this->AddDenormalizedViews($Data);
     }
     $this->EventArguments['Data'] =& $Data;
     $this->fireEvent('AfterAddColumns');
     return $Data;
 }
Exemple #7
0
 /**
  * Join external records to an array.
  *
  * @param array &$Data The data to join.
  * In order to join records each row must have the a RecordType and RecordID column.
  * @param string $Column The name of the column to put the record in.
  * If this is blank then the record will be merged into the row.
  * @param bool $Unset Whether or not to unset rows that don't have a record.
  * @since 2.3
  */
 function joinRecords(&$Data, $Column = '', $Unset = false)
 {
     $IDs = array();
     $AllowedCats = DiscussionModel::CategoryPermissions();
     if ($AllowedCats === false) {
         // This user does not have permission to view anything.
         $Data = array();
         return;
     }
     // Gather all of the ids to fetch.
     foreach ($Data as &$Row) {
         if (!$Row['RecordType']) {
             continue;
         }
         $RecordType = ucfirst(StringEndsWith($Row['RecordType'], '-Total', true, true));
         $Row['RecordType'] = $RecordType;
         $ID = $Row['RecordID'];
         $IDs[$RecordType][$ID] = $ID;
     }
     // Fetch all of the data in turn.
     $JoinData = array();
     foreach ($IDs as $RecordType => $RecordIDs) {
         if ($RecordType == 'Comment') {
             Gdn::SQL()->Select('d.Name, d.CategoryID')->Join('Discussion d', 'd.DiscussionID = r.DiscussionID');
         }
         $Rows = Gdn::SQL()->Select('r.*')->WhereIn($RecordType . 'ID', array_values($RecordIDs))->Get($RecordType . ' r')->ResultArray();
         $JoinData[$RecordType] = Gdn_DataSet::Index($Rows, array($RecordType . 'ID'));
     }
     // Join the rows.
     $Unsets = array();
     foreach ($Data as $Index => &$Row) {
         $RecordType = $Row['RecordType'];
         $ID = $Row['RecordID'];
         if (!isset($JoinData[$RecordType][$ID])) {
             if ($Unset) {
                 $Unsets[] = $Index;
             }
             continue;
             // orphaned?
         }
         $Record = $JoinData[$RecordType][$ID];
         if ($AllowedCats !== true) {
             // Check to see if the user has permission to view this record.
             $CategoryID = GetValue('CategoryID', $Record, -1);
             if (!in_array($CategoryID, $AllowedCats)) {
                 $Unsets[] = $Index;
                 continue;
             }
         }
         switch ($RecordType) {
             case 'Discussion':
                 $Url = DiscussionUrl($Record, '', '/') . '#latest';
                 break;
             case 'Comment':
                 $Url = CommentUrl($Record, '/');
                 $Record['Name'] = sprintf(T('Re: %s'), $Record['Name']);
                 break;
             default:
                 $Url = '';
         }
         $Record['Url'] = $Url;
         if ($Column) {
             $Row[$Column] = $Record;
         } else {
             $Row = array_merge($Row, $Record);
         }
     }
     foreach ($Unsets as $Index) {
         unset($Data[$Index]);
     }
     // Join the users.
     Gdn::UserModel()->JoinUsers($Data, array('InsertUserID'));
     if (!empty($Unsets)) {
         $Data = array_values($Data);
     }
 }
Exemple #8
0
 /**
  * Get comments for a user.
  * 
  * @since 2.0.17
  * @access public
  * 
  * @param int $UserID Which user to get comments for.
  * @param int $Limit Max number to get.
  * @param int $Offset Number to skip.
  * @return object SQL results.
  */
 public function GetByUser($UserID, $Limit, $Offset = 0)
 {
     // Get category permissions
     $Perms = DiscussionModel::CategoryPermissions();
     // Build main query
     $this->CommentQuery(TRUE, FALSE);
     $this->FireEvent('BeforeGet');
     $this->SQL->Select('d.Name', '', 'DiscussionName')->Join('Discussion d', 'c.DiscussionID = d.DiscussionID')->Where('c.InsertUserID', $UserID)->OrderBy('c.CommentID', 'desc')->Limit($Limit, $Offset);
     // Verify permissions (restricting by category if necessary)
     if ($Perms !== TRUE) {
         $this->SQL->Join('Category ca', 'd.CategoryID = ca.CategoryID', 'left')->WhereIn('d.CategoryID', $Perms);
     }
     //$this->OrderBy($this->SQL);
     $Data = $this->SQL->Get();
     Gdn::UserModel()->JoinUsers($Data, array('InsertUserID', 'UpdateUserID'));
     return $Data;
 }
   /**
    * Get full data for a single category by its URL slug. Respects permissions.
    * 
    * @since 2.0.0
    * @access public
    *
    * @param string $UrlCode Unique category slug from URL.
    * @return object SQL results.
    */
   public function GetFullByUrlCode($UrlCode) {
      $this->SQL
         ->Select('c.*')
         ->From('Category c')
         ->Where('c.UrlCode', $UrlCode)
         ->Where('c.CategoryID >', 0);
         
      $Data = $this->SQL
         ->Get()
         ->FirstRow();

      // Check to see if the user has permission for this category.
      // Get the category IDs.
      $CategoryIDs = DiscussionModel::CategoryPermissions();
      if (is_array($CategoryIDs) && !in_array(GetValue('CategoryID', $Data), $CategoryIDs))
         $Data = FALSE;
      return $Data;
   }