1: <?php if (!defined('APPLICATION')) exit();
2:
3:
4: 5: 6: 7: 8: 9: 10: 11:
12:
13: class RankModel extends Gdn_Model {
14:
15: 16: 17: 18:
19: private static $_Ranks = NULL;
20:
21: 22: 23: 24:
25: private static $_Perks = array();
26:
27: 28: 29:
30: public function __construct() {
31: parent::__construct('Rank');
32: }
33:
34: 35: 36: 37: 38:
39: public function Get() {
40: if(empty(self::$_Ranks)) {
41: self::$_Ranks = $this->SQL
42: ->Select()
43: ->From('Rank')
44: ->OrderBy('Sort')
45: ->Get()
46: ->Result();
47: }
48: return self::$_Ranks;
49: }
50:
51: 52: 53: 54: 55:
56: public function GetCount() {
57: return count($this->Get());
58: }
59:
60: 61: 62: 63: 64: 65:
66: public function GetByID($RankID) {
67: $Ranks = $this->Get();
68:
69: foreach($Ranks as $Rank) {
70: if($Rank->RankID == $RankID) {
71: return $Rank;
72: }
73: }
74:
75: return NULL;
76: }
77:
78: 79: 80: 81: 82: 83:
84: public function GetHighestQualifyingRank($User) {
85: $Points = $User->Points;
86: $Posts = $User->CountDiscussions + $User->CountComments;
87: $StartDate = strtotime($User->DateInserted);
88:
89: $Ranks = $this->Get();
90:
91: $HighestRank = NULL;
92: foreach($Ranks as $Rank) {
93:
94: if(!$Rank->Enabled) {
95: continue;
96: }
97:
98: $TargetDate = time() - $Rank->AgeReq;
99: if($Points >= $Rank->PointReq && $Posts >= $Rank->PostReq && $StartDate <= $TargetDate) {
100: $HighestRank = $Rank;
101: }
102: else {
103:
104: break;
105: }
106: }
107:
108: return $HighestRank;
109: }
110:
111: 112: 113: 114: 115: 116:
117: public function GetPerks($RankID) {
118: if(!array_key_exists($RankID, self::$_Perks)) {
119: $Ranks = $this->Get();
120: foreach($Ranks as $Rank) {
121: self::$_Perks[$Rank->RankID] = unserialize($Rank->Perks);
122:
123: if(self::$_Perks[$Rank->RankID] === FALSE) {
124: self::$_Perks[$Rank->RankID] = array();
125: }
126: }
127: }
128:
129: return self::$_Perks[$RankID];
130: }
131:
132: 133: 134: 135: 136: 137:
138: public function GetPerkRoleIDs($RankID) {
139: $Perks = $this->GetPerks($RankID);
140:
141: $RoleIDs = array();
142: foreach($Perks as $Perk => $Value) {
143: if(substr($Perk, 0, 4) === 'Role') {
144: $RoleIDs[] = $Value;
145: }
146: }
147:
148: return $RoleIDs;
149: }
150:
151: 152: 153: 154: 155: 156:
157: public function Enable($RankID, $Enable) {
158: $Enable = (!$Enable) ? FALSE : TRUE;
159: $this->SQL
160: ->Update('Rank')
161: ->Set('Enabled', $Enable)
162: ->Where('RankID', $RankID)
163: ->Put();
164: }
165:
166: 167: 168: 169: 170: 171:
172: public function Delete($RankID) {
173: $Rank = $this->GetByID($RankID);
174: if(!$Rank) {
175: $this->SQL->Delete('Rank', array('RankID' => $RankID));
176: return TRUE;
177: }
178: return FALSE;
179: }
180:
181: 182: 183: 184: 185: 186: 187:
188: public function Set($RankID, $UserID, $Activity = FALSE) {
189: $Rank = $this->GetByID($RankID);
190: if($Activity) {
191:
192: $ActivityModel = new ActivityModel();
193:
194: $Activity = array(
195: 'ActivityType' => 'RankPromotion',
196: 'ActivityUserID' => $UserID,
197: 'RegardingUserID' => $UserID,
198: 'Photo' => C('Yaga.Ranks.Photo'),
199: 'RecordType' => 'Rank',
200: 'RecordID' => $Rank->RankID,
201: 'HeadlineFormat' => T('Yaga.HeadlineFormat.Promoted'),
202: 'Data' => array(
203: 'Name' => $Rank->Name
204: ),
205: 'Story' => $Rank->Description
206: );
207:
208:
209: $ActivityModel->Queue($Activity, FALSE);
210:
211:
212: $Activity['NotifyUserID'] = $UserID;
213: $ActivityModel->Queue($Activity, 'RankPromotion', array('Force' => TRUE));
214:
215: $ActivityModel->SaveQueue();
216: }
217:
218:
219: $UserModel = Gdn::UserModel();
220: $OldRankID = $UserModel->GetID($UserID)->RankID;
221:
222: $UserModel->SetField($UserID, 'RankID', $Rank->RankID);
223:
224:
225: $this->_UpdateUserRoles($UserID, $OldRankID, $Rank->RankID);
226:
227: $this->EventArguments['Rank'] = $Rank;
228: $this->EventArguments['UserID'] = $UserID;
229: $this->FireEvent('AfterRankChange');
230: }
231:
232: 233: 234: 235: 236: 237:
238: public function SaveSort($SortArray) {
239: foreach($SortArray as $Index => $Rank) {
240:
241: if($Index == 0) {
242: continue;
243: }
244:
245:
246: $RankID = substr($Rank, 7);
247: $this->SetField($RankID, 'Sort', $Index);
248: }
249: return TRUE;
250: }
251:
252: 253: 254: 255: 256: 257: 258:
259: private function _UpdateUserRoles($UserID, $OldRankID, $NewRankID) {
260: $UserModel = Gdn::UserModel();
261:
262:
263: $CurrentRoleData = $UserModel->GetRoles($UserID);
264: $CurrentRoleIDs = ConsolidateArrayValuesByKey($CurrentRoleData->Result(), 'RoleID');
265:
266:
267: $OldPerkRoles = $this->GetPerkRoleIDs($OldRankID);
268: $NewPerkRoles = $this->GetPerkRoleIDs($NewRankID);
269:
270:
271: $TempRoleIDs = array_diff($CurrentRoleIDs, $OldPerkRoles);
272:
273:
274: $NewRoleIDs = array_unique(array_merge($TempRoleIDs, $NewPerkRoles));
275:
276:
277: if($NewRoleIDs != $CurrentRoleIDs) {
278: $UserModel->SaveRoles($UserID, $NewRoleIDs, FALSE);
279: }
280:
281: }
282: }
283: