diff --git a/classes/actions/ActionProfile.class.php b/classes/actions/ActionProfile.class.php index 79f8e62b..907ba8fd 100644 --- a/classes/actions/ActionProfile.class.php +++ b/classes/actions/ActionProfile.class.php @@ -132,6 +132,19 @@ class ActionProfile extends Action { * Получаем список тех у кого в друзьях */ $aUsersSelfFrend=$this->User_GetUsersSelfFrend($this->oUserProfile->getId()); + + if (USER_USE_INVITE) { + /** + * Получаем список тех кого пригласил юзер + */ + $aUsersInvite=$this->User_GetUsersInvite($this->oUserProfile->getId()); + $this->Viewer_Assign('aUsersInvite',$aUsersInvite); + /** + * Получаем того юзера, кто пригласил текущего + */ + $oUserInviteFrom=$this->User_GetUserInviteFrom($this->oUserProfile->getId()); + $this->Viewer_Assign('oUserInviteFrom',$oUserInviteFrom); + } /** * Получаем список блогов в которых состоит юзер */ @@ -145,7 +158,7 @@ class ActionProfile extends Action { */ $this->Viewer_Assign('aBlogsUser',$aBlogsUser); $this->Viewer_Assign('aBlogsOwner',$aBlogsOwner); - $this->Viewer_Assign('aUsersFrend',$aUsersFrend); + $this->Viewer_Assign('aUsersFrend',$aUsersFrend); $this->Viewer_Assign('aUsersSelfFrend',$aUsersSelfFrend); $this->Viewer_AddHtmlTitle('Профиль '.$this->oUserProfile->getLogin()); $this->Viewer_AddHtmlTitle('Whois'); diff --git a/classes/actions/ActionSettings.class.php b/classes/actions/ActionSettings.class.php index 1919845e..a5ae7f1a 100644 --- a/classes/actions/ActionSettings.class.php +++ b/classes/actions/ActionSettings.class.php @@ -97,21 +97,28 @@ class ActionSettings extends Action { * * @return unknown */ - protected function EventInvite() { - $this->sMenuItemSelect='invite'; - $this->sMenuSubItemSelect=''; - - $this->Viewer_AddHtmlTitle('Инвайты'); - + protected function EventInvite() { if (!USER_USE_INVITE) { $this->Message_AddErrorSingle('Приглашения не доступны','Ошибка'); return Router::Action('error'); } + $this->sMenuItemSelect='invite'; + $this->sMenuSubItemSelect=''; + $this->Viewer_AddHtmlTitle('Инвайты'); + + $this->Viewer_Assign('iCountInviteAvailable',$this->User_GetCountInviteAvailable($this->oUserCurrent)); + $this->Viewer_Assign('iCountInviteUsed',$this->User_GetCountInviteUsed($this->oUserCurrent->getId())); + if (!isset($_REQUEST['submit_invite'])) { return ; } + if (!$this->ACL_CanSendInvite($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) { + $this->Message_AddError('У вас пока нет доступных инвайтов','Ошибка'); + return ; + } + if (!func_check(getRequest('invite_mail'),'mail')) { $this->Message_AddError('Неверный формат e-mail','Ошибка'); return ; diff --git a/classes/modules/acl/ACL.class.php b/classes/modules/acl/ACL.class.php index 44223702..7fa664c4 100644 --- a/classes/modules/acl/ACL.class.php +++ b/classes/modules/acl/ACL.class.php @@ -154,5 +154,17 @@ class ACL extends Module { } return false; } + /** + * Проверяет можно ли юзеру слать инвайты + * + * @param UserEntity_User $oUser + * @return unknown + */ + public function CanSendInvite(UserEntity_User $oUser) { + if ($this->User_GetCountInviteAvailable($oUser)==0) { + return false; + } + return true; + } } ?> \ No newline at end of file diff --git a/classes/modules/user/User.class.php b/classes/modules/user/User.class.php index 7158cf75..a8a81e71 100644 --- a/classes/modules/user/User.class.php +++ b/classes/modules/user/User.class.php @@ -431,6 +431,8 @@ class User extends Module { * @return unknown */ public function UpdateInvite(UserEntity_Invite $oInvite) { + //чистим зависимые кеши + $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("invate_new_to_{$oInvite->getUserToId()}","invate_new_from_{$oInvite->getUserFromId()}")); return $this->oMapper->UpdateInvite($oInvite); } /** @@ -446,5 +448,65 @@ class User extends Module { $oInvite->setUserFromId($oUser->getId()); return $this->AddInvite($oInvite); } + /** + * Получает число использованых приглашений юзером за определенную дату + * + * @param unknown_type $sUserIdFrom + * @param unknown_type $sDate + * @return unknown + */ + public function GetCountInviteUsedByDate($sUserIdFrom,$sDate) { + return $this->oMapper->GetCountInviteUsedByDate($sUserIdFrom,$sDate); + } + /** + * Получает полное число использованных приглашений юзера + * + * @param unknown_type $sUserIdFrom + * @return unknown + */ + public function GetCountInviteUsed($sUserIdFrom) { + return $this->oMapper->GetCountInviteUsed($sUserIdFrom); + } + /** + * Получаем число доступных приглашений для юзера + * + * @param unknown_type $oUserFrom + * @return unknown + */ + public function GetCountInviteAvailable(UserEntity_User $oUserFrom) { + $sDay=7; + $iCountUsed=$this->GetCountInviteUsedByDate($oUserFrom->getId(),date("Y-m-d 00:00:00",mktime(0,0,0,date("m"),date("d")-$sDay,date("Y")))); + $iCountAllAvailable=round($oUserFrom->getRating()+$oUserFrom->getSkill()); + $iCountAllAvailable = $iCountAllAvailable<0 ? 0 : $iCountAllAvailable; + $iCountAvailable=$iCountAllAvailable-$iCountUsed; + $iCountAvailable = $iCountAvailable<0 ? 0 : $iCountAvailable; + return $iCountAvailable; + } + /** + * Получает список приглашенных юзеров + * + * @param unknown_type $sUserId + * @return unknown + */ + public function GetUsersInvite($sUserId) { + if (false === ($data = $this->Cache_Get("users_invite_{$sUserId}"))) { + $data = $this->oMapper->GetUsersInvite($sUserId); + $this->Cache_Set($data, "users_invite_{$sUserId}", array("user_update","invate_new_from_{$sUserId}"), 60*5); + } + return $data; + } + /** + * Получает юзера который пригласил + * + * @param unknown_type $sUserIdTo + * @return unknown + */ + public function GetUserInviteFrom($sUserIdTo) { + if (false === ($data = $this->Cache_Get("user_invite_from_{$sUserIdTo}"))) { + $data = $this->oMapper->GetUserInviteFrom($sUserIdTo); + $this->Cache_Set($data, "user_invite_from_{$sUserIdTo}", array("user_update","invate_new_to_{$sUserIdTo}"), 60*5); + } + return $data; + } } ?> \ No newline at end of file diff --git a/classes/modules/user/mapper/User.mapper.class.php b/classes/modules/user/mapper/User.mapper.class.php index bf329e78..00dd6959 100644 --- a/classes/modules/user/mapper/User.mapper.class.php +++ b/classes/modules/user/mapper/User.mapper.class.php @@ -441,5 +441,64 @@ class Mapper_User extends Mapper { } return false; } + + public function GetCountInviteUsedByDate($sUserIdFrom,$sDate) { + $sql = "SELECT count(invite_id) as count FROM ".DB_TABLE_INVITE." WHERE user_from_id = ?d and invite_date_add >= ? "; + if ($aRow=$this->oDb->selectRow($sql,$sUserIdFrom,$sDate)) { + return $aRow['count']; + } + return 0; + } + + public function GetCountInviteUsed($sUserIdFrom) { + $sql = "SELECT count(invite_id) as count FROM ".DB_TABLE_INVITE." WHERE user_from_id = ?d"; + if ($aRow=$this->oDb->selectRow($sql,$sUserIdFrom)) { + return $aRow['count']; + } + return 0; + } + + public function GetUsersInvite($sUserId) { + $sql = "SELECT + u.* + FROM + ".DB_TABLE_INVITE." as i, + ".DB_TABLE_USER." as u + WHERE + i.user_from_id = ?d + AND + i.user_to_id = u.user_id + AND + u.user_activate = 1 + ORDER BY u.user_login; + "; + $aUsers=array(); + if ($aRows=$this->oDb->select($sql,$sUserId)) { + foreach ($aRows as $aUser) { + $aUsers[]=new UserEntity_User($aUser); + } + } + return $aUsers; + } + + public function GetUserInviteFrom($sUserIdTo) { + $sql = "SELECT + u.* + FROM + ".DB_TABLE_INVITE." as i, + ".DB_TABLE_USER." as u + WHERE + i.user_to_id = ?d + AND + i.user_from_id = u.user_id + AND + u.user_activate = 1 + LIMIT 0,1; + "; + if ($aRow=$this->oDb->selectRow($sql,$sUserIdTo)) { + return new UserEntity_User($aRow); + } + return null; + } } ?> \ No newline at end of file diff --git a/patch.sql b/patch.sql index b65dfcb2..6ae6ba6b 100644 --- a/patch.sql +++ b/patch.sql @@ -129,7 +129,7 @@ ALTER TABLE `prefix_invite` ADD CONSTRAINT `prefix_invite_fk` FOREIGN KEY (`user_from_id`) REFERENCES `prefix_user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `prefix_invite_fk1` FOREIGN KEY (`user_to_id`) REFERENCES `prefix_user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE; - +ALTER TABLE `prefix_invite` ADD INDEX ( `invite_date_add` ) -- Дополнительные поля настройки у юзера diff --git a/templates/skin/habra/actions/ActionProfile/whois.tpl b/templates/skin/habra/actions/ActionProfile/whois.tpl index 71bf89c4..9ad448d8 100644 --- a/templates/skin/habra/actions/ActionProfile/whois.tpl +++ b/templates/skin/habra/actions/ActionProfile/whois.tpl @@ -120,6 +120,33 @@ {/if} + {if $USER_USE_INVITE and $oUserInviteFrom} +
+
+
+ Пригласил: +
+ +
+
+ {/if} + + {if $USER_USE_INVITE and $aUsersInvite} +
+
+
+ Приглашенные: +
+
+ {foreach from=$aUsersInvite item=oUserInvite} + посмотреть профиль{$oUserInvite->getLogin()} + {/foreach} +
+
+
+ {/if} {if $aBlogsOwner}
diff --git a/templates/skin/habra/actions/ActionSettings/invite.tpl b/templates/skin/habra/actions/ActionSettings/invite.tpl index 78c66ca0..5bedc4f1 100644 --- a/templates/skin/habra/actions/ActionSettings/invite.tpl +++ b/templates/skin/habra/actions/ActionSettings/invite.tpl @@ -13,7 +13,11 @@

Управление приглашениями - +
+
Доступно: {if $oUserCurrent->isAdministrator()}много{else}{$iCountInviteAvailable}{/if} +
Использовано: {$iCountInviteUsed} +
+