1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-08 09:24:25 +03:00

Merge branch 'master' of git://github.com/livestreet/livestreet

This commit is contained in:
kpoxas 2012-08-13 15:11:05 +03:00
commit 17f1793ba1
382 changed files with 10465 additions and 12557 deletions

View file

@ -1,9 +1,12 @@
AddDefaultCharset UTF-8
Options -Indexes
RewriteEngine On
#RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php
# Alternative rule
#RewriteRule ^(.*)$ /index.php
<Files "plugins.dat">
order allow,deny

View file

@ -15,7 +15,7 @@
*/
LiveStreet 1.0-dev
LiveStreet 1.0.1
INSTALLATION
1. Copy files to the engine to the desired directory site
@ -24,31 +24,32 @@ INSTALLATION
Upgrading from 0.5.1
0. Be sure to make backup of your site and database
1. Update to version 1.0 can only database, so copy the new version over the old NOT to install, use a clean directory
1. Update to version 1.0.1 can only database, so copy the new version over the old NOT to install, use a clean directory
2. Copy files to the engine to the desired directory site
3. Copy the file to a new directory on your config.local.php old version 0.5.1 and copy the directory /uploads/ all files
4. Enter the address http://you_site/install/
5. Follow the instructions of the installer. When you create the database required By clicking the "Convert base 0.5.1 in 1.0"
5. Follow the instructions of the installer. When you create the database required By clicking the "Convert base 0.5.1 in 1.0.1"
Upgrading from 1.0
0. Be sure to make backup of your site and database
1. Delete old files (except /config/config.local.php and directory /uploads/ all files) and copy the new files to a directory site
2.1 Enter the address http://you_site/install/ and to step in creating a database to mark checkbox "Convert 1.0 DB to 1.0.1 "
2.2 Or execute the SQL patch /install/convert_1.0_to_1.0.1.sql in phpMyAdmin or via the console MySQL, replacing prefix tables (prefix_) in the database on your
Configuration and Tuning Engines
Settings are in a file /config/config.php. For them to change is desirable to override these settings in the file config.local.php, this will avoid problems with future upgrades.
Management plug-ins can be found at /admin/plugins/
STANDARD TEMPLATES
Version 1.0 support only jQuery templates!
Version 1.* support only jQuery templates!
OPPORTUNITIES SEARCH
LiveStreet supports full-text search on the site using the search engine Sphinx.
Accordingly, if you need search on the site, you must install and configure the server Sphinx, a sample configuration file (sphinx.conf) is located in the directory /install/
DISABLE SPONSORED LINK
Since LiveStreet engine is free, we insert in each release of some internal pages link to sponsor's current release.
This helps us to get financial investments to the project and accelerate its development.
If you are totally against sponsored links, you can remove it by removing the file /classes/hooks/HookSponsor.class.php
We urge you not to delete link the sponsor.
For all questions, please visit Eanglish community http://livestreetcms.net
Official site of the project http://livestreetcms.com
Russian community http://livestreet.ru

View file

@ -15,7 +15,7 @@
*/
LiveStreet 1.0-dev
LiveStreet 1.0.1
УСТАНОВКА
1. Скопировать файлы движка в нужный каталог сайта
@ -24,32 +24,30 @@ LiveStreet 1.0-dev
ОБНОВЛЕНИЕ С ВЕРСИИ 0.5.1
0. ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ РЕЗЕРВНЫЕ КОПИИ ВАШЕГО САЙТА И БАЗЫ ДАННЫХ
1. Обновить до версии 1.0 возможно только базу данных, поэтому копировать новую версию поверх старой НЕЛЬЗЯ, для установки используйте чистый каталог
1. Обновить до версии 1.0.1 возможно только базу данных, поэтому копировать новую версию поверх старой НЕЛЬЗЯ, для установки используйте чистый каталог
2. Скопировать файлы движка в новый нужный каталог сайта
3. Скопировать в новый каталог файл config.local.php от вашей старой версии 0.5.1 и скопировать каталог /uploads/ со всеми файлами.
4. Зайти по адресу http://ваш_сайт_на_ls/install/
5. Следовать инструкциям установщика. При создании базы данных обязательно поставить галку "Конвертировать базу 0.5.1 в 1.0"
5. Следовать инструкциям установщика. При создании базы данных обязательно поставить галку "Конвертировать базу 0.5.1 в 1.0.1"
ОБНОВЛЕНИЕ С ВЕРСИИ 1.0
0. ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ РЕЗЕРВНЫЕ КОПИИ ВАШЕГО САЙТА И БАЗЫ ДАННЫХ
1. Удалите старые файлы кроме /config/config.local.php и каталога /uploads/ со всеми файлами, скопируйте новые файлы движка в нужный каталог сайта
2.1 Зайти по адресу http://ваш_сайт_на_ls/install/ и на шаге создания базы данных поставить галку "Конвертировать базу 1.0 в 1.0.1"
2.2 Либо руками выполнить SQL патч /install/convert_1.0_to_1.0.1.sql в phpMyAdmin или через консоль MySQL, предварительно сменив префикс таблиц в БД на ваш
КОНФИГУРАЦИЯ И НАСТРОЙКА ДВИЖКА
Настройки находятся в файле /config/config.php. Для их изменения желательно переопределять эти настройки в файле config.local.php, это позволит избежать проблем при последующих обновлениях.
Управление плагинами находится по адресу /admin/plugins/
СТАНДАРТНЫЕ ШАБЛОНЫ
Версии 1.0 поддерживает только jQuery шаблоны!
Версии 1.* поддерживает только jQuery шаблоны!
ВОЗМОЖНОСТИ ПОИСКА ПО САЙТУ
LiveStreet поддерживает полнотекстовый поиск по сайту с использованием поискового движка Sphinx.
Соответственно если нужен поиск на сайте, то необходимо установить и настроить на сервере Sphinx, пример конфигурационного файла(sphinx.conf) находится в каталоге /install/
ОТКЛЮЧЕНИЕ СПОНСОРСКОЙ ССЫЛКИ
Т.к. LiveStreet является бесплатным движком, мы в каждом релизе вставляем на некоторые внутренние страницы ссылку на спонсора текущего релиза.
Ссылка вставляется вместо нашего копирайта на сайт livestreetcms.com
Это помогает нам получить финансовые вливания в проект и ускорить его развитие.
Если вы категорически против спонсорской ссылки, то можете убрать её, удалив файл /classes/hooks/HookSponsor.class.php
Мы настоятельно просим вас не удалять ссылку спонсора.
По всем вопросам обращайтесь на сайт русского комьюнити http://livestreet.ru
Официальный сайт проекта http://livestreetcms.com

View file

@ -93,6 +93,10 @@ class ActionAjax extends Action {
/**
* Если блог существует и он не персональный
*/
if (!is_string(getRequest('iBlogId'))) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
return;
}
if (!($oBlog=$this->Blog_GetBlogById(getRequest('iBlogId'))) or $oBlog->getType()=='personal') {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
return;
@ -596,7 +600,7 @@ class ActionAjax extends Action {
/**
* Обрабатываем теги
*/
$aTags=explode(',',trim(getRequest('tags'),"\r\n\t\0\x0B ."));
$aTags=explode(',',trim((string)getRequest('tags'),"\r\n\t\0\x0B ."));
$aTagsNew=array();
$aTagsNewLow=array();
$aTagsReturn=array();
@ -1019,7 +1023,7 @@ class ActionAjax extends Action {
*
*/
protected function EventPreviewText() {
$sText=getRequest('text',null,'post');
$sText=(string)getRequest('text',null,'post');
$bSave=getRequest('save',null,'post');
/**
* Экранировать или нет HTML теги
@ -1104,7 +1108,7 @@ class ActionAjax extends Action {
/**
* Первые буквы тега переданы?
*/
if (!($sValue=getRequest('value',null,'post'))) {
if (!($sValue=getRequest('value',null,'post')) or !is_string($sValue)) {
return ;
}
$aItems=array();
@ -1128,7 +1132,7 @@ class ActionAjax extends Action {
/**
* Первые буквы логина переданы?
*/
if (!($sValue=getRequest('value',null,'post'))) {
if (!($sValue=getRequest('value',null,'post')) or !is_string($sValue)) {
return ;
}
$aItems=array();

View file

@ -116,36 +116,39 @@ class ActionBlog extends Action {
*
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^good$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^good$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventTopics','topics'));
$this->AddEvent('good',array('EventTopics','topics'));
$this->AddEventPreg('/^bad$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^new$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^discussed$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^top$/i','/^(page(\d+))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^bad$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^new$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^newall$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^discussed$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventTopics','topics'));
$this->AddEventPreg('/^top$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventTopics','topics'));
$this->AddEvent('add','EventAddBlog');
$this->AddEvent('edit','EventEditBlog');
$this->AddEvent('delete','EventDeleteBlog');
$this->AddEventPreg('/^admin$/i','/^\d+$/i','/^(page(\d+))?$/i','EventAdminBlog');
$this->AddEventPreg('/^admin$/i','/^\d+$/i','/^(page([1-9]\d{0,5}))?$/i','EventAdminBlog');
$this->AddEvent('invite','EventInviteBlog');
$this->AddEvent('ajaxaddcomment','AjaxAddComment');
$this->AddEvent('ajaxresponsecomment','AjaxResponseComment');
$this->AddEvent('ajaxaddbloginvite', 'AjaxAddBlogInvite');
$this->AddEvent('ajaxrebloginvite', 'AjaxReBlogInvite');
$this->AddEvent('ajaxremovebloginvite', 'AjaxRemoveBlogInvite');
$this->AddEvent('ajaxbloginfo', 'AjaxBlogInfo');
$this->AddEvent('ajaxblogjoin', 'AjaxBlogJoin');
$this->AddEventPreg('/^(\d+)\.html$/i','/^$/i',array('EventShowTopic','topic'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(\d+)\.html$/i',array('EventShowTopic','topic'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^bad$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^new$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^discussed$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^top$/i','/^(page(\d+))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^bad$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^new$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^newall$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^discussed$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^top$/i','/^(page([1-9]\d{0,5}))?$/i',array('EventShowBlog','blog'));
$this->AddEventPreg('/^[\w\-\_]+$/i','/^users$/i','/^(page(\d+))?$/i','EventShowUsers');
$this->AddEventPreg('/^[\w\-\_]+$/i','/^users$/i','/^(page([1-9]\d{0,5}))?$/i','EventShowUsers');
}
@ -204,7 +207,7 @@ class ActionBlog extends Action {
$oBlog->setType(getRequest('blog_type'));
$oBlog->setDateAdd(date("Y-m-d H:i:s"));
$oBlog->setLimitRatingTopic(getRequest('blog_limit_rating_topic'));
$oBlog->setUrl(getRequest('blog_url'));
$oBlog->setUrl((string)getRequest('blog_url'));
$oBlog->setAvatar(null);
/**
* Загрузка аватара, делаем ресайзы
@ -312,7 +315,7 @@ class ActionBlog extends Action {
$oBlog->setType(getRequest('blog_type'));
$oBlog->setLimitRatingTopic(getRequest('blog_limit_rating_topic'));
if ($this->oUserCurrent->isAdministrator()) {
$oBlog->setUrl(getRequest('blog_url')); // разрешаем смену URL блога только админу
$oBlog->setUrl((string)getRequest('blog_url')); // разрешаем смену URL блога только админу
}
/**
* Загрузка аватара, делаем ресайзы
@ -498,21 +501,23 @@ class ActionBlog extends Action {
if (!func_check(getRequest('blog_title'),'text',2,200)) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error'),$this->Lang_Get('error'));
$bOk=false;
}
/**
* Проверяем есть ли уже блог с таким названием
*/
if ($oBlogExists=$this->Blog_GetBlogByTitle(getRequest('blog_title'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error_unique'),$this->Lang_Get('error'));
$bOk=false;
} else {
/**
* Проверяем есть ли уже блог с таким названием
*/
if ($oBlogExists=$this->Blog_GetBlogByTitle(getRequest('blog_title'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error_unique'),$this->Lang_Get('error'));
$bOk=false;
}
}
}
/**
* Проверяем есть ли URL блога, с заменой всех пробельных символов на "_"
*/
if (!$oBlog or $this->oUserCurrent->isAdministrator()) {
$blogUrl=preg_replace("/\s+/",'_',getRequest('blog_url'));
$blogUrl=preg_replace("/\s+/",'_',(string)getRequest('blog_url'));
$_REQUEST['blog_url']=$blogUrl;
if (!func_check(getRequest('blog_url'),'login',2,50)) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error'),$this->Lang_Get('error'));
@ -529,7 +534,7 @@ class ActionBlog extends Action {
/**
* Проверяем есть ли уже блог с таким URL
*/
if ($oBlogExists=$this->Blog_GetBlogByUrl(getRequest('blog_url'))) {
if ($oBlogExists=$this->Blog_GetBlogByUrl((string)getRequest('blog_url'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error_unique'),$this->Lang_Get('error'));
$bOk=false;
@ -578,7 +583,7 @@ class ActionBlog extends Action {
/**
* Меню
*/
$this->sMenuSubItemSelect=$sShowType;
$this->sMenuSubItemSelect=$sShowType=='newall' ? 'new' : $sShowType;
/**
* Передан ли номер страницы
*/
@ -811,7 +816,7 @@ class ActionBlog extends Action {
$sPeriod=getRequest('period');
}
$sBlogUrl=$this->sCurrentEvent;
$sShowType=in_array($this->GetParamEventMatch(0,0),array('bad','new','discussed','top')) ? $this->GetParamEventMatch(0,0) : 'good';
$sShowType=in_array($this->GetParamEventMatch(0,0),array('bad','new','newall','discussed','top')) ? $this->GetParamEventMatch(0,0) : 'good';
if (!in_array($sShowType,array('discussed','top'))) {
$sPeriod='all';
}
@ -839,7 +844,7 @@ class ActionBlog extends Action {
/**
* Меню
*/
$this->sMenuSubItemSelect=$sShowType;
$this->sMenuSubItemSelect=$sShowType=='newall' ? 'new' : $sShowType;
$this->sMenuSubBlogUrl=$oBlog->getUrlFull();
/**
* Передан ли номер страницы
@ -1197,7 +1202,7 @@ class ActionBlog extends Action {
/**
* Проверяем существование блога
*/
if(!$oBlog=$this->Blog_GetBlogById($sBlogId)) {
if(!$oBlog=$this->Blog_GetBlogById($sBlogId) or !is_string($sUsers)) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
@ -1373,6 +1378,59 @@ class ActionBlog extends Action {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
}
/**
* Обработка ajax запроса на удаление вступить в закрытый блог
*/
protected function AjaxRemoveBlogInvite() {
/**
* Устанавливаем формат Ajax ответа
*/
$this->Viewer_SetResponseAjax('json');
$sUserId=getRequest('idUser',null,'post');
$sBlogId=getRequest('idBlog',null,'post');
/**
* Если пользователь не авторизирован, возвращаем ошибку
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'),$this->Lang_Get('error'));
return;
}
$this->oUserCurrent=$this->User_GetUserCurrent();
/**
* Проверяем существование блога
*/
if(!$oBlog=$this->Blog_GetBlogById($sBlogId)) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
/**
* Пользователь существует и активен?
*/
if (!$oUser=$this->User_GetUserById($sUserId) or $oUser->getActivate()!=1) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
/**
* Проверяем, имеет ли право текущий пользователь добавлять invite в blog
*/
$oBlogUser=$this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(),$this->oUserCurrent->getId());
$bIsAdministratorBlog=$oBlogUser ? $oBlogUser->getIsAdministrator() : false;
if ($oBlog->getOwnerId()!=$this->oUserCurrent->getId() and !$this->oUserCurrent->isAdministrator() and !$bIsAdministratorBlog) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
$oBlogUser=$this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(),$oUser->getId());
if ($oBlogUser->getUserRole()==ModuleBlog::BLOG_USER_ROLE_INVITE) {
/**
* Удаляем связь/приглашение
*/
$this->Blog_DeleteRelationBlogUser($oBlogUser);
$this->Message_AddNoticeSingle($this->Lang_Get('blog_user_invite_remove_ok',array('login'=>$oUser->getLogin())),$this->Lang_Get('attention'));
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
}
/**
* Выполняет отправку приглашения в блог
* (по внутренней почте и на email)
@ -1430,7 +1488,7 @@ class ActionBlog extends Action {
/**
* Получаем код подтверждения из ревеста и дешефруем его
*/
$sCode=xxtea_decrypt(base64_decode(rawurldecode(getRequest('code'))), Config::Get('module.blog.encrypt'));
$sCode=xxtea_decrypt(base64_decode(rawurldecode((string)getRequest('code'))), Config::Get('module.blog.encrypt'));
if (!$sCode) {
return $this->EventNotFound();
}

View file

@ -37,7 +37,7 @@ class ActionBlogs extends Action {
* Регистрируем евенты
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^(page(\d+))?$/i','EventShowBlogs');
$this->AddEventPreg('/^(page([1-9]\d{0,5}))?$/i','EventShowBlogs');
$this->AddEventPreg('/^ajax-search$/i','EventAjaxSearch');
}
@ -87,14 +87,14 @@ class ActionBlogs extends Action {
*/
$sOrder='blog_rating';
if (getRequest('order')) {
$sOrder=getRequest('order');
$sOrder=(string)getRequest('order');
}
/**
* В каком направлении сортировать
*/
$sOrderWay='desc';
if (getRequest('order_way')) {
$sOrderWay=getRequest('order_way');
$sOrderWay=(string)getRequest('order_way');
}
/**
* Фильтр поиска блогов

View file

@ -45,7 +45,7 @@ class ActionComments extends Action {
* Регистрация евентов
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^(page(\d+))?$/i','EventComments');
$this->AddEventPreg('/^(page([1-9]\d{0,5}))?$/i','EventComments');
$this->AddEventPreg('/^\d+$/i','EventShowComment');
}

View file

@ -76,10 +76,11 @@ class ActionIndex extends Action {
*
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^(page(\d+))?$/i','EventIndex');
$this->AddEventPreg('/^new$/i','/^(page(\d+))?$/i','EventNew');
$this->AddEventPreg('/^discussed/i','/^(page(\d+))?$/i','EventDiscussed');
$this->AddEventPreg('/^top/i','/^(page(\d+))?$/i','EventTop');
$this->AddEventPreg('/^(page([1-9]\d{0,5}))?$/i','EventIndex');
$this->AddEventPreg('/^new$/i','/^(page([1-9]\d{0,5}))?$/i','EventNew');
$this->AddEventPreg('/^newall$/i','/^(page([1-9]\d{0,5}))?$/i','EventNewAll');
$this->AddEventPreg('/^discussed/i','/^(page([1-9]\d{0,5}))?$/i','EventDiscussed');
$this->AddEventPreg('/^top/i','/^(page([1-9]\d{0,5}))?$/i','EventTop');
}
@ -226,6 +227,42 @@ class ActionIndex extends Action {
*/
$this->SetTemplateAction('index');
}
/**
* Вывод ВСЕХ новых топиков
*/
protected function EventNewAll() {
$this->Viewer_SetHtmlRssAlternate(Router::GetPath('rss').'new/',Config::Get('view.name'));
/**
* Меню
*/
$this->sMenuSubItemSelect='new';
/**
* Передан ли номер страницы
*/
$iPage=$this->GetParamEventMatch(0,2) ? $this->GetParamEventMatch(0,2) : 1;
/**
* Получаем список топиков
*/
$aResult=$this->Topic_GetTopicsNewAll($iPage,Config::Get('module.topic.per_page'));
$aTopics=$aResult['collection'];
/**
* Вызов хуков
*/
$this->Hook_Run('topics_list_show',array('aTopics'=>$aTopics));
/**
* Формируем постраничность
*/
$aPaging=$this->Viewer_MakePaging($aResult['count'],$iPage,Config::Get('module.topic.per_page'),Config::Get('pagination.pages.count'),Router::GetPath('index').'newall');
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aTopics',$aTopics);
$this->Viewer_Assign('aPaging',$aPaging);
/**
* Устанавливаем шаблон вывода
*/
$this->SetTemplateAction('index');
}
/**
* Вывод интересных на главную
*

View file

@ -44,9 +44,11 @@ class ActionLogin extends Action {
$this->AddEvent('index','EventLogin');
$this->AddEvent('exit','EventExit');
$this->AddEvent('reminder','EventReminder');
$this->AddEvent('reactivation','EventReactivation');
$this->AddEvent('ajax-login','EventAjaxLogin');
$this->AddEvent('ajax-reminder','EventAjaxReminder');
$this->AddEvent('ajax-reactivation','EventAjaxReactivation');
}
/**
* Ajax авторизация
@ -70,7 +72,12 @@ class ActionLogin extends Action {
/**
* Сверяем хеши паролей и проверяем активен ли юзер
*/
if ($oUser->getPassword()==func_encrypt(getRequest('password')) and $oUser->getActivate()) {
if ($oUser->getPassword()==func_encrypt(getRequest('password'))) {
if (!$oUser->getActivate()) {
$this->Message_AddErrorSingle($this->Lang_Get('user_not_activated', array('reactivation_path' => Router::GetPath('login') . 'reactivation')));
return;
}
$bRemember=getRequest('remember',false) ? true : false;
/**
* Авторизуем
@ -89,6 +96,38 @@ class ActionLogin extends Action {
}
$this->Message_AddErrorSingle($this->Lang_Get('user_login_bad'));
}
/**
* Повторный запрос активации
*/
protected function EventReactivation() {
if($this->User_GetUserCurrent()) {
Router::Location(Config::Get('path.root.web').'/');
}
$this->Viewer_AddHtmlTitle($this->Lang_Get('reactivation'));
}
/**
* Ajax повторной активации
*/
protected function EventAjaxReactivation() {
$this->Viewer_SetResponseAjax('json');
if ((func_check(getRequest('mail'), 'mail') and $oUser = $this->User_GetUserByMail(getRequest('mail')))) {
if ($oUser->getActivate()) {
$this->Message_AddErrorSingle($this->Lang_Get('registration_activate_error_reactivate'));
return;
} else {
$oUser->setActivateKey(md5(func_generator() . time()));
if ($this->User_Update($oUser)) {
$this->Message_AddNotice($this->Lang_Get('reactivation_send_link'));
$this->Notify_SendReactivationCode($oUser);
return;
}
}
}
$this->Message_AddErrorSingle($this->Lang_Get('password_reminder_bad_email'));
}
/**
* Обрабатываем процесс залогинивания
* По факту только отображение шаблона, дальше вступает в дело Ajax

View file

@ -39,9 +39,9 @@ class ActionMy extends Action {
* Регистрируем евенты
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^.+$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^.+$/i','/^blog$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^.+$/i','/^comment$/i','/^(page(\d+))?$/i','EventComments');
$this->AddEventPreg('/^.+$/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEventPreg('/^.+$/i','/^blog$/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEventPreg('/^.+$/i','/^comment$/i','/^(page([1-9]\d{0,5}))?$/i','EventComments');
}

View file

@ -52,11 +52,11 @@ class ActionPeople extends Action {
protected function RegisterEvent() {
$this->AddEvent('online','EventOnline');
$this->AddEvent('new','EventNew');
$this->AddEventPreg('/^(index)?$/i','/^(page(\d+))?$/i','/^$/i','EventIndex');
$this->AddEventPreg('/^(index)?$/i','/^(page([1-9]\d{0,5}))?$/i','/^$/i','EventIndex');
$this->AddEventPreg('/^ajax-search$/i','EventAjaxSearch');
$this->AddEventPreg('/^country$/i','/^\d+$/i','/^(page(\d+))?$/i','EventCountry');
$this->AddEventPreg('/^city$/i','/^\d+$/i','/^(page(\d+))?$/i','EventCity');
$this->AddEventPreg('/^country$/i','/^\d+$/i','/^(page([1-9]\d{0,5}))?$/i','EventCountry');
$this->AddEventPreg('/^city$/i','/^\d+$/i','/^(page([1-9]\d{0,5}))?$/i','EventCity');
}
@ -111,6 +111,7 @@ class ActionPeople extends Action {
*
*/
protected function EventCountry() {
$this->sMenuItemSelect='country';
/**
* Страна существует?
*/
@ -152,6 +153,7 @@ class ActionPeople extends Action {
*
*/
protected function EventCity() {
$this->sMenuItemSelect='city';
/**
* Город существует?
*/
@ -234,14 +236,14 @@ class ActionPeople extends Action {
*/
$sOrder='user_rating';
if (getRequest('order')) {
$sOrder=getRequest('order');
$sOrder=(string)getRequest('order');
}
/**
* В каком направлении сортировать
*/
$sOrderWay='desc';
if (getRequest('order_way')) {
$sOrderWay=getRequest('order_way');
$sOrderWay=(string)getRequest('order_way');
}
$aFilter=array(
'activate' => 1

View file

@ -53,12 +53,13 @@ class ActionPersonalBlog extends Action {
*
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^good$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^good$/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEvent('good','EventTopics');
$this->AddEventPreg('/^bad$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^new$/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^discussed/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^top/i','/^(page(\d+))?$/i','EventTopics');
$this->AddEventPreg('/^bad$/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEventPreg('/^new$/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEventPreg('/^newall$/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEventPreg('/^discussed/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
$this->AddEventPreg('/^top/i','/^(page([1-9]\d{0,5}))?$/i','EventTopics');
}
@ -83,7 +84,7 @@ class ActionPersonalBlog extends Action {
/**
* Меню
*/
$this->sMenuSubItemSelect=$sShowType;
$this->sMenuSubItemSelect=$sShowType=='newall' ? 'new' : $sShowType;
/**
* Передан ли номер страницы
*/

View file

@ -72,18 +72,21 @@ class ActionProfile extends Action {
$this->AddEventPreg('/^.+$/i','/^wall$/i','/^load-reply$/i','EventWallLoadReply');
$this->AddEventPreg('/^.+$/i','/^wall$/i','/^remove$/i','EventWallRemove');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^comments$/i','/^(page(\d+))?$/i','EventFavouriteComments');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^(page(\d+))?$/i','EventFavourite');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^topics/i','/^(page(\d+))?$/i','EventFavourite');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^topics/i','/^tag/i','/^.+/i','/^(page(\d+))?$/i','EventFavouriteTopicsTag');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^comments$/i','/^(page([1-9]\d{0,5}))?$/i','EventFavouriteComments');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^(page([1-9]\d{0,5}))?$/i','EventFavourite');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^topics/i','/^(page([1-9]\d{0,5}))?$/i','EventFavourite');
$this->AddEventPreg('/^.+$/i','/^favourites$/i','/^topics/i','/^tag/i','/^.+/i','/^(page([1-9]\d{0,5}))?$/i','EventFavouriteTopicsTag');
$this->AddEventPreg('/^.+$/i','/^created/i','/^notes/i','/^(page(\d+))?$/i','EventCreatedNotes');
$this->AddEventPreg('/^.+$/i','/^created/i','/^(page(\d+))?$/i','EventCreatedTopics');
$this->AddEventPreg('/^.+$/i','/^created/i','/^topics/i','/^(page(\d+))?$/i','EventCreatedTopics');
$this->AddEventPreg('/^.+$/i','/^created/i','/^comments$/i','/^(page(\d+))?$/i','EventCreatedComments');
$this->AddEventPreg('/^.+$/i','/^created/i','/^notes/i','/^(page([1-9]\d{0,5}))?$/i','EventCreatedNotes');
$this->AddEventPreg('/^.+$/i','/^created/i','/^(page([1-9]\d{0,5}))?$/i','EventCreatedTopics');
$this->AddEventPreg('/^.+$/i','/^created/i','/^topics/i','/^(page([1-9]\d{0,5}))?$/i','EventCreatedTopics');
$this->AddEventPreg('/^.+$/i','/^created/i','/^comments$/i','/^(page([1-9]\d{0,5}))?$/i','EventCreatedComments');
$this->AddEventPreg('/^.+$/i','/^friends/i','/^(page(\d+))?$/i','EventFriends');
$this->AddEventPreg('/^.+$/i','/^friends/i','/^(page([1-9]\d{0,5}))?$/i','EventFriends');
$this->AddEventPreg('/^.+$/i','/^stream/i','/^$/i','EventStream');
$this->AddEventPreg('/^changemail$/i','/^confirm-from/i','/^\w{32}$/i','EventChangemailConfirmFrom');
$this->AddEventPreg('/^changemail$/i','/^confirm-to/i','/^\w{32}$/i','EventChangemailConfirmTo');
}
/**********************************************************************************
@ -610,13 +613,13 @@ class ActionProfile extends Action {
$oNote=Engine::GetEntity('ModuleUser_EntityNote');
$oNote->setTargetUserId(getRequest('iUserId'));
$oNote->setUserId($this->oUserCurrent->getId());
$oNote->setText(getRequest('text'));
$oNote->setText((string)getRequest('text'));
if ($oNote->_Validate()) {
/**
* Экранируем текст и добавляем запись в БД
*/
$oNote->setText(htmlspecialchars($oNote->getText()));
$oNote->setText(htmlspecialchars(strip_tags($oNote->getText())));
if ($this->User_SaveNote($oNote)) {
$this->Viewer_AssignAjax('sText',$oNote->getText());
} else {
@ -693,7 +696,7 @@ class ActionProfile extends Action {
/**
* Из реквеста дешефруем ID польователя
*/
$sUserId=xxtea_decrypt(base64_decode(rawurldecode(getRequest('code'))), Config::Get('module.talk.encrypt'));
$sUserId=xxtea_decrypt(base64_decode(rawurldecode((string)getRequest('code'))), Config::Get('module.talk.encrypt'));
if (!$sUserId) {
return $this->EventNotFound();
}
@ -1197,6 +1200,59 @@ class ActionProfile extends Action {
return;
}
}
/**
* Обработка подтверждения старого емайла при его смене
*/
public function EventChangemailConfirmFrom() {
if (!($oChangemail=$this->User_GetUserChangemailByCodeFrom($this->GetParamEventMatch(1,0)))) {
return parent::EventNotFound();
}
if ($oChangemail->getConfirmFrom() or strtotime($oChangemail->getDateExpired())<time()) {
return parent::EventNotFound();
}
$oChangemail->setConfirmFrom(1);
$this->User_UpdateUserChangemail($oChangemail);
/**
* Отправляем уведомление
*/
$oUser=$this->User_GetUserById($oChangemail->getUserId());
$this->Notify_Send($oChangemail->getMailTo(),
'notify.user_changemail_to.tpl',
$this->Lang_Get('notify_subject_user_changemail'),
array(
'oUser' => $oUser,
'oChangemail' => $oChangemail,
));
$this->Viewer_Assign('sText',$this->Lang_Get('settings_profile_mail_change_to_notice'));
$this->SetTemplateAction('changemail_confirm');
}
/**
* Обработка подтверждения нового емайла при смене старого
*/
public function EventChangemailConfirmTo() {
if (!($oChangemail=$this->User_GetUserChangemailByCodeTo($this->GetParamEventMatch(1,0)))) {
return parent::EventNotFound();
}
if (!$oChangemail->getConfirmFrom() or $oChangemail->getConfirmTo() or strtotime($oChangemail->getDateExpired())<time()) {
return parent::EventNotFound();
}
$oChangemail->setConfirmTo(1);
$oChangemail->setDateUsed(date("Y-m-d H:i:s"));
$this->User_UpdateUserChangemail($oChangemail);
$oUser=$this->User_GetUserById($oChangemail->getUserId());
$oUser->setMail($oChangemail->getMailTo());
$this->User_Update($oUser);
$this->Viewer_Assign('sText',$this->Lang_Get('settings_profile_mail_change_ok',array('mail'=>htmlspecialchars($oChangemail->getMailTo()))));
$this->SetTemplateAction('changemail_confirm');
}
/**
* Выполняется при завершении работы экшена
*/
@ -1229,7 +1285,7 @@ class ActionProfile extends Action {
* Заметка текущего пользователя о юзере
*/
if ($this->oUserCurrent) {
$this->Viewer_Assign('oUserNote',$this->User_GetUserNote($this->oUserProfile->getId(),$this->oUserCurrent->getId()));
$this->Viewer_Assign('oUserNote',$this->oUserProfile->getUserNote());
}
$this->Viewer_Assign('iCountFriendsUser',$this->User_GetCountUsersFriend($this->oUserProfile->getId()));

View file

@ -133,13 +133,13 @@ class ActionRss extends Action {
*/
protected function RssComments() {
/**
* Вычисляем топики из закрытых блогов, чтобы исключить их из выдачи
* Получаем закрытые блоги, чтобы исключить их из выдачи
*/
$aCloseTopics = $this->Topic_GetTopicsCloseByUser();
$aCloseBlogs = $this->Blog_GetInaccessibleBlogsByUser();
/**
* Получаем комментарии
*/
$aResult=$this->Comment_GetCommentsAll('topic',1,Config::Get('module.comment.per_page')*2,$aCloseTopics);
$aResult=$this->Comment_GetCommentsAll('topic',1,Config::Get('module.comment.per_page')*2,array(),$aCloseBlogs);
$aComments=$aResult['collection'];
/**
* Формируем данные канала RSS
@ -186,8 +186,8 @@ class ActionRss extends Action {
/**
* Получаем комментарии
*/
$aComments=$this->Comment_GetCommentsByTargetId($oTopic->getId(),'topic');
$aComments=$aComments['comments'];
$aResult=$this->Comment_GetCommentsByFilter(array('target_id'=>$oTopic->getId(),'target_type'=>'topic','delete'=>0),array('comment_id'=>'desc'),1,100);
$aComments=$aResult['collection'];
/**
* Формируем данные канала RSS
*/

View file

@ -181,7 +181,7 @@ class ActionSearch extends Action {
/**
* Определяем текущую страницу вывода результата
*/
$aReq['iPage'] = intval(preg_replace('#^page(\d+)$#', '\1', $this->getParam(0)));
$aReq['iPage'] = intval(preg_replace('#^page([1-9]\d{0,5})$#', '\1', $this->getParam(0)));
if(!$aReq['iPage']) { $aReq['iPage'] = 1; }
/**
* Передача данных в шаблонизатор

View file

@ -158,7 +158,10 @@ class ActionSettings extends Action {
*/
$aSize=array();
$aSizeTmp=getRequest('size');
if (isset($aSizeTmp['x']) and $aSizeTmp['x'] and isset($aSizeTmp['y']) and isset($aSizeTmp['x2']) and isset($aSizeTmp['y2'])) {
if (isset($aSizeTmp['x']) and is_numeric($aSizeTmp['x'])
and isset($aSizeTmp['y']) and is_numeric($aSizeTmp['y'])
and isset($aSizeTmp['x2']) and is_numeric($aSizeTmp['x2'])
and isset($aSizeTmp['y2']) and is_numeric($aSizeTmp['y2'])) {
$aSize=array('x1'=>round($fRation*$aSizeTmp['x']),'y1'=>round($fRation*$aSizeTmp['y']),'x2'=>round($fRation*$aSizeTmp['x2']),'y2'=>round($fRation*$aSizeTmp['y2']));
}
/**
@ -280,7 +283,10 @@ class ActionSettings extends Action {
*/
$aSize=array();
$aSizeTmp=getRequest('size');
if (isset($aSizeTmp['x']) and $aSizeTmp['x'] and isset($aSizeTmp['y']) and isset($aSizeTmp['x2']) and isset($aSizeTmp['y2'])) {
if (isset($aSizeTmp['x']) and is_numeric($aSizeTmp['x'])
and isset($aSizeTmp['y']) and is_numeric($aSizeTmp['y'])
and isset($aSizeTmp['x2']) and is_numeric($aSizeTmp['x2'])
and isset($aSizeTmp['y2']) and is_numeric($aSizeTmp['y2'])) {
$aSize=array('x1'=>$aSizeTmp['x'],'y1'=>$aSizeTmp['y'],'x2'=>$aSizeTmp['x2'],'y2'=>$aSizeTmp['y2']);
}
/**
@ -346,12 +352,18 @@ class ActionSettings extends Action {
$this->sMenuSubItemSelect='tuning';
$this->Viewer_AddHtmlTitle($this->Lang_Get('settings_menu_tuning'));
$aTimezoneList=array('-12','-11','-10','-9.5','-9','-8','-7','-6','-5','-4.5','-4','-3.5','-3','-2','-1','0','1','2','3','3.5','4','4.5','5','5.5','5.75','6','6.5','7','8','8.75','9','9.5','10','10.5','11','11.5','12','12.75','13','14');
$this->Viewer_Assign('aTimezoneList',$aTimezoneList);
/**
* Если отправили форму с настройками - сохраняем
*/
if (isPost('submit_settings_tuning')) {
$this->Security_ValidateSendForm();
if (in_array(getRequest('settings_general_timezone'),$aTimezoneList)) {
$this->oUserCurrent->setSettingsTimezone(getRequest('settings_general_timezone'));
}
$this->oUserCurrent->setSettingsNoticeNewTopic( getRequest('settings_notice_new_topic') ? 1 : 0 );
$this->oUserCurrent->setSettingsNoticeNewComment( getRequest('settings_notice_new_comment') ? 1 : 0 );
$this->oUserCurrent->setSettingsNoticeNewTalk( getRequest('settings_notice_new_talk') ? 1 : 0 );
@ -368,6 +380,12 @@ class ActionSettings extends Action {
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
}
} else {
if (is_null($this->oUserCurrent->getSettingsTimezone())) {
$_REQUEST['settings_general_timezone']=(strtotime(date("Y-m-d H:i:s"))-strtotime(gmdate("Y-m-d H:i:s")))/3600 - date('I');
} else {
$_REQUEST['settings_general_timezone']=$this->oUserCurrent->getSettingsTimezone();
}
}
}
/**
@ -447,8 +465,6 @@ class ActionSettings extends Action {
if ($oUserMail=$this->User_GetUserByMail(getRequest('mail')) and $oUserMail->getId()!=$this->oUserCurrent->getId()) {
$this->Message_AddError($this->Lang_Get('settings_profile_mail_error_used'),$this->Lang_Get('error'));
$bError=true;
} else {
$this->oUserCurrent->setMail(getRequest('mail'));
}
} else {
$this->Message_AddError($this->Lang_Get('settings_profile_mail_error'),$this->Lang_Get('error'));
@ -489,6 +505,15 @@ class ActionSettings extends Action {
if (!$bError) {
if ($this->User_Update($this->oUserCurrent)) {
$this->Message_AddNoticeSingle($this->Lang_Get('settings_account_submit_ok'));
/**
* Подтверждение смены емайла
*/
if (getRequest('mail') and getRequest('mail')!=$this->oUserCurrent->getMail()) {
if ($this->User_MakeUserChangemail($this->oUserCurrent,getRequest('mail'))) {
$this->Message_AddNotice($this->Lang_Get('settings_profile_mail_change_from_notice'));
}
}
$this->Hook_Run('settings_account_save_after', array('oUser'=>$this->oUserCurrent));
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
@ -615,7 +640,7 @@ class ActionSettings extends Action {
$aData = array();
foreach ($aFields as $iId => $aField) {
if (isset($_REQUEST['profile_user_field_'.$iId])) {
$aData[$iId] = getRequest('profile_user_field_'.$iId);
$aData[$iId] = (string)getRequest('profile_user_field_'.$iId);
}
}
$this->User_setUserFieldsValues($this->oUserCurrent->getId(), $aData);
@ -632,7 +657,7 @@ class ActionSettings extends Action {
$aFieldsContactValue=getRequest('profile_user_field_value');
if (is_array($aFieldsContactType)) {
foreach($aFieldsContactType as $k=>$v) {
if (isset($aFields[$v]) and isset($aFieldsContactValue[$k])) {
if (isset($aFields[$v]) and isset($aFieldsContactValue[$k]) and is_string($aFieldsContactValue[$k])) {
$this->User_setUserFieldsValues($this->oUserCurrent->getId(), array($v=>$aFieldsContactValue[$k]), Config::Get('module.user.userfield_max_identical'));
}
}

View file

@ -169,6 +169,7 @@ class ActionStream extends Action {
$oViewer=$this->Viewer_GetLocalViewer();
$oViewer->Assign('aStreamEvents', $aEvents);
$oViewer->Assign('sDateLast', getRequest('date_last'));
if (count($aEvents)) {
$oEvenLast=end($aEvents);
$this->Viewer_AssignAjax('iStreamLastId', $oEvenLast->getId());
@ -209,6 +210,7 @@ class ActionStream extends Action {
$oViewer=$this->Viewer_GetLocalViewer();
$oViewer->Assign('aStreamEvents', $aEvents);
$oViewer->Assign('sDateLast', getRequest('date_last'));
if (count($aEvents)) {
$oEvenLast=end($aEvents);
$this->Viewer_AssignAjax('iStreamLastId', $oEvenLast->getId());
@ -253,6 +255,7 @@ class ActionStream extends Action {
$oViewer=$this->Viewer_GetLocalViewer();
$oViewer->Assign('aStreamEvents', $aEvents);
$oViewer->Assign('sDateLast', getRequest('date_last'));
if (count($aEvents)) {
$oEvenLast=end($aEvents);
$this->Viewer_AssignAjax('iStreamLastId', $oEvenLast->getId());
@ -309,7 +312,7 @@ class ActionStream extends Action {
if (!$this->oUserCurrent) {
parent::EventNotFound();
}
if (!getRequest('login')) {
if (!getRequest('login') or !is_string(getRequest('login'))) {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}

View file

@ -39,7 +39,7 @@ class ActionTag extends Action {
* Регистрация евентов
*/
protected function RegisterEvent() {
$this->AddEventPreg('/^.+$/i','/^(page(\d+))?$/i','EventTags');
$this->AddEventPreg('/^.+$/i','/^(page([1-9]\d{0,5}))?$/i','EventTags');
}

View file

@ -162,7 +162,7 @@ class ActionTalk extends Action {
/**
* Передан ли номер страницы
*/
$iPage=preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch) ? $aMatch[1] : 1;
$iPage=preg_match("/^page([1-9]\d{0,5})$/i",$this->getParam(0),$aMatch) ? $aMatch[1] : 1;
/**
* Получаем список писем
*/
@ -262,7 +262,7 @@ class ActionTalk extends Action {
/**
* Ключевые слова в теме сообщения
*/
if($sKeyRequest=getRequest('keyword')){
if($sKeyRequest=getRequest('keyword') and is_string($sKeyRequest)){
$sKeyRequest=urldecode($sKeyRequest);
preg_match_all('~(\S+)~u',$sKeyRequest,$aWords);
@ -275,7 +275,7 @@ class ActionTalk extends Action {
/**
* Ключевые слова в тексте сообщения
*/
if($sKeyRequest=getRequest('keyword_text')){
if($sKeyRequest=getRequest('keyword_text') and is_string($sKeyRequest)){
$sKeyRequest=urldecode($sKeyRequest);
preg_match_all('~(\S+)~u',$sKeyRequest,$aWords);
@ -288,7 +288,7 @@ class ActionTalk extends Action {
/**
* Отправитель
*/
if($sender=getRequest('sender')){
if($sender=getRequest('sender') and is_string($sender)){
$aFilter['user_login']=urldecode($sender);
}
/**
@ -319,7 +319,7 @@ class ActionTalk extends Action {
/**
* Передан ли номер страницы
*/
$iPage=preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch) ? $aMatch[1] : 1;
$iPage=preg_match("/^page([1-9]\d{0,5})$/i",$this->getParam(0),$aMatch) ? $aMatch[1] : 1;
/**
* Получаем список писем
*/
@ -478,7 +478,7 @@ class ActionTalk extends Action {
* Проверяем адресатов
*/
$sUsers=getRequest('talk_users');
$aUsers=explode(',',$sUsers);
$aUsers=explode(',',(string)$sUsers);
$aUsersNew=array();
$aUserInBlacklist = $this->Talk_GetBlacklistByTargetId($this->oUserCurrent->getId());
@ -687,7 +687,10 @@ class ActionTalk extends Action {
/**
* Добавляем коммент
*/
$this->Hook_Run('talk_comment_add_before', array('oCommentNew'=>$oCommentNew,'oCommentParent'=>$oCommentParent,'oTalk'=>$oTalk));
if ($this->Comment_AddComment($oCommentNew)) {
$this->Hook_Run('talk_comment_add_after', array('oCommentNew'=>$oCommentNew,'oCommentParent'=>$oCommentParent,'oTalk'=>$oTalk));
$this->Viewer_AssignAjax('sCommentId',$oCommentNew->getId());
$oTalk->setDateLast(date("Y-m-d H:i:s"));
$oTalk->setUserIdLast($oCommentNew->getUserId());
@ -721,7 +724,7 @@ class ActionTalk extends Action {
* Устанавливаем формат Ajax ответа
*/
$this->Viewer_SetResponseAjax('json');
$sUsers=getRequest('users',null,'post');
$sUsers=(string)getRequest('users',null,'post');
/**
* Если пользователь не авторизирован, возвращаем ошибку
*/
@ -814,7 +817,7 @@ class ActionTalk extends Action {
* Устанавливаем формат Ajax ответа
*/
$this->Viewer_SetResponseAjax('json');
$idTarget=getRequest('idTarget',null,'post');
$idTarget=(string)getRequest('idTarget',null,'post');
/**
* Если пользователь не авторизирован, возвращаем ошибку
*/
@ -879,8 +882,8 @@ class ActionTalk extends Action {
* Устанавливаем формат Ajax ответа
*/
$this->Viewer_SetResponseAjax('json');
$idTarget=getRequest('idTarget',null,'post');
$idTalk=getRequest('idTalk',null,'post');
$idTarget=(string)getRequest('idTarget',null,'post');
$idTalk=(string)getRequest('idTalk',null,'post');
/**
* Если пользователь не авторизирован, возвращаем ошибку
*/
@ -957,8 +960,8 @@ class ActionTalk extends Action {
* Устанавливаем формат Ajax ответа
*/
$this->Viewer_SetResponseAjax('json');
$sUsers=getRequest('users',null,'post');
$idTalk=getRequest('idTalk',null,'post');
$sUsers=(string)getRequest('users',null,'post');
$idTalk=(string)getRequest('idTalk',null,'post');
/**
* Если пользователь не авторизирован, возвращаем ошибку
*/

View file

@ -74,8 +74,8 @@ class ActionTopic extends Action {
*/
protected function RegisterEvent() {
$this->AddEvent('add','EventAdd');
$this->AddEventPreg('/^published$/i','/^(page(\d+))?$/i','EventShowTopics');
$this->AddEventPreg('/^saved$/i','/^(page(\d+))?$/i','EventShowTopics');
$this->AddEventPreg('/^published$/i','/^(page([1-9]\d{0,5}))?$/i','EventShowTopics');
$this->AddEventPreg('/^saved$/i','/^(page([1-9]\d{0,5}))?$/i','EventShowTopics');
$this->AddEvent('edit','EventEdit');
$this->AddEvent('delete','EventDelete');
}

View file

@ -132,7 +132,7 @@ class ActionUserfeed extends Action {
if (!getRequest('id')) {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
$sType = getRequest('type');
$sType = (string)getRequest('type');
$iType = null;
/**
* Определяем тип подписки
@ -184,7 +184,7 @@ class ActionUserfeed extends Action {
/**
* Передан ли логин
*/
if (!getRequest('login')) {
if (!getRequest('login') or !is_string(getRequest('login'))) {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
@ -231,7 +231,7 @@ class ActionUserfeed extends Action {
$this->Message_AddError($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
$sType = getRequest('type');
$sType = (string)getRequest('type');
$iType = null;
/**
* Определяем от чего отписываемся
@ -253,4 +253,22 @@ class ActionUserfeed extends Action {
$this->Userfeed_unsubscribeUser($this->oUserCurrent->getId(), $iType, getRequest('id'));
$this->Message_AddNotice($this->Lang_Get('userfeed_subscribes_updated'), $this->Lang_Get('attention'));
}
/**
* При завершении экшена загружаем в шаблон необходимые переменные
*
*/
public function EventShutdown() {
/**
* Подсчитываем новые топики
*/
$iCountTopicsCollectiveNew=$this->Topic_GetCountTopicsCollectiveNew();
$iCountTopicsPersonalNew=$this->Topic_GetCountTopicsPersonalNew();
$iCountTopicsNew=$iCountTopicsCollectiveNew+$iCountTopicsPersonalNew;
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('iCountTopicsCollectiveNew',$iCountTopicsCollectiveNew);
$this->Viewer_Assign('iCountTopicsPersonalNew',$iCountTopicsPersonalNew);
$this->Viewer_Assign('iCountTopicsNew',$iCountTopicsNew);
}
}

View file

@ -1,59 +0,0 @@
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Класс инициализации экшенов.
* Он вызывается всегда перед запуском любого экшена. Может выполнять какие то инициализирующие действия, а так же может помочь при введении инвайтов,
* т.е. перенапрявлять всех неавторизованных юзеров на страницу регистрации по приглашению
*
* @package actions
* @since 1.0
*/
class InitAction {
/**
* Объект ядра
*
* @var Engine|null
*/
protected $oEngine=null;
/**
* Конструктор
*
*/
public function __construct($oEngine) {
$this->oEngine=$oEngine;
}
/**
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
* @see Engine::_CallModule
*
* @param string $sName Имя метода
* @param array $aArgs Аргументы
* @return mixed
*/
public function __call($sName,$aArgs) {
return $this->oEngine->_CallModule($sName,$aArgs);
}
/**
* Логика инициализации
*
*/
public function InitAction() {
$this->Hook_Run('init_action');
}
}
?>

View file

@ -37,10 +37,7 @@ class HookCopyright extends Hook {
/**
* Выводим везде, кроме страницы списка блогов и списка всех комментов
*/
if (!(Router::GetAction()=='blogs' or Router::GetAction()=='comments')) {
return '&copy; Powered by <a href="http://livestreetcms.org">LiveStreet CMS</a>';
}
return '';
return '&copy; Powered by <a href="http://livestreetcms.org">LiveStreet CMS</a>';
}
}
?>

View file

@ -1,46 +0,0 @@
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Регистрация хука для вывода ссылки спонсора релиза
*
* @package hooks
* @since 1.0
*/
class HookSponsor extends Hook {
/**
* Регистрируем хуки
*/
public function RegisterHook() {
$this->AddHook('template_copyright','SponsorLink',__CLASS__,-100);
}
/**
* Обработка хука копирайта
*
* @return string
*/
public function SponsorLink() {
/**
* Выводим на странице списка блогов и списка всех комментов
*/
if (Router::GetAction()=='blogs' or Router::GetAction()=='comments') {
return 'Спонсор релиза LiveStreet - <a href="http://radiorealty.ru" target="_blank">Портал недвижимости</a>';
}
return '';
}
}
?>

View file

@ -367,7 +367,7 @@ class ModuleACL extends Module {
return self::CAN_DELETE_BLOG_EMPTY_ONLY;
}
$oBlogUser=$this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(),$this->oUserCurrent->getId());
$oBlogUser=$this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(),$oUser->getId());
if($oBlogUser and $oBlogUser->getIsAdministrator()) {
return self::CAN_DELETE_BLOG_EMPTY_ONLY;
}

View file

@ -237,6 +237,9 @@ class ModuleBlog extends Module {
* @return ModuleBlog_EntityBlog|null
*/
public function GetBlogById($sBlogId) {
if (!is_numeric($sBlogId)) {
return null;
}
$aBlogs=$this->GetBlogsAdditionalData($sBlogId);
if (isset($aBlogs[$sBlogId])) {
return $aBlogs[$sBlogId];
@ -613,7 +616,10 @@ class ModuleBlog extends Module {
* @param array $aAllowData Список типов данных, которые нужно подтянуть к списку блогов
* @return array('collection'=>array,'count'=>int)
*/
public function GetBlogsByFilter($aFilter,$aOrder,$iCurrPage,$iPerPage,$aAllowData=array('owner'=>array(),'relation_user')) {
public function GetBlogsByFilter($aFilter,$aOrder,$iCurrPage,$iPerPage,$aAllowData=null) {
if (is_null($aAllowData)) {
$aAllowData=array('owner'=>array(),'relation_user');
}
$sKey="blog_filter_".serialize($aFilter).serialize($aOrder)."_{$iCurrPage}_{$iPerPage}";
if (false === ($data = $this->Cache_Get($sKey))) {
$data = array('collection'=>$this->oMapperBlog->GetBlogsByFilter($aFilter,$aOrder,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
@ -722,7 +728,12 @@ class ModuleBlog extends Module {
* которые являются откытыми для данного пользователя
*/
$aOpenBlogs=$this->GetBlogUsersByUserId($oUser->getId(),null,true);
$aCloseBlogs=array_diff($aCloseBlogs,$aOpenBlogs);
/**
* Получаем закрытые блоги, где пользователь является автором
*/
$aOwnerBlogs=$this->GetBlogsByFilter(array('type'=>'close','user_owner_id'=>$oUser->getId()),array(),1,100,array());
$aOwnerBlogs=array_keys($aOwnerBlogs['collection']);
$aCloseBlogs=array_diff($aCloseBlogs,$aOpenBlogs,$aOwnerBlogs);
}
/**
* Сохраняем в кеш
@ -873,6 +884,8 @@ class ModuleBlog extends Module {
* @return bool
*/
public function RecalculateCountTopic() {
//чистим зависимые кеши
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('blog_update'));
return $this->oMapperBlog->RecalculateCountTopic();
}
/**
@ -882,7 +895,19 @@ class ModuleBlog extends Module {
* @return bool
*/
public function RecalculateCountTopicByBlogId($iBlogId) {
//чистим зависимые кеши
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('blog_update',"blog_update_{$iBlogId}"));
$this->Cache_Delete("blog_{$iBlogId}");
return $this->oMapperBlog->RecalculateCountTopic($iBlogId);
}
/**
* Алиас для корректной работы ORM
*
* @param array $aBlogId Список ID блогов
* @return array
*/
public function GetBlogItemsByArrayId($aBlogId) {
return $this->GetBlogsByArrayId($aBlogId);
}
}
?>

View file

@ -170,7 +170,7 @@ class ModuleBlog_EntityBlog extends Entity {
if ($sPath=$this->getAvatar()) {
return preg_replace("#_\d{1,3}x\d{1,3}(\.\w{3,4})$#", ((($iSize==0)?"":"_{$iSize}x{$iSize}") . "\\1"),$sPath);
} else {
return Config::Get('path.static.skin').'/images/avatar_blog_'.$iSize.'x'.$iSize.'.jpg';
return Config::Get('path.static.skin').'/images/avatar_blog_'.$iSize.'x'.$iSize.'.png';
}
}
/**

File diff suppressed because it is too large Load diff

View file

@ -15,153 +15,380 @@
---------------------------------------------------------
*/
class ModuleComment_EntityComment extends Entity
{
public function getId() {
return $this->_getDataOne('comment_id');
}
public function getPid() {
return $this->_getDataOne('comment_pid');
}
public function getLeft() {
return $this->_getDataOne('comment_left');
}
public function getRight() {
return $this->_getDataOne('comment_right');
}
public function getTargetId() {
return $this->_getDataOne('target_id');
}
public function getTargetType() {
return $this->_getDataOne('target_type');
}
public function getTargetParentId() {
return $this->_getDataOne('target_parent_id') ? $this->_getDataOne('target_parent_id') : 0;
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getText() {
return $this->_getDataOne('comment_text');
}
public function getDate() {
return $this->_getDataOne('comment_date');
}
public function getUserIp() {
return $this->_getDataOne('comment_user_ip');
}
public function getRating() {
return number_format(round($this->_getDataOne('comment_rating'),2), 0, '.', '');
}
public function getCountVote() {
return $this->_getDataOne('comment_count_vote');
}
public function getDelete() {
return $this->_getDataOne('comment_delete');
}
public function getPublish() {
return $this->_getDataOne('comment_publish') ? 1 : 0;
}
public function getTextHash() {
return $this->_getDataOne('comment_text_hash');
}
public function getLevel() {
return $this->_getDataOne('comment_level');
}
public function isBad() {
if ($this->getRating()<=Config::Get('module.comment.bad')) {
return true;
}
return false;
}
public function getUser() {
return $this->_getDataOne('user');
}
public function getTarget() {
return $this->_getDataOne('target');
}
public function getVote() {
return $this->_getDataOne('vote');
}
public function getIsFavourite() {
return $this->_getDataOne('comment_is_favourite');
}
/**
* Объект сущности комментариев
*
* @package modules.comment
* @since 1.0
*/
class ModuleComment_EntityComment extends Entity {
/**
* Возвращает ID коммента
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('comment_id');
}
/**
* Возвращает ID родительского коммента
*
* @return int|null
*/
public function getPid() {
return $this->_getDataOne('comment_pid');
}
/**
* Возвращает значение left для дерева nested set
*
* @return int|null
*/
public function getLeft() {
return $this->_getDataOne('comment_left');
}
/**
* Возвращает значение right для дерева nested set
*
* @return int|null
*/
public function getRight() {
return $this->_getDataOne('comment_right');
}
/**
* Возвращает ID владельца
*
* @return int|null
*/
public function getTargetId() {
return $this->_getDataOne('target_id');
}
/**
* Возвращает тип владельца
*
* @return string|null
*/
public function getTargetType() {
return $this->_getDataOne('target_type');
}
/**
* Возвращет ID родителя владельца
*
* @return int|null
*/
public function getTargetParentId() {
return $this->_getDataOne('target_parent_id') ? $this->_getDataOne('target_parent_id') : 0;
}
/**
* Возвращает ID пользователя, автора комментария
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает текст комментария
*
* @return string|null
*/
public function getText() {
return $this->_getDataOne('comment_text');
}
/**
* Возвращает дату комментария
*
* @return string|null
*/
public function getDate() {
return $this->_getDataOne('comment_date');
}
/**
* Возвращает IP пользователя
*
* @return string|null
*/
public function getUserIp() {
return $this->_getDataOne('comment_user_ip');
}
/**
* Возвращает рейтинг комментария
*
* @return string
*/
public function getRating() {
return number_format(round($this->_getDataOne('comment_rating'),2), 0, '.', '');
}
/**
* Возвращает количество проголосовавших
*
* @return int|null
*/
public function getCountVote() {
return $this->_getDataOne('comment_count_vote');
}
/**
* Возвращает флаг удаленного комментария
*
* @return int|null
*/
public function getDelete() {
return $this->_getDataOne('comment_delete');
}
/**
* Возвращает флаг опубликованного комментария
*
* @return int
*/
public function getPublish() {
return $this->_getDataOne('comment_publish') ? 1 : 0;
}
/**
* Возвращает хеш комментария
*
* @return string|null
*/
public function getTextHash() {
return $this->_getDataOne('comment_text_hash');
}
public function getCountFavourite() {
return $this->_getDataOne('comment_count_favourite');
}
/**
* Возвращает уровень вложенности комментария
*
* @return int|null
*/
public function getLevel() {
return $this->_getDataOne('comment_level');
}
/**
* Проверяет является ли комментарий плохим
*
* @return bool
*/
public function isBad() {
if ($this->getRating()<=Config::Get('module.comment.bad')) {
return true;
}
return false;
}
/**
* Возвращает объект пользователя
*
* @return ModuleUser_EntityUser|null
*/
public function getUser() {
return $this->_getDataOne('user');
}
/**
* Возвращает объект владельца
*
* @return mixed|null
*/
public function getTarget() {
return $this->_getDataOne('target');
}
/**
* Возвращает объект голосования
*
* @return ModuleVote_EntityVote|null
*/
public function getVote() {
return $this->_getDataOne('vote');
}
/**
* Проверяет является ли комментарий избранным у текущего пользователя
*
* @return bool|null
*/
public function getIsFavourite() {
return $this->_getDataOne('comment_is_favourite');
}
/**
* Возвращает количество избранного
*
* @return int|null
*/
public function getCountFavourite() {
return $this->_getDataOne('comment_count_favourite');
}
/**
* Устанавливает ID комментария
*
* @param int $data
*/
public function setId($data) {
$this->_aData['comment_id']=$data;
}
public function setPid($data) {
$this->_aData['comment_pid']=$data;
}
public function setLeft($data) {
$this->_aData['comment_left']=$data;
}
public function setRight($data) {
$this->_aData['comment_right']=$data;
}
public function setTargetId($data) {
$this->_aData['target_id']=$data;
}
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
public function setTargetParentId($data) {
$this->_aData['target_parent_id']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setText($data) {
$this->_aData['comment_text']=$data;
}
public function setDate($data) {
$this->_aData['comment_date']=$data;
}
public function setUserIp($data) {
$this->_aData['comment_user_ip']=$data;
}
public function setRating($data) {
$this->_aData['comment_rating']=$data;
}
public function setCountVote($data) {
$this->_aData['comment_count_vote']=$data;
}
public function setDelete($data) {
$this->_aData['comment_delete']=$data;
}
public function setPublish($data) {
$this->_aData['comment_publish']=$data;
}
$this->_aData['comment_id']=$data;
}
/**
* Устанавливает ID родительского комментария
*
* @param int $data
*/
public function setPid($data) {
$this->_aData['comment_pid']=$data;
}
/**
* Устанавливает значени left для дерева nested set
*
* @param int $data
*/
public function setLeft($data) {
$this->_aData['comment_left']=$data;
}
/**
* Устанавливает значени right для дерева nested set
*
* @param int $data
*/
public function setRight($data) {
$this->_aData['comment_right']=$data;
}
/**
* Устанавливает ID владельца
*
* @param int $data
*/
public function setTargetId($data) {
$this->_aData['target_id']=$data;
}
/**
* Устанавливает тип владельца
*
* @param string $data
*/
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
/**
* Устанавливает ID родителя владельца
*
* @param int $data
*/
public function setTargetParentId($data) {
$this->_aData['target_parent_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает текст комментария
*
* @param string $data
*/
public function setText($data) {
$this->_aData['comment_text']=$data;
}
/**
* Устанавливает дату комментария
*
* @param string $data
*/
public function setDate($data) {
$this->_aData['comment_date']=$data;
}
/**
* Устанвливает IP пользователя
*
* @param string $data
*/
public function setUserIp($data) {
$this->_aData['comment_user_ip']=$data;
}
/**
* Устанавливает рейтинг комментария
*
* @param float $data
*/
public function setRating($data) {
$this->_aData['comment_rating']=$data;
}
/**
* Устанавливает количество проголосавших
*
* @param int $data
*/
public function setCountVote($data) {
$this->_aData['comment_count_vote']=$data;
}
/**
* Устанавливает флаг удаленности комментария
*
* @param int $data
*/
public function setDelete($data) {
$this->_aData['comment_delete']=$data;
}
/**
* Устанавливает флаг публикации
*
* @param int $data
*/
public function setPublish($data) {
$this->_aData['comment_publish']=$data;
}
/**
* Устанавливает хеш комментария
*
* @param strign $data
*/
public function setTextHash($data) {
$this->_aData['comment_text_hash']=$data;
}
public function setLevel($data) {
$this->_aData['comment_level']=$data;
}
public function setUser($data) {
$this->_aData['user']=$data;
}
public function setTarget($data) {
$this->_aData['target']=$data;
}
public function setVote($data) {
$this->_aData['vote']=$data;
}
public function setIsFavourite($data) {
$this->_aData['comment_is_favourite']=$data;
}
public function setCountFavourite($data) {
$this->_aData['comment_count_favourite']=$data;
}
$this->_aData['comment_text_hash']=$data;
}
/**
* Устанавливает уровень вложенности комментария
*
* @param int $data
*/
public function setLevel($data) {
$this->_aData['comment_level']=$data;
}
/**
* Устаналвает объект пользователя
*
* @param ModuleUser_EntityUser $data
*/
public function setUser($data) {
$this->_aData['user']=$data;
}
/**
* Устанавливает объект владельца
*
* @param mixed $data
*/
public function setTarget($data) {
$this->_aData['target']=$data;
}
/**
* Устанавливает объект голосования
*
* @param ModuleVote_EntityVote $data
*/
public function setVote($data) {
$this->_aData['vote']=$data;
}
/**
* Устанавливает факт нахождения комментария в избранном у текущего пользователя
*
* @param bool $data
*/
public function setIsFavourite($data) {
$this->_aData['comment_is_favourite']=$data;
}
/**
* Устанавливает количество избранного
*
* @param int $data
*/
public function setCountFavourite($data) {
$this->_aData['comment_count_favourite']=$data;
}
}
?>

View file

@ -15,32 +15,77 @@
---------------------------------------------------------
*/
class ModuleComment_EntityCommentOnline extends Entity
{
public function getTargetId() {
return $this->_getDataOne('target_id');
}
public function getTargetType() {
return $this->_getDataOne('target_type');
}
/**
* Объект сущности прямого эфира
*
* @package modules.comment
* @since 1.0
*/
class ModuleComment_EntityCommentOnline extends Entity {
/**
* Возвращает ID владельца
*
* @return int|null
*/
public function getTargetId() {
return $this->_getDataOne('target_id');
}
/**
* Возвращает тип владельца
*
* @return string|null
*/
public function getTargetType() {
return $this->_getDataOne('target_type');
}
/**
* Возвращает ID комментария
*
* @return int|null
*/
public function getCommentId() {
return $this->_getDataOne('comment_id');
}
public function getTargetParentId() {
return $this->_getDataOne('target_parent_id') ? $this->_getDataOne('target_parent_id') : 0;
}
public function setTargetId($data) {
$this->_aData['target_id']=$data;
}
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
public function setCommentId($data) {
$this->_aData['comment_id']=$data;
}
public function setTargetParentId($data) {
$this->_aData['target_parent_id']=$data;
}
return $this->_getDataOne('comment_id');
}
/**
* Возвращает ID родителя владельца
*
* @return int
*/
public function getTargetParentId() {
return $this->_getDataOne('target_parent_id') ? $this->_getDataOne('target_parent_id') : 0;
}
/**
* Устанавливает ID владельца
*
* @param int $data
*/
public function setTargetId($data) {
$this->_aData['target_id']=$data;
}
/**
* Устанавливает тип владельца
*
* @param string $data
*/
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
/**
* Устанавливает ID комментария
*
* @param int $data
*/
public function setCommentId($data) {
$this->_aData['comment_id']=$data;
}
/**
* Устанавливает ID родителя владельца
*
* @param int $data
*/
public function setTargetParentId($data) {
$this->_aData['target_parent_id']=$data;
}
}
?>

View file

@ -15,10 +15,26 @@
---------------------------------------------------------
*/
class ModuleComment_MapperComment extends Mapper {
public function GetCommentsRatingByDate($sDate,$sTargetType,$iLimit,$aExcludeTarget=array(),$aExcludeParentTarget=array()) {
$sql = "SELECT
/**
* Маппер комментариев, работа с базой данных
*
* @package modules.comment
* @since 1.0
*/
class ModuleComment_MapperComment extends Mapper {
/**
* Получить комменты по рейтингу и дате
*
* @param string $sDate Дата за которую выводить рейтинг
* @param string $sTargetType Тип владельца комментария
* @param int $iLimit Количество элементов
* @param array $aExcludeTarget Список ID владельцев, которые необходимо исключить из выдачи
* @param array $aExcludeParentTarget Список ID родителей владельцев, которые необходимо исключить из выдачи
* @return array
*/
public function GetCommentsRatingByDate($sDate,$sTargetType,$iLimit,$aExcludeTarget=array(),$aExcludeParentTarget=array()) {
$sql = "SELECT
comment_id
FROM
".Config::Get('db.table.comment')."
@ -35,14 +51,14 @@ class ModuleComment_MapperComment extends Mapper {
{ AND target_id NOT IN(?a) }
{ AND target_parent_id NOT IN (?a) }
ORDER by comment_rating desc, comment_id desc
LIMIT 0, ?d ";
$aComments=array();
LIMIT 0, ?d ";
$aComments=array();
if ($aRows=$this->oDb->select(
$sql,$sTargetType, $sDate,
(is_array($aExcludeTarget)&&count($aExcludeTarget)) ? $aExcludeTarget : DBSIMPLE_SKIP,
(count($aExcludeParentTarget) ? $aExcludeParentTarget : DBSIMPLE_SKIP),
$iLimit
)
$sql,$sTargetType, $sDate,
(is_array($aExcludeTarget)&&count($aExcludeTarget)) ? $aExcludeTarget : DBSIMPLE_SKIP,
(count($aExcludeParentTarget) ? $aExcludeParentTarget : DBSIMPLE_SKIP),
$iLimit
)
) {
foreach ($aRows as $aRow) {
$aComments[]=$aRow['comment_id'];
@ -50,7 +66,16 @@ class ModuleComment_MapperComment extends Mapper {
}
return $aComments;
}
/**
* Получает уникальный коммент, это помогает спастись от дублей комментов
*
* @param int $sTargetId ID владельца комментария
* @param string $sTargetType Тип владельца комментария
* @param int $sUserId ID пользователя
* @param int $sCommentPid ID родительского комментария
* @param string $sHash Хеш строка текста комментария
* @return int|null
*/
public function GetCommentUnique($sTargetId,$sTargetType,$sUserId,$sCommentPid,$sHash) {
$sql = "SELECT comment_id FROM ".Config::Get('db.table.comment')."
WHERE
@ -69,7 +94,17 @@ class ModuleComment_MapperComment extends Mapper {
}
return null;
}
/**
* Получить все комменты
*
* @param string $sTargetType Тип владельца комментария
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @param array $aExcludeTarget Список ID владельцев, которые необходимо исключить из выдачи
* @param array $aExcludeParentTarget Список ID родителей владельцев, которые необходимо исключить из выдачи, например, исключить комментарии топиков к определенным блогам(закрытым)
* @return array
*/
public function GetCommentsAll($sTargetType,&$iCount,$iCurrPage,$iPerPage,$aExcludeTarget=array(),$aExcludeParentTarget=array()) {
$sql = "SELECT
comment_id
@ -84,28 +119,32 @@ class ModuleComment_MapperComment extends Mapper {
{ AND target_id NOT IN(?a) }
{ AND target_parent_id NOT IN(?a) }
ORDER by comment_id desc
LIMIT ?d, ?d ";
LIMIT ?d, ?d ";
$aComments=array();
if ($aRows=$this->oDb->selectPage(
$iCount,$sql,$sTargetType,
(count($aExcludeTarget)?$aExcludeTarget:DBSIMPLE_SKIP),
(count($aExcludeParentTarget)?$aExcludeParentTarget:DBSIMPLE_SKIP),
($iCurrPage-1)*$iPerPage, $iPerPage
)
$iCount,$sql,$sTargetType,
(count($aExcludeTarget)?$aExcludeTarget:DBSIMPLE_SKIP),
(count($aExcludeParentTarget)?$aExcludeParentTarget:DBSIMPLE_SKIP),
($iCurrPage-1)*$iPerPage, $iPerPage
)
) {
foreach ($aRows as $aRow) {
$aComments[]=$aRow['comment_id'];
}
}
}
return $aComments;
}
/**
* Список комментов по ID
*
* @param array $aArrayId Список ID комментариев
* @return array
*/
public function GetCommentsByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
*
FROM
@ -117,13 +156,19 @@ class ModuleComment_MapperComment extends Mapper {
if ($aRows=$this->oDb->select($sql,$aArrayId,$aArrayId)) {
foreach ($aRows as $aRow) {
$aComments[]=Engine::GetEntity('Comment',$aRow);
}
}
}
return $aComments;
}
public function GetCommentsOnline($sTargetType,$aExcludeTargets,$iLimit) {
/**
* Получить все комменты сгрупированные по типу(для вывода прямого эфира)
*
* @param string $sTargetType Тип владельца комментария
* @param array $aExcludeTargets Список ID владельцев для исключения
* @param int $iLimit Количество элементов
* @return array
*/
public function GetCommentsOnline($sTargetType,$aExcludeTargets,$iLimit) {
$sql = "SELECT
comment_id
FROM
@ -132,13 +177,13 @@ class ModuleComment_MapperComment extends Mapper {
target_type = ?
{ AND target_parent_id NOT IN(?a) }
ORDER by comment_online_id desc limit 0, ?d ; ";
$aComments=array();
if ($aRows=$this->oDb->select(
$sql,$sTargetType,
(count($aExcludeTargets)?$aExcludeTargets:DBSIMPLE_SKIP),
$iLimit
)
$sql,$sTargetType,
(count($aExcludeTargets)?$aExcludeTargets:DBSIMPLE_SKIP),
$iLimit
)
) {
foreach ($aRows as $aRow) {
$aComments[]=$aRow['comment_id'];
@ -146,8 +191,14 @@ class ModuleComment_MapperComment extends Mapper {
}
return $aComments;
}
public function GetCommentsByTargetId($sId,$sTargetType) {
/**
* Получить комменты по владельцу
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @return array
*/
public function GetCommentsByTargetId($sId,$sTargetType) {
$sql = "SELECT
comment_id,
comment_id as ARRAY_KEY,
@ -165,8 +216,14 @@ class ModuleComment_MapperComment extends Mapper {
}
return null;
}
public function GetCommentsTreeByTargetId($sId,$sTargetType) {
/**
* Получает комменты используя nested set
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @return array
*/
public function GetCommentsTreeByTargetId($sId,$sTargetType) {
$sql = "SELECT
comment_id
FROM
@ -185,10 +242,18 @@ class ModuleComment_MapperComment extends Mapper {
}
return $aComments;
}
/**
* Получает комменты используя nested set
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @param int $iCount Возвращает общее количество элементов
* @param int $iPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetCommentsTreePageByTargetId($sId,$sTargetType,&$iCount,$iPage,$iPerPage) {
/**
* Сначала получаем корни и определяем границы выборки веток
*/
@ -210,13 +275,13 @@ class ModuleComment_MapperComment extends Mapper {
$aCmt=array_pop($aRows);
$iLeft=$aCmt['comment_left'];
if ($aRows) {
$aCmt=array_shift($aRows);
$aCmt=array_shift($aRows);
}
$iRight=$aCmt['comment_right'];
} else {
return array();
}
/**
* Теперь получаем полный список комментов
*/
@ -240,10 +305,16 @@ class ModuleComment_MapperComment extends Mapper {
$aComments[]=$aRow['comment_id'];
}
}
return $aComments;
}
/**
* Возвращает количество дочерних комментариев у корневого коммента
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @return int
*/
public function GetCountCommentsRootByTargetId($sId,$sTargetType) {
$sql = "SELECT
count(comment_id) as c
@ -255,12 +326,19 @@ class ModuleComment_MapperComment extends Mapper {
target_type = ?
AND
comment_pid IS NULL ;";
if ($aRow=$this->oDb->selectRow($sql,$sId,$sTargetType)) {
return $aRow['c'];
}
}
/**
* Возвращает количество комментариев
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @param int $iLeft Значение left для дерева nested set
* @return int
*/
public function GetCountCommentsAfterByTargetId($sId,$sTargetType,$iLeft) {
$sql = "SELECT
count(comment_id) as c
@ -274,12 +352,19 @@ class ModuleComment_MapperComment extends Mapper {
comment_pid IS NULL
AND
comment_left >= ?d ;";
if ($aRow=$this->oDb->selectRow($sql,$sId,$sTargetType,$iLeft)) {
return $aRow['c'];
}
}
/**
* Возвращает корневой комментарий
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @param int $iLeft Значение left для дерева nested set
* @return ModuleComment_EntityComment|null
*/
public function GetCommentRootByTargetIdAndChildren($sId,$sTargetType,$iLeft) {
$sql = "SELECT
*
@ -296,14 +381,21 @@ class ModuleComment_MapperComment extends Mapper {
AND
comment_right > ?d
LIMIT 0,1 ;";
if ($aRow=$this->oDb->selectRow($sql,$sId,$sTargetType,$iLeft,$iLeft)) {
return Engine::GetEntity('Comment',$aRow);
}
return null;
}
public function GetCommentsNewByTargetId($sId,$sTargetType,$sIdCommentLast) {
/**
* Получить новые комменты для владельца
*
* @param int $sId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @param int $sIdCommentLast ID последнего прочитанного комментария
* @return array
*/
public function GetCommentsNewByTargetId($sId,$sTargetType,$sIdCommentLast) {
$sql = "SELECT
comment_id
FROM
@ -324,7 +416,18 @@ class ModuleComment_MapperComment extends Mapper {
}
return $aComments;
}
/**
* Получить комменты по юзеру
*
* @param int $sId ID пользователя
* @param string $sTargetType Тип владельца комментария
* @param int $iCount Возращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @param array $aExcludeTarget Список ID владельцев, которые необходимо исключить из выдачи
* @param array $aExcludeParentTarget Список ID родителей владельцев, которые необходимо исключить из выдачи
* @return array
*/
public function GetCommentsByUserId($sId,$sTargetType,&$iCount,$iCurrPage,$iPerPage,$aExcludeTarget=array(),$aExcludeParentTarget=array()) {
$sql = "SELECT
comment_id
@ -341,15 +444,15 @@ class ModuleComment_MapperComment extends Mapper {
{ AND target_id NOT IN (?a) }
{ AND target_parent_id NOT IN (?a) }
ORDER by comment_id desc
LIMIT ?d, ?d ";
LIMIT ?d, ?d ";
$aComments=array();
if ($aRows=$this->oDb->selectPage(
$iCount,$sql,$sId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
(count($aExcludeParentTarget) ? $aExcludeParentTarget : DBSIMPLE_SKIP),
($iCurrPage-1)*$iPerPage, $iPerPage
)
$iCount,$sql,$sId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
(count($aExcludeParentTarget) ? $aExcludeParentTarget : DBSIMPLE_SKIP),
($iCurrPage-1)*$iPerPage, $iPerPage
)
) {
foreach ($aRows as $aRow) {
$aComments[]=$aRow['comment_id'];
@ -357,7 +460,15 @@ class ModuleComment_MapperComment extends Mapper {
}
return $aComments;
}
/**
* Получает количество комментариев одного пользователя
*
* @param id $sId ID пользователя
* @param string $sTargetType Тип владельца комментария
* @param array $aExcludeTarget Список ID владельцев, которые необходимо исключить из выдачи
* @param array $aExcludeParentTarget Список ID родителей владельцев, которые необходимо исключить из выдачи
* @return int
*/
public function GetCountCommentsByUserId($sId,$sTargetType,$aExcludeTarget=array(),$aExcludeParentTarget=array()) {
$sql = "SELECT
count(comment_id) as count
@ -373,18 +484,23 @@ class ModuleComment_MapperComment extends Mapper {
comment_publish = 1
{ AND target_id NOT IN (?a) }
{ AND target_parent_id NOT IN (?a) }
";
";
if ($aRow=$this->oDb->selectRow(
$sql,$sId,$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
(count($aExcludeParentTarget) ? $aExcludeParentTarget : DBSIMPLE_SKIP)
)
$sql,$sId,$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
(count($aExcludeParentTarget) ? $aExcludeParentTarget : DBSIMPLE_SKIP)
)
) {
return $aRow['count'];
}
return false;
}
/**
* Добавляет коммент
*
* @param ModuleComment_EntityComment $oComment Объект комментария
* @return bool|int
*/
public function AddComment(ModuleComment_EntityComment $oComment) {
$sql = "INSERT INTO ".Config::Get('db.table.comment')."
(comment_pid,
@ -399,22 +515,27 @@ class ModuleComment_MapperComment extends Mapper {
comment_text_hash
)
VALUES(?, ?d, ?, ?d, ?d, ?, ?, ?, ?d, ?)
";
if ($iId=$this->oDb->query($sql,$oComment->getPid(),$oComment->getTargetId(),$oComment->getTargetType(),$oComment->getTargetParentId(),$oComment->getUserId(),$oComment->getText(),$oComment->getDate(),$oComment->getUserIp(),$oComment->getPublish(),$oComment->getTextHash()))
";
if ($iId=$this->oDb->query($sql,$oComment->getPid(),$oComment->getTargetId(),$oComment->getTargetType(),$oComment->getTargetParentId(),$oComment->getUserId(),$oComment->getText(),$oComment->getDate(),$oComment->getUserIp(),$oComment->getPublish(),$oComment->getTextHash()))
{
return $iId;
}
return false;
}
/**
* Добавляет коммент в дерево nested set
*
* @param ModuleComment_EntityComment $oComment Объект комментария
* @return bool|int
*/
public function AddCommentTree(ModuleComment_EntityComment $oComment) {
$this->oDb->transaction();
if ($oComment->getPid() and $oCommentParent=$this->GetCommentsByArrayId(array($oComment->getPid()))) {
$oCommentParent=$oCommentParent[0];
$iLeft=$oCommentParent->getRight();
$iLevel=$oCommentParent->getLevel()+1;
$sql= "UPDATE ".Config::Get('db.table.comment')." SET comment_left=comment_left+2 WHERE target_id=?d and target_type=? and comment_left>? ;";
$this->oDb->query($sql, $oComment->getTargetId(),$oComment->getTargetType(),$iLeft-1);
$sql = "UPDATE ".Config::Get('db.table.comment')." SET comment_right=comment_right+2 WHERE target_id=?d and target_type=? and comment_right>? ;";
@ -427,21 +548,27 @@ class ModuleComment_MapperComment extends Mapper {
}
$iLevel=0;
}
if ($iId=$this->AddComment($oComment)) {
$sql = "UPDATE ".Config::Get('db.table.comment')." SET comment_left = ?d, comment_right = ?d, comment_level = ?d WHERE comment_id = ? ;";
$this->oDb->query($sql, $iLeft,$iLeft+1,$iLevel,$iId);
$this->oDb->commit();
return $iId;
}
if (strtolower(Config::Get('db.tables.engine'))=='innodb') {
$this->oDb->rollback();
}
return false;
}
/**
* Возвращает последний комментарий
*
* @param int $sTargetId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @return ModuleComment_EntityComment|null
*/
public function GetCommentLast($sTargetId,$sTargetType) {
$sql = "SELECT * FROM ".Config::Get('db.table.comment')."
WHERE
@ -456,7 +583,12 @@ class ModuleComment_MapperComment extends Mapper {
}
return null;
}
/**
* Добавляет новый коммент в прямой эфир
*
* @param ModuleComment_EntityCommentOnline $oCommentOnline Объект онлайн комментария
* @return bool|int
*/
public function AddCommentOnline(ModuleComment_EntityCommentOnline $oCommentOnline) {
$sql = "REPLACE INTO ".Config::Get('db.table.comment_online')."
SET
@ -464,26 +596,33 @@ class ModuleComment_MapperComment extends Mapper {
target_type= ? ,
target_parent_id = ?d,
comment_id= ?d
";
if ($iId=$this->oDb->query($sql,$oCommentOnline->getTargetId(),$oCommentOnline->getTargetType(),$oCommentOnline->getTargetParentId(),$oCommentOnline->getCommentId()))
{
";
if ($iId=$this->oDb->query($sql,$oCommentOnline->getTargetId(),$oCommentOnline->getTargetType(),$oCommentOnline->getTargetParentId(),$oCommentOnline->getCommentId())) {
return $iId;
}
}
return false;
}
/**
* Удаляет коммент из прямого эфира
*
* @param int $sTargetId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @return bool
*/
public function DeleteCommentOnlineByTargetId($sTargetId,$sTargetType) {
$sql = "DELETE FROM ".Config::Get('db.table.comment_online')." WHERE target_id = ?d and target_type = ? ";
if ($this->oDb->query($sql,$sTargetId,$sTargetType))
{
$sql = "DELETE FROM ".Config::Get('db.table.comment_online')." WHERE target_id = ?d and target_type = ? ";
if ($this->oDb->query($sql,$sTargetId,$sTargetType)) {
return true;
}
}
return false;
}
public function UpdateComment(ModuleComment_EntityComment $oComment) {
/**
* Обновляет коммент
*
* @param ModuleComment_EntityComment $oComment Объект комментария
* @return bool
*/
public function UpdateComment(ModuleComment_EntityComment $oComment) {
$sql = "UPDATE ".Config::Get('db.table.comment')."
SET
comment_text= ?,
@ -495,26 +634,39 @@ class ModuleComment_MapperComment extends Mapper {
comment_text_hash = ?
WHERE
comment_id = ?d
";
";
if ($this->oDb->query($sql,$oComment->getText(),$oComment->getRating(),$oComment->getCountVote(),$oComment->getCountFavourite(),$oComment->getDelete(),$oComment->getPublish(),$oComment->getTextHash(),$oComment->getId())) {
return true;
}
}
return false;
}
public function SetCommentsPublish($sTargetId,$sTargetType,$iPublish) {
/**
* Устанавливает publish у коммента
*
* @param int $sTargetId ID владельца коммента
* @param string $sTargetType Тип владельца комментария
* @param int $iPublish Статус отображать комментарии или нет
* @return bool
*/
public function SetCommentsPublish($sTargetId,$sTargetType,$iPublish) {
$sql = "UPDATE ".Config::Get('db.table.comment')."
SET
comment_publish= ?
WHERE
target_id = ?d AND target_type = ?
";
";
if ($this->oDb->query($sql,$iPublish,$sTargetId,$sTargetType)) {
return true;
}
}
return false;
}
/**
* Удаляет комментарии из базы данных
*
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельцев
* @return bool
*/
public function DeleteCommentByTargetId($aTargetId,$sTargetType) {
$sql = "
DELETE FROM ".Config::Get('db.table.comment')."
@ -522,13 +674,19 @@ class ModuleComment_MapperComment extends Mapper {
target_id IN (?a)
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$aTargetId,$sTargetType)) {
return true;
}
return false;
}
/**
* Удаляет коммент из прямого эфира по массиву переданных идентификаторов
*
* @param array|int $aCommentId
* @param string $sTargetType Тип владельцев
* @return bool
*/
public function DeleteCommentOnlineByArrayId($aCommentId,$sTargetType) {
$sql = "
DELETE FROM ".Config::Get('db.table.comment_online')."
@ -536,13 +694,20 @@ class ModuleComment_MapperComment extends Mapper {
comment_id IN (?a)
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$aCommentId,$sTargetType)) {
return true;
}
}
return false;
}
/**
* Меняем target parent по массиву идентификаторов
*
* @param int $sParentId Новый ID родителя владельца
* @param string $sTargetType Тип владельца
* @param array|int $aTargetId Список ID владельцев
* @return bool
*/
public function UpdateTargetParentByTargetId($sParentId, $sTargetType, $aTargetId) {
$sql = "
UPDATE ".Config::Get('db.table.comment')."
@ -552,13 +717,20 @@ class ModuleComment_MapperComment extends Mapper {
target_id IN (?a)
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$sParentId,$aTargetId,$sTargetType)) {
return true;
}
return false;
return false;
}
/**
* Меняем target parent по массиву идентификаторов в таблице комментариев online
*
* @param int $sParentId Новый ID родителя владельца
* @param string $sTargetType Тип владельца
* @param array|int $aTargetId Список ID владельцев
* @return bool
*/
public function UpdateTargetParentByTargetIdOnline($sParentId, $sTargetType, $aTargetId) {
$sql = "
UPDATE ".Config::Get('db.table.comment_online')."
@ -568,13 +740,20 @@ class ModuleComment_MapperComment extends Mapper {
target_id IN (?a)
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$sParentId,$aTargetId,$sTargetType)) {
return true;
}
return false;
}
return false;
}
/**
* Меняет target parent на новый
*
* @param int $sParentId Прежний ID родителя владельца
* @param string $sTargetType Тип владельца
* @param int $sParentIdNew Новый ID родителя владельца
* @return bool
*/
public function MoveTargetParent($sParentId, $sTargetType, $sParentIdNew) {
$sql = "
UPDATE ".Config::Get('db.table.comment')."
@ -584,13 +763,20 @@ class ModuleComment_MapperComment extends Mapper {
target_parent_id = ?d
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$sParentIdNew,$sParentId,$sTargetType)) {
return true;
}
return false;
return false;
}
/**
* Меняет target parent на новый в прямом эфире
*
* @param int $sParentId Прежний ID родителя владельца
* @param string $sTargetType Тип владельца
* @param int $sParentIdNew Новый ID родителя владельца
* @return bool
*/
public function MoveTargetParentOnline($sParentId, $sTargetType, $sParentIdNew) {
$sql = "
UPDATE ".Config::Get('db.table.comment_online')."
@ -600,20 +786,29 @@ class ModuleComment_MapperComment extends Mapper {
target_parent_id = ?d
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$sParentIdNew,$sParentId,$sTargetType)) {
return true;
}
return false;
return false;
}
public function RestoreTree($iPid,$iLft,$iLevel,$aTargetId,$sTargetType) {
/**
* Перестраивает дерево комментариев
* Восстанавливает значения left, right и level
*
* @param int $iPid ID родителя
* @param int $iLft Значение left для дерева nested set
* @param int $iLevel Уровень
* @param int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return int
*/
public function RestoreTree($iPid,$iLft,$iLevel,$aTargetId,$sTargetType) {
$iRgt = $iLft+1;
$iLevel++;
$sql = "SELECT comment_id FROM ".Config::Get('db.table.comment')." WHERE target_id = ? and target_type = ? { and comment_pid = ? } { and comment_pid IS NULL and 1=?d}
ORDER BY comment_id ASC";
if ($aRows=$this->oDb->select($sql,$aTargetId,$sTargetType,!is_null($iPid) ? $iPid:DBSIMPLE_SKIP, is_null($iPid) ? 1:DBSIMPLE_SKIP)) {
foreach ($aRows as $aRow) {
$iRgt = $this->RestoreTree($aRow['comment_id'], $iRgt,$iLevel,$aTargetId,$sTargetType);
@ -624,12 +819,16 @@ class ModuleComment_MapperComment extends Mapper {
$sql = "UPDATE ".Config::Get('db.table.comment')."
SET comment_left=?d, comment_right=?d , comment_level =?d
WHERE comment_id = ? ";
$this->oDb->query($sql,$iLft,$iRgt,$iLevel,$iPid);
$this->oDb->query($sql,$iLft,$iRgt,$iLevel,$iPid);
}
return $iRgt+1;
}
/**
* Возвращает список всех используемых типов владельца
*
* @return array
*/
public function GetCommentTypes() {
$sql = "SELECT target_type FROM ".Config::Get('db.table.comment')."
GROUP BY target_type ";
@ -641,17 +840,28 @@ class ModuleComment_MapperComment extends Mapper {
}
return $aTypes;
}
/**
* Возвращает список ID владельцев
*
* @param string $sTargetType Тип владельца
* @param int $iPage Номер страницы
* @param int $iPerPage Количество элементов на одну старницу
* @return array
*/
public function GetTargetIdByType($sTargetType,$iPage,$iPerPage) {
$sql = "SELECT target_id FROM ".Config::Get('db.table.comment')."
WHERE target_type = ? GROUP BY target_id ORDER BY target_id LIMIT ?d, ?d ";
WHERE target_type = ? GROUP BY target_id ORDER BY target_id LIMIT ?d, ?d ";
if ($aRows=$this->oDb->select($sql,$sTargetType,($iPage-1)*$iPerPage, $iPerPage)) {
return $aRows;
}
return array();
}
public function RecalculateFavourite() {
/**
* Пересчитывает счетчик избранных комментариев
*
* @return bool
*/
public function RecalculateFavourite() {
$sql = "
UPDATE ".Config::Get('db.table.comment')." c
SET c.comment_count_favourite = (
@ -664,11 +874,74 @@ class ModuleComment_MapperComment extends Mapper {
AND
f.target_type = 'comment'
)
";
";
if ($this->oDb->query($sql)) {
return true;
}
return false;
return false;
}
/**
* Получает список комментариев по фильтру
*
* @param array $aFilter Фильтр выборки
* @param array $aOrder Сортировка
* @param int $iCount Возвращает общее количество элментов
* @param int $iCurrPage Номер текущей страницы
* @param int $iPerPage Количество элементов на одну страницу
* @return array
*/
public function GetCommentsByFilter($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('comment_id','comment_pid','comment_rating','comment_date');
$sOrder='';
foreach ($aOrder as $key=>$value) {
if (!in_array($key,$aOrderAllow)) {
unset($aOrder[$key]);
} elseif (in_array($value,array('asc','desc'))) {
$sOrder.=" {$key} {$value},";
}
}
$sOrder=trim($sOrder,',');
if ($sOrder=='') {
$sOrder=' comment_id desc ';
}
if (isset($aFilter['target_type']) and !is_array($aFilter['target_type'])) {
$aFilter['target_type']=array($aFilter['target_type']);
}
$sql = "SELECT
comment_id
FROM
".Config::Get('db.table.comment')."
WHERE
1 = 1
{ AND comment_id = ?d }
{ AND user_id = ?d }
{ AND target_parent_id = ?d }
{ AND target_id = ?d }
{ AND target_type IN (?a) }
{ AND comment_delete = ?d }
{ AND comment_publish = ?d }
ORDER by {$sOrder}
LIMIT ?d, ?d ;
";
$aResult=array();
if ($aRows=$this->oDb->selectPage($iCount,$sql,
isset($aFilter['id']) ? $aFilter['id'] : DBSIMPLE_SKIP,
isset($aFilter['user_id']) ? $aFilter['user_id'] : DBSIMPLE_SKIP,
isset($aFilter['target_parent_id']) ? $aFilter['target_parent_id'] : DBSIMPLE_SKIP,
isset($aFilter['target_id']) ? $aFilter['target_id'] : DBSIMPLE_SKIP,
(isset($aFilter['target_type']) and count($aFilter['target_type']) ) ? $aFilter['target_type'] : DBSIMPLE_SKIP,
isset($aFilter['delete']) ? $aFilter['delete'] : DBSIMPLE_SKIP,
isset($aFilter['publish']) ? $aFilter['publish'] : DBSIMPLE_SKIP,
($iCurrPage-1)*$iPerPage, $iPerPage
)) {
foreach ($aRows as $aRow) {
$aResult[]=$aRow['comment_id'];
}
}
return $aResult;
}
}
?>

View file

@ -16,47 +16,55 @@
*/
/**
* Модуль для работы с голосованиями
* Модуль для работы с избранным
*
* @package modules.favourite
* @since 1.0
*/
class ModuleFavourite extends Module {
protected $oMapper;
class ModuleFavourite extends Module {
/**
* Объект маппера
*
* @var ModuleFavourite_MapperFavourite
*/
protected $oMapper;
/**
* Инициализация
*
*/
public function Init() {
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
}
/**
* Получает информацию о том, найден ли таргет в избранном или нет
*
* @param string $sTargetId
* @param string $sTargetType
* @param string $sUserId
* @param int $sTargetId ID владельца
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return ModuleFavourite_EntityFavourite|null
*/
public function GetFavourite($sTargetId,$sTargetType,$sUserId) {
if (!is_numeric($sTargetId) or !is_string($sTargetType)) {
return null;
}
$data=$this->GetFavouritesByArray($sTargetId,$sTargetType,$sUserId);
return (isset($data[$sTargetId]))
? $data[$sTargetId]
: null;
}
/**
* Получить список избранного по списку айдишников
*
* @param array $aTargetId
* @param string $sTargetType
* @param string $sUserId
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouritesByArray($aTargetId,$sTargetType,$sUserId) {
if (!$aTargetId) {
return array();
}
}
if (Config::Get('sys.cache.solid')) {
return $this->GetFavouritesByArraySolid($aTargetId,$sTargetType,$sUserId);
}
@ -70,25 +78,25 @@ class ModuleFavourite extends Module {
* Делаем мульти-запрос к кешу
*/
$aCacheKeys=func_build_cache_keys($aTargetId,"favourite_{$sTargetType}_",'_'.$sUserId);
if (false !== ($data = $this->Cache_Get($aCacheKeys))) {
if (false !== ($data = $this->Cache_Get($aCacheKeys))) {
/**
* проверяем что досталось из кеша
*/
foreach ($aCacheKeys as $sValue => $sKey ) {
if (array_key_exists($sKey,$data)) {
if (array_key_exists($sKey,$data)) {
if ($data[$sKey]) {
$aFavourite[$data[$sKey]->getTargetId()]=$data[$sKey];
} else {
$aIdNotNeedQuery[]=$sValue;
}
}
}
}
}
/**
* Смотрим чего не было в кеше и делаем запрос в БД
*/
$aIdNeedQuery=array_diff($aTargetId,array_keys($aFavourite));
$aIdNeedQuery=array_diff($aIdNeedQuery,$aIdNotNeedQuery);
*/
$aIdNeedQuery=array_diff($aTargetId,array_keys($aFavourite));
$aIdNeedQuery=array_diff($aIdNeedQuery,$aIdNotNeedQuery);
$aIdNeedStore=$aIdNeedQuery;
if ($data = $this->oMapper->GetFavouritesByArray($aIdNeedQuery,$sTargetType,$sUserId)) {
foreach ($data as $oFavourite) {
@ -105,193 +113,191 @@ class ModuleFavourite extends Module {
*/
foreach ($aIdNeedStore as $sId) {
$this->Cache_Set(null, "favourite_{$sTargetType}_{$sId}_{$sUserId}", array(), 60*60*24*7);
}
}
/**
* Сортируем результат согласно входящему массиву
*/
$aFavourite=func_array_sort_by_keys($aFavourite,$aTargetId);
return $aFavourite;
return $aFavourite;
}
/**
* Получить список избранного по списку айдишников, но используя единый кеш
*
* @param array $aTargetId
* @param string $sTargetType
* @param string $sUserId
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouritesByArraySolid($aTargetId,$sTargetType,$sUserId) {
if (!is_array($aTargetId)) {
$aTargetId=array($aTargetId);
}
$aTargetId=array_unique($aTargetId);
$aFavourites=array();
$s=join(',',$aTargetId);
if (false === ($data = $this->Cache_Get("favourite_{$sTargetType}_{$sUserId}_id_{$s}"))) {
$aTargetId=array_unique($aTargetId);
$aFavourites=array();
$s=join(',',$aTargetId);
if (false === ($data = $this->Cache_Get("favourite_{$sTargetType}_{$sUserId}_id_{$s}"))) {
$data = $this->oMapper->GetFavouritesByArray($aTargetId,$sTargetType,$sUserId);
foreach ($data as $oFavourite) {
$aFavourites[$oFavourite->getTargetId()]=$oFavourite;
}
$this->Cache_Set($aFavourites, "favourite_{$sTargetType}_{$sUserId}_id_{$s}", array("favourite_{$sTargetType}_change_user_{$sUserId}"), 60*60*24*1);
return $aFavourites;
}
}
return $data;
}
/**
* Получает список таргеов из избранного
* Получает список таргетов из избранного
*
* @param string $sUserId
* @param string $sTargetType
* @param int $iCount
* @param int $iCurrPage
* @param int $iPerPage
* @param int $sUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @param array $aExcludeTarget Список ID владельцев для исклчения
* @return array
*/
public function GetFavouritesByUserId($sUserId,$sTargetType,$iCurrPage,$iPerPage,$aExcludeTarget=array()) {
public function GetFavouritesByUserId($sUserId,$sTargetType,$iCurrPage,$iPerPage,$aExcludeTarget=array()) {
$s=serialize($aExcludeTarget);
if (false === ($data = $this->Cache_Get("{$sTargetType}_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_{$s}"))) {
if (false === ($data = $this->Cache_Get("{$sTargetType}_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_{$s}"))) {
$data = array(
'collection' => $this->oMapper->GetFavouritesByUserId($sUserId,$sTargetType,$iCount,$iCurrPage,$iPerPage,$aExcludeTarget),
'count' => $iCount
);
$this->Cache_Set(
$data,
"{$sTargetType}_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_{$s}",
$data,
"{$sTargetType}_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_{$s}",
array(
"favourite_{$sTargetType}_change",
"favourite_{$sTargetType}_change_user_{$sUserId}"
),
),
60*60*24*1
);
}
}
return $data;
}
/**
* Возвращает число таргетов определенного типа в избранном по ID пользователя
*
* @param string $sUserId
* @param string $sTargetType
* @param int $sUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param array $aExcludeTarget Список ID владельцев для исклчения
* @return array
*/
public function GetCountFavouritesByUserId($sUserId,$sTargetType,$aExcludeTarget=array()) {
$s=serialize($aExcludeTarget);
if (false === ($data = $this->Cache_Get("{$sTargetType}_count_favourite_user_{$sUserId}_{$s}"))) {
if (false === ($data = $this->Cache_Get("{$sTargetType}_count_favourite_user_{$sUserId}_{$s}"))) {
$data = $this->oMapper->GetCountFavouritesByUserId($sUserId,$sTargetType,$aExcludeTarget);
$this->Cache_Set(
$data,
"{$sTargetType}_count_favourite_user_{$sUserId}_{$s}",
$data,
"{$sTargetType}_count_favourite_user_{$sUserId}_{$s}",
array(
"favourite_{$sTargetType}_change",
"favourite_{$sTargetType}_change_user_{$sUserId}"
),
),
60*60*24*1
);
}
return $data;
}
/**
* Получает список комментариев к записям открытых блогов
* Получает список комментариев к записям открытых блогов
* из избранного указанного пользователя
*
* @param string $sUserId
* @param int $iCurrPage
* @param int $iPerPage
* @param int $sUserId ID пользователя
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetFavouriteOpenCommentsByUserId($sUserId,$iCurrPage,$iPerPage) {
if (false === ($data = $this->Cache_Get("comment_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open"))) {
public function GetFavouriteOpenCommentsByUserId($sUserId,$iCurrPage,$iPerPage) {
if (false === ($data = $this->Cache_Get("comment_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open"))) {
$data = array(
'collection' => $this->oMapper->GetFavouriteOpenCommentsByUserId($sUserId,$iCount,$iCurrPage,$iPerPage),
'count' => $iCount
);
$this->Cache_Set(
$data,
"comment_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open",
$data,
"comment_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open",
array(
"favourite_comment_change",
"favourite_comment_change_user_{$sUserId}"
),
60*60*24*1
);
}
return $data;
}
/**
* Возвращает число комментариев к открытым блогам в избранном по ID пользователя
*
* @param string $sUserId
* @return array
*/
public function GetCountFavouriteOpenCommentsByUserId($sUserId) {
if (false === ($data = $this->Cache_Get("comment_count_favourite_user_{$sUserId}_open"))) {
$data = $this->oMapper->GetCountFavouriteOpenCommentsByUserId($sUserId);
$this->Cache_Set(
$data,
"comment_count_favourite_user_{$sUserId}_open",
array(
"favourite_comment_change",
"favourite_comment_change_user_{$sUserId}"
),
),
60*60*24*1
);
}
return $data;
}
}
/**
* Получает список топиков из открытых блогов
* из избранного указанного пользователя
* Возвращает число комментариев к открытым блогам в избранном по ID пользователя
*
* @param string $sUserId
* @param int $iCurrPage
* @param int $iPerPage
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouriteOpenTopicsByUserId($sUserId,$iCurrPage,$iPerPage) {
if (false === ($data = $this->Cache_Get("topic_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open"))) {
public function GetCountFavouriteOpenCommentsByUserId($sUserId) {
if (false === ($data = $this->Cache_Get("comment_count_favourite_user_{$sUserId}_open"))) {
$data = $this->oMapper->GetCountFavouriteOpenCommentsByUserId($sUserId);
$this->Cache_Set(
$data,
"comment_count_favourite_user_{$sUserId}_open",
array(
"favourite_comment_change",
"favourite_comment_change_user_{$sUserId}"
),
60*60*24*1
);
}
return $data;
}
/**
* Получает список топиков из открытых блогов
* из избранного указанного пользователя
*
* @param int $sUserId ID пользователя
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetFavouriteOpenTopicsByUserId($sUserId,$iCurrPage,$iPerPage) {
if (false === ($data = $this->Cache_Get("topic_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open"))) {
$data = array(
'collection' => $this->oMapper->GetFavouriteOpenTopicsByUserId($sUserId,$iCount,$iCurrPage,$iPerPage),
'count' => $iCount
);
$this->Cache_Set(
$data,
"topic_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open",
$data,
"topic_favourite_user_{$sUserId}_{$iCurrPage}_{$iPerPage}_open",
array(
"favourite_topic_change",
"favourite_topic_change_user_{$sUserId}"
),
60*60*24*1
);
}
return $data;
}
/**
* Возвращает число топиков в открытых блогах
* из избранного по ID пользователя
*
* @param string $sUserId
* @return array
*/
public function GetCountFavouriteOpenTopicsByUserId($sUserId) {
if (false === ($data = $this->Cache_Get("topic_count_favourite_user_{$sUserId}_open"))) {
$data = $this->oMapper->GetCountFavouriteOpenTopicsByUserId($sUserId);
$this->Cache_Set(
$data,
"topic_count_favourite_user_{$sUserId}_open",
array(
"favourite_topic_change",
"favourite_topic_change_user_{$sUserId}"
),
),
60*60*24*1
);
}
return $data;
}
}
/**
* Возвращает число топиков в открытых блогах из избранного по ID пользователя
*
* @param string $sUserId ID пользователя
* @return array
*/
public function GetCountFavouriteOpenTopicsByUserId($sUserId) {
if (false === ($data = $this->Cache_Get("topic_count_favourite_user_{$sUserId}_open"))) {
$data = $this->oMapper->GetCountFavouriteOpenTopicsByUserId($sUserId);
$this->Cache_Set(
$data,
"topic_count_favourite_user_{$sUserId}_open",
array(
"favourite_topic_change",
"favourite_topic_change_user_{$sUserId}"
),
60*60*24*1
);
}
return $data;
}
/**
* Добавляет таргет в избранное
*
* @param ModuleFavourite_EntityFavourite $oFavourite
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function AddFavourite(ModuleFavourite_EntityFavourite $oFavourite) {
@ -300,15 +306,15 @@ class ModuleFavourite extends Module {
}
$this->SetFavouriteTags($oFavourite);
//чистим зависимые кеши
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("favourite_{$oFavourite->getTargetType()}_change_user_{$oFavourite->getUserId()}"));
$this->Cache_Delete("favourite_{$oFavourite->getTargetType()}_{$oFavourite->getTargetId()}_{$oFavourite->getUserId()}");
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("favourite_{$oFavourite->getTargetType()}_change_user_{$oFavourite->getUserId()}"));
$this->Cache_Delete("favourite_{$oFavourite->getTargetType()}_{$oFavourite->getTargetId()}_{$oFavourite->getUserId()}");
return $this->oMapper->AddFavourite($oFavourite);
}
/**
* Обновляет запись об избранном
*
* @param ModuleFavourite_EntityFavourite $oFavourite
* @return mixed
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function UpdateFavourite(ModuleFavourite_EntityFavourite $oFavourite) {
if (!$oFavourite->getTags()) {
@ -322,7 +328,8 @@ class ModuleFavourite extends Module {
/**
* Устанавливает список тегов для избранного
*
* @param $oFavourite
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @param bool $bAddNew Добавлять новые теги или нет
*/
public function SetFavouriteTags($oFavourite,$bAddNew=true) {
/**
@ -358,7 +365,7 @@ class ModuleFavourite extends Module {
/**
* Удаляет таргет из избранного
*
* @param ModuleFavourite_EntityFavourite $oFavourite
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function DeleteFavourite(ModuleFavourite_EntityFavourite $oFavourite) {
@ -371,22 +378,22 @@ class ModuleFavourite extends Module {
/**
* Меняет параметры публикации у таргета
*
* @param string $sTargetId
* @param string $sTargetType
* @param string $iPublish
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $iPublish Флаг публикации
* @return bool
*/
public function SetFavouriteTargetPublish($aTargetId,$sTargetType,$iPublish) {
if(!is_array($aTargetId)) $aTargetId = array($aTargetId);
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("favourite_{$sTargetType}_change"));
return $this->oMapper->SetFavouriteTargetPublish($aTargetId,$sTargetType,$iPublish);
}
/**
* Удаляет избранное по списку идентификаторов таргетов
*
* @param array|int $aTargetId
* @param string $sTargetType
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteFavouriteByTargetId($aTargetId, $sTargetType) {
@ -396,14 +403,14 @@ class ModuleFavourite extends Module {
*/
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("favourite_{$sTargetType}_change"));
$this->DeleteTagByTarget($aTargetId,$sTargetType);
return $this->oMapper->DeleteFavouriteByTargetId($aTargetId,$sTargetType);
return $this->oMapper->DeleteFavouriteByTargetId($aTargetId,$sTargetType);
}
/**
* Удаление тегов по таргету
*
* @param $aTargetId
* @param $sTargetType
* @return mixed
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteTagByTarget($aTargetId,$sTargetType) {
return $this->oMapper->DeleteTagByTarget($aTargetId,$sTargetType);
@ -411,9 +418,9 @@ class ModuleFavourite extends Module {
/**
* Возвращает список тегов для объекта избранного
*
* @param $sTargetType
* @param $iTargetId
* @return bool | array
* @param string $sTargetType Тип владельца
* @param int $iTargetId ID владельца
* @return bool|array
*/
public function GetTagsTarget($sTargetType,$iTargetId) {
$sMethod = 'GetTagsTarget'.func_camelize($sTargetType);
@ -425,11 +432,11 @@ class ModuleFavourite extends Module {
/**
* Возвращает наиболее часто используемые теги
*
* @param $iUserId
* @param $sTargetType
* @param $bIsUser
* @param $iLimit
* @return mixed
* @param int $iUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param bool $bIsUser Возвращает все теги ли только пользовательские
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupTags($iUserId,$sTargetType,$bIsUser,$iLimit) {
return $this->oMapper->GetGroupTags($iUserId,$sTargetType,$bIsUser,$iLimit);
@ -437,10 +444,10 @@ class ModuleFavourite extends Module {
/**
* Возвращает список тегов по фильтру
*
* @param $aFilter
* @param $aOrder
* @param $iCurrPage
* @param $iPerPage
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetTags($aFilter,$aOrder,$iCurrPage,$iPerPage) {
@ -448,9 +455,10 @@ class ModuleFavourite extends Module {
}
/**
* Возвращает список тегов для топика, название метода формируется автоматически из GetTagsTarget()
* @see GetTagsTarget
*
* @param $iTargetId
* @return bool | array
* @param int $iTargetId ID владельца
* @return bool|array
*/
public function GetTagsTargetTopic($iTargetId) {
if ($oTopic=$this->Topic_GetTopicById($iTargetId)) {

View file

@ -15,38 +15,88 @@
---------------------------------------------------------
*/
class ModuleFavourite_EntityFavourite extends Entity
{
public function getTargetId() {
return $this->_getDataOne('target_id');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getTargetPublish() {
return $this->_getDataOne('target_publish');
}
public function getTargetType() {
return $this->_getDataOne('target_type');
}
/**
* Объект сущности избрнного
*
* @package modules.favourite
* @since 1.0
*/
class ModuleFavourite_EntityFavourite extends Entity {
/**
* Возвращает ID владельца
*
* @return int|null
*/
public function getTargetId() {
return $this->_getDataOne('target_id');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает флаг публикации владельца
*
* @return int|null
*/
public function getTargetPublish() {
return $this->_getDataOne('target_publish');
}
/**
* Возвращает тип владельца
*
* @return string|null
*/
public function getTargetType() {
return $this->_getDataOne('target_type');
}
/**
* Возващает список тегов
*
* @return array
*/
public function getTagsArray() {
if ($this->getTags()) {
return explode(',',$this->getTags());
}
return array();
}
/**
* Устанавливает ID владельца
*
* @param int $data
*/
public function setTargetId($data) {
$this->_aData['target_id']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setTargetPublish($data) {
$this->_aData['target_publish']=$data;
}
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
$this->_aData['target_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает статус публикации для владельца
*
* @param int $data
*/
public function setTargetPublish($data) {
$this->_aData['target_publish']=$data;
}
/**
* Устанавливает тип владельца
*
* @param string $data
*/
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
}
?>

View file

@ -15,6 +15,12 @@
---------------------------------------------------------
*/
/**
* Объект сущности тега для избранного
*
* @package modules.favourite
* @since 1.0
*/
class ModuleFavourite_EntityTag extends Entity {
}

View file

@ -15,15 +15,26 @@
---------------------------------------------------------
*/
class ModuleFavourite_MapperFavourite extends Mapper {
/**
* Объект маппера для работы с БД
*
* @package modules.favourite
* @since 1.0
*/
class ModuleFavourite_MapperFavourite extends Mapper {
/**
* Добавляет таргет в избранное
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function AddFavourite(ModuleFavourite_EntityFavourite $oFavourite) {
$sql = "
INSERT INTO ".Config::Get('db.table.favourite')."
( target_id, target_type, user_id, tags )
VALUES
(?d, ?, ?d, ?)
";
";
if ($this->oDb->query(
$sql,
$oFavourite->getTargetId(),
@ -32,10 +43,15 @@ class ModuleFavourite_MapperFavourite extends Mapper {
$oFavourite->getTags()
)===0) {
return true;
}
}
return false;
}
/**
* Обновляет запись об избранном
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function UpdateFavourite(ModuleFavourite_EntityFavourite $oFavourite) {
$sql = "
UPDATE ".Config::Get('db.table.favourite')."
@ -52,11 +68,18 @@ class ModuleFavourite_MapperFavourite extends Mapper {
}
return false;
}
/**
* Получить список избранного по списку айдишников
*
* @param array $aArrayId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouritesByArray($aArrayId,$sTargetType,$sUserId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
}
$sql = "SELECT *
FROM ".Config::Get('db.table.favourite')."
WHERE
@ -70,10 +93,15 @@ class ModuleFavourite_MapperFavourite extends Mapper {
foreach ($aRows as $aRow) {
$aFavourites[]=Engine::GetEntity('Favourite',$aRow);
}
}
}
return $aFavourites;
}
}
/**
* Удаляет таргет из избранного
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function DeleteFavourite(ModuleFavourite_EntityFavourite $oFavourite) {
$sql = "
DELETE FROM ".Config::Get('db.table.favourite')."
@ -83,7 +111,7 @@ class ModuleFavourite_MapperFavourite extends Mapper {
target_id = ?d
AND
target_type = ?
";
";
if ($this->oDb->query(
$sql,
$oFavourite->getUserId(),
@ -91,10 +119,15 @@ class ModuleFavourite_MapperFavourite extends Mapper {
$oFavourite->getTargetType()
)) {
return true;
}
}
return false;
}
/**
* Удаляет теги
*
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function DeleteTags($oFavourite) {
$sql = "
DELETE FROM ".Config::Get('db.table.favourite_tag')."
@ -115,7 +148,12 @@ class ModuleFavourite_MapperFavourite extends Mapper {
}
return false;
}
/**
* Добавляет тег
*
* @param ModuleFavourite_EntityTag $oTag Объект тега
* @return bool
*/
public function AddTag($oTag) {
$sql = "
INSERT INTO ".Config::Get('db.table.favourite_tag')."
@ -133,7 +171,14 @@ class ModuleFavourite_MapperFavourite extends Mapper {
}
return false;
}
/**
* Меняет параметры публикации у таргета
*
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $iPublish Флаг публикации
* @return bool
*/
public function SetFavouriteTargetPublish($aTargetId,$sTargetType,$iPublish) {
$sql = "
UPDATE ".Config::Get('db.table.favourite')."
@ -143,11 +188,21 @@ class ModuleFavourite_MapperFavourite extends Mapper {
target_id IN(?a)
AND
target_type = ?
";
return $this->oDb->query($sql,$iPublish,$aTargetId,$sTargetType);
}
public function GetFavouritesByUserId($sUserId,$sTargetType,&$iCount,$iCurrPage,$iPerPage,$aExcludeTarget=array()) {
";
return $this->oDb->query($sql,$iPublish,$aTargetId,$sTargetType);
}
/**
* Получает список таргетов из избранного
*
* @param int $sUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @param array $aExcludeTarget Список ID владельцев для исклчения
* @return array
*/
public function GetFavouritesByUserId($sUserId,$sTargetType,&$iCount,$iCurrPage,$iPerPage,$aExcludeTarget=array()) {
$sql = "
SELECT target_id
FROM ".Config::Get('db.table.favourite')."
@ -160,24 +215,31 @@ class ModuleFavourite_MapperFavourite extends Mapper {
{ AND target_id NOT IN (?a) }
ORDER BY target_id DESC
LIMIT ?d, ?d ";
$aFavourites=array();
$aFavourites=array();
if ($aRows=$this->oDb->selectPage(
$iCount,
$sql,
$sUserId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
($iCurrPage-1)*$iPerPage,
$iPerPage
$iCount,
$sql,
$sUserId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP),
($iCurrPage-1)*$iPerPage,
$iPerPage
)) {
foreach ($aRows as $aFavourite) {
$aFavourites[]=$aFavourite['target_id'];
}
}
}
}
return $aFavourites;
}
/**
* Возвращает число таргетов определенного типа в избранном по ID пользователя
*
* @param int $sUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param array $aExcludeTarget Список ID владельцев для исклчения
* @return array
*/
public function GetCountFavouritesByUserId($sUserId,$sTargetType,$aExcludeTarget) {
$sql = "SELECT
count(target_id) as count
@ -192,16 +254,25 @@ class ModuleFavourite_MapperFavourite extends Mapper {
{ AND target_id NOT IN (?a) }
;";
return ( $aRow=$this->oDb->selectRow(
$sql,$sUserId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP)
)
)
? $aRow['count']
: false;
}
public function GetFavouriteOpenCommentsByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) {
$sql,$sUserId,
$sTargetType,
(count($aExcludeTarget) ? $aExcludeTarget : DBSIMPLE_SKIP)
)
)
? $aRow['count']
: false;
}
/**
* Получает список комментариев к записям открытых блогов
* из избранного указанного пользователя
*
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetFavouriteOpenCommentsByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) {
$sql = "
SELECT f.target_id
FROM
@ -225,19 +296,24 @@ class ModuleFavourite_MapperFavourite extends Mapper {
b.blog_type IN ('open', 'personal')
ORDER BY target_id DESC
LIMIT ?d, ?d ";
$aFavourites=array();
$aFavourites=array();
if ($aRows=$this->oDb->selectPage(
$iCount, $sql, $sUserId,
($iCurrPage-1)*$iPerPage, $iPerPage
$iCount, $sql, $sUserId,
($iCurrPage-1)*$iPerPage, $iPerPage
)) {
foreach ($aRows as $aFavourite) {
$aFavourites[]=$aFavourite['target_id'];
}
}
}
}
return $aFavourites;
}
}
/**
* Возвращает число комментариев к открытым блогам в избранном по ID пользователя
*
* @param int $sUserId ID пользователя
* @return array
*/
public function GetCountFavouriteOpenCommentsByUserId($sUserId) {
$sql = "SELECT
count(f.target_id) as count
@ -260,13 +336,22 @@ class ModuleFavourite_MapperFavourite extends Mapper {
t.blog_id = b.blog_id
AND
b.blog_type IN ('open', 'personal')
;";
;";
return ( $aRow=$this->oDb->selectRow($sql,$sUserId) )
? $aRow['count']
: false;
? $aRow['count']
: false;
}
public function GetFavouriteOpenTopicsByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) {
/**
* Получает список топиков из открытых блогов
* из избранного указанного пользователя
*
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetFavouriteOpenTopicsByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) {
$sql = "
SELECT f.target_id
FROM
@ -287,19 +372,24 @@ class ModuleFavourite_MapperFavourite extends Mapper {
b.blog_type IN ('open', 'personal')
ORDER BY target_id DESC
LIMIT ?d, ?d ";
$aFavourites=array();
$aFavourites=array();
if ($aRows=$this->oDb->selectPage(
$iCount, $sql, $sUserId,
($iCurrPage-1)*$iPerPage, $iPerPage
$iCount, $sql, $sUserId,
($iCurrPage-1)*$iPerPage, $iPerPage
)) {
foreach ($aRows as $aFavourite) {
$aFavourites[]=$aFavourite['target_id'];
}
}
}
}
return $aFavourites;
}
}
/**
* Возвращает число топиков в открытых блогах из избранного по ID пользователя
*
* @param string $sUserId ID пользователя
* @return array
*/
public function GetCountFavouriteOpenTopicsByUserId($sUserId) {
$sql = "SELECT
count(f.target_id) as count
@ -319,25 +409,37 @@ class ModuleFavourite_MapperFavourite extends Mapper {
t.blog_id = b.blog_id
AND
b.blog_type IN ('open', 'personal')
;";
;";
return ( $aRow=$this->oDb->selectRow($sql,$sUserId) )
? $aRow['count']
: false;
}
? $aRow['count']
: false;
}
/**
* Удаляет избранное по списку идентификаторов таргетов
*
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteFavouriteByTargetId($aTargetId,$sTargetType) {
$sql = "
DELETE FROM ".Config::Get('db.table.favourite')."
WHERE
target_id IN(?a)
AND
target_type = ? ";
target_type = ? ";
if ($this->oDb->query($sql,$aTargetId,$sTargetType)) {
return true;
}
return false;
}
/**
* Удаление тегов по таргету
*
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteTagByTarget($aTargetId,$sTargetType) {
$sql = "
DELETE FROM ".Config::Get('db.table.favourite_tag')."
@ -351,7 +453,15 @@ class ModuleFavourite_MapperFavourite extends Mapper {
}
return false;
}
/**
* Возвращает наиболее часто используемые теги
*
* @param int $iUserId ID пользователя
* @param string $sTargetType Тип владельца
* @param bool $bIsUser Возвращает все теги ли только пользовательские
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupTags($iUserId,$sTargetType,$bIsUser,$iLimit) {
$sql = "SELECT
text,
@ -382,7 +492,16 @@ class ModuleFavourite_MapperFavourite extends Mapper {
}
return $aReturnSort;
}
/**
* Возвращает список тегов по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTags($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('target_id','user_id','is_user');
$sOrder='';

View file

@ -20,10 +20,22 @@
* Терминология:
* объект - который привязываем к гео-объекту
* гео-объект - географический объект(страна/регион/город)
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo extends Module {
/**
* Объект маппера
*
* @var ModuleGeo_MapperGeo
*/
protected $oMapper;
/**
* Объект текущего пользователя
*
* @var ModuleUser_EntityUser|null
*/
protected $oUserCurrent;
/**
* Список доступных типов объектов
@ -44,26 +56,28 @@ class ModuleGeo extends Module {
'region',
'city',
);
/**
* Инициализация
*
*/
public function Init() {
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
$this->oUserCurrent=$this->User_GetUserCurrent();
}
/**
* Возвращает список типов объектов для облаты
* Возвращает список типов объектов
*
* @return array
*/
public function GetTargetTypes() {
return $this->aTargetTypes;
}
/**
* Добавляет в разрешенные новый тип
* @param unknown_type $sTargetType
* @param string $sTargetType Тип владельца
* @param array $aParams Параметры
* @return bool
*/
public function AddTargetType($sTargetType,$aParams=array()) {
if (!array_key_exists($sTargetType,$this->aTargetTypes)) {
@ -72,32 +86,30 @@ class ModuleGeo extends Module {
}
return false;
}
/**
* Проверяет разрешен ли данный тип
*
* @param $sTargetType
* @param string $sTargetType Тип владельца
* @return bool
*/
public function IsAllowTargetType($sTargetType) {
return in_array($sTargetType,array_keys($this->aTargetTypes));
}
/**
* Проверяет разрешен ли данный гео-тип
*
* @param $sTargetType
* @param string $sGeoType Тип владельца
* @return bool
*/
public function IsAllowGeoType($sGeoType) {
return in_array($sGeoType,$this->aGeoTypes);
}
/**
* Проверка объекта
*
* @param string $sTargetType
* @param int $iTargetId
* @param string $sTargetType Тип владельца
* @param int $iTargetId ID владельца
* @return bool
*/
public function CheckTarget($sTargetType,$iTargetId) {
if (!$this->IsAllowTargetType($sTargetType)) {
@ -109,11 +121,10 @@ class ModuleGeo extends Module {
}
return false;
}
/**
* Проверка на возможность нескольких связей
*
* @param $sTargetType
* @param string $sTargetType Тип владельца
* @return bool
*/
public function IsAllowTargetMulti($sTargetType) {
@ -124,12 +135,11 @@ class ModuleGeo extends Module {
}
return false;
}
/**
* Добавляет связь объекта с гео-объектом в БД
*
* @param $oTarget
* @return ModuleGeo_EntityTarget | bool
* @param ModuleGeo_EntityTarget $oTarget Объект связи с владельцем
* @return ModuleGeo_EntityTarget|bool
*/
public function AddTarget($oTarget) {
if ($this->oMapper->AddTarget($oTarget)) {
@ -137,13 +147,12 @@ class ModuleGeo extends Module {
}
return false;
}
/**
* Создание связи
*
* @param $oGeoObject
* @param $sTargetType
* @param $iTargetId
* @param ModuleGeo_EntityGeo $oGeoObject
* @param string $sTargetType Тип владельца
* @param int $iTargetId ID владельца
* @return bool|ModuleGeo_EntityTarget
*/
public function CreateTarget($oGeoObject,$sTargetType,$iTargetId) {
@ -194,25 +203,23 @@ class ModuleGeo extends Module {
}
return $this->AddTarget($oTarget);
}
/**
* Возвращает список связей по фильтру
*
* @param $aFilter
* @param $iCurrPage
* @param $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetTargets($aFilter,$iCurrPage,$iPerPage) {
return array('collection'=>$this->oMapper->GetTargets($aFilter,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
}
/**
* Возвращает первый объект связи по объекту
*
* @param $sTargetType
* @param $iTargetId
* @return null
* @param string $sTargetType Тип владельца
* @param int $iTargetId ID владельца
* @return null|ModuleGeo_EntityTarget
*/
public function GetTargetByTarget($sTargetType,$iTargetId) {
$aTargets=$this->GetTargets(array('target_type'=>$sTargetType,'target_id'=>$iTargetId),1,1);
@ -224,8 +231,8 @@ class ModuleGeo extends Module {
/**
* Возвращает список связей для списка объектов одного типа.
*
* @param $sTargetType
* @param $aTargetId
* @param string $sTargetType Тип владельца
* @param array $aTargetId Список ID владельцев
* @return array В качестве ключей используется ID объекта, в качестве значений массив связей этого объекта
*/
public function GetTargetsByTargetArray($sTargetType,$aTargetId) {
@ -247,68 +254,63 @@ class ModuleGeo extends Module {
/**
* Удаляет связи по фильтру
*
* @param $aFilter
* @return mixed
* @param array $aFilter Фильтр
* @return bool|int
*/
public function DeleteTargets($aFilter) {
return $this->oMapper->DeleteTargets($aFilter);
}
/**
* Удаление всех связей объекта
*
* @param $sTargetType
* @param $iTargetId
* @return mixed
* @param string $sTargetType Тип владельца
* @param int $iTargetId ID владельца
* @return bool|int
*/
public function DeleteTargetsByTarget($sTargetType,$iTargetId) {
return $this->DeleteTargets(array('target_type'=>$sTargetType,'target_id'=>$iTargetId));
}
/**
* Возвращает список стран по фильтру
*
* @param $aFilter
* @param $aOrder
* @param $iCurrPage
* @param $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetCountries($aFilter,$aOrder,$iCurrPage,$iPerPage) {
return array('collection'=>$this->oMapper->GetCountries($aFilter,$aOrder,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
}
/**
* Возвращает список регионов по фильтру
*
* @param $aFilter
* @param $aOrder
* @param $iCurrPage
* @param $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetRegions($aFilter,$aOrder,$iCurrPage,$iPerPage) {
return array('collection'=>$this->oMapper->GetRegions($aFilter,$aOrder,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
}
/**
* Возвращает список городов по фильтру
*
* @param $aFilter
* @param $aOrder
* @param $iCurrPage
* @param $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetCities($aFilter,$aOrder,$iCurrPage,$iPerPage) {
return array('collection'=>$this->oMapper->GetCities($aFilter,$aOrder,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
}
/**
* Возвращает страну по ID
*
* @param $iId
* @return ModuleGeo_EntityCountry
* @param int $iId ID страны
* @return ModuleGeo_EntityCountry|null
*/
public function GetCountryById($iId) {
$aRes=$this->GetCountries(array('id'=>$iId),array(),1,1);
@ -317,12 +319,11 @@ class ModuleGeo extends Module {
}
return null;
}
/**
* Возвращает регион по ID
*
* @param $iId
* @return ModuleGeo_EntityRegion
* @param int $iId ID региона
* @return ModuleGeo_EntityRegion|null
*/
public function GetRegionById($iId) {
$aRes=$this->GetRegions(array('id'=>$iId),array(),1,1);
@ -331,12 +332,11 @@ class ModuleGeo extends Module {
}
return null;
}
/**
* Возвращает регион по ID
*
* @param $iId
* @return ModuleGeo_EntityCity
* @param int $iId ID города
* @return ModuleGeo_EntityCity|null
*/
public function GetCityById($iId) {
$aRes=$this->GetCities(array('id'=>$iId),array(),1,1);
@ -345,12 +345,12 @@ class ModuleGeo extends Module {
}
return null;
}
/**
* Возвращает гео-объект
*
* @param $sType
* @param $iId
* @param string $sType Тип гео-объекта
* @param int $iId ID гео-объекта
* @return ModuleGeo_EntityGeo|null
*/
public function GetGeoObject($sType,$iId) {
$sType=strtolower($sType);
@ -371,12 +371,11 @@ class ModuleGeo extends Module {
return null;
}
}
/**
* Возвращает первый гео-объект для объекта
*
* @param $sTargetType
* @param $iTargetId
* @param string $sTargetType Тип владельца
* @param int $iTargetId ID владельца
* @return ModuleGeo_EntityCity|ModuleGeo_EntityCountry|ModuleGeo_EntityRegion|null
*/
public function GetGeoObjectByTarget($sTargetType,$iTargetId) {
@ -387,34 +386,32 @@ class ModuleGeo extends Module {
}
return null;
}
/**
* Возвращает список стран сгруппированных по количеству использований в данном типе объектов
*
* @param $sTargetType
* @param $iLimit
* @return mixed
* @param string $sTargetType Тип владельца
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupCountriesByTargetType($sTargetType,$iLimit) {
return $this->oMapper->GetGroupCountriesByTargetType($sTargetType,$iLimit);
}
/**
* Возвращает список городов сгруппированных по количеству использований в данном типе объектов
*
* @param $sTargetType
* @param $iLimit
* @return mixed
* @param string $sTargetType Тип владельца
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupCitiesByTargetType($sTargetType,$iLimit) {
return $this->oMapper->GetGroupCitiesByTargetType($sTargetType,$iLimit);
}
/**
* Проверка объекта с типом "user"
* Название метода формируется автоматически
*
* @param int $iTargetId
* @param int $iTargetId ID пользователя
* @return bool
*/
public function CheckTargetUser($iTargetId) {
if ($oUser=$this->User_GetUserById($iTargetId)) {
@ -422,6 +419,5 @@ class ModuleGeo extends Module {
}
return false;
}
}
?>

View file

@ -15,7 +15,13 @@
---------------------------------------------------------
*/
/**
* Объект сущности города
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo_EntityCity extends ModuleGeo_EntityGeo {
}
?>

View file

@ -15,7 +15,13 @@
---------------------------------------------------------
*/
/**
* Объект сущности страны
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo_EntityCountry extends ModuleGeo_EntityGeo {
}
?>

View file

@ -15,6 +15,12 @@
---------------------------------------------------------
*/
/**
* Объект сущности гео-объекта
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo_EntityGeo extends Entity {
/**
@ -39,7 +45,6 @@ class ModuleGeo_EntityGeo extends Entity {
}
return $sName;
}
/**
* Возвращает тип гео-объекта
*
@ -55,7 +60,6 @@ class ModuleGeo_EntityGeo extends Entity {
}
return null;
}
/**
* Возвращает гео-объект страны
*
@ -74,7 +78,6 @@ class ModuleGeo_EntityGeo extends Entity {
}
return null;
}
/**
* Возвращает гео-объект региона
*
@ -93,7 +96,6 @@ class ModuleGeo_EntityGeo extends Entity {
}
return null;
}
/**
* Возвращает гео-объект города
*
@ -112,6 +114,5 @@ class ModuleGeo_EntityGeo extends Entity {
}
return null;
}
}
?>

View file

@ -15,7 +15,13 @@
---------------------------------------------------------
*/
/**
* Объект сущности региона
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo_EntityRegion extends ModuleGeo_EntityGeo {
}
?>

View file

@ -15,6 +15,12 @@
---------------------------------------------------------
*/
/**
* Объект связи гео-объекта с владельцем
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo_EntityTarget extends Entity {
}

View file

@ -15,16 +15,35 @@
---------------------------------------------------------
*/
/**
* Объект маппера для работы с БД
*
* @package modules.geo
* @since 1.0
*/
class ModuleGeo_MapperGeo extends Mapper {
/**
* Добавляет связь объекта с гео-объектом в БД
*
* @param ModuleGeo_EntityTarget $oTarget Объект связи с владельцем
* @return ModuleGeo_EntityTarget|bool
*/
public function AddTarget($oTarget) {
$sql = "INSERT INTO ".Config::Get('db.table.geo_target')." SET ?a ";
if ($this->oDb->query($sql,$oTarget->_getData())) {
return true;
}
}
return false;
}
/**
* Возвращает список связей по фильтру
*
* @param array $aFilter Фильтр
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTargets($aFilter,&$iCount,$iCurrPage,$iPerPage) {
if (isset($aFilter['target_id']) and !is_array($aFilter['target_id'])) {
$aFilter['target_id']=array($aFilter['target_id']);
@ -64,7 +83,13 @@ class ModuleGeo_MapperGeo extends Mapper {
}
return $aResult;
}
/**
* Возвращает список стран сгруппированных по количеству использований в данном типе объектов
*
* @param string $sTargetType Тип владельца
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupCountriesByTargetType($sTargetType,$iLimit) {
$sql = "
SELECT
@ -90,7 +115,13 @@ class ModuleGeo_MapperGeo extends Mapper {
}
return $aResult;
}
/**
* Возвращает список городов сгруппированных по количеству использований в данном типе объектов
*
* @param string $sTargetType Тип владельца
* @param int $iLimit Количество элементов
* @return array
*/
public function GetGroupCitiesByTargetType($sTargetType,$iLimit) {
$sql = "
SELECT
@ -116,7 +147,12 @@ class ModuleGeo_MapperGeo extends Mapper {
}
return $aResult;
}
/**
* Удаляет связи по фильтру
*
* @param array $aFilter Фильтр
* @return bool|int
*/
public function DeleteTargets($aFilter) {
if (!$aFilter) {
return false;
@ -144,7 +180,16 @@ class ModuleGeo_MapperGeo extends Mapper {
isset($aFilter['city_id']) ? $aFilter['city_id'] : DBSIMPLE_SKIP
);
}
/**
* Возвращает список стран по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetCountries($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('id','name_ru','name_en','sort');
$sOrder='';
@ -192,7 +237,16 @@ class ModuleGeo_MapperGeo extends Mapper {
}
return $aResult;
}
/**
* Возвращает список стран по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetRegions($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('id','name_ru','name_en','sort','country_id');
$sOrder='';
@ -244,7 +298,16 @@ class ModuleGeo_MapperGeo extends Mapper {
}
return $aResult;
}
/**
* Возвращает список стран по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetCities($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('id','name_ru','name_en','sort','country_id','region_id');
$sOrder='';

View file

@ -18,6 +18,8 @@
/**
* Модуль рассылок уведомлений пользователям
*
* @package modules.notify
* @since 1.0
*/
class ModuleNotify extends Module {
/**
@ -32,598 +34,328 @@ class ModuleNotify extends Module {
protected $oViewerLocal=null;
/**
* Массив заданий на удаленную публикацию
*
*
* @var array
*/
protected $aTask=array();
/**
* Меппер
* Объект маппера
*
* @var Mapper_Notify
* @var ModuleNotify_MapperNotify
*/
protected $oMapper=null;
/**
* Инициализация модуля
* Создаём локальный экземпляр модуля Viewer
* Момент довольно спорный, но позволяет избавить основной шаблон от мусора уведомлений
*
*/
public function Init() {
if (!class_exists('ModuleViewer')) {
require_once(Config::Get('path.root.engine')."/modules/viewer/Viewer.class.php");
}
public function Init() {
$this->oViewerLocal=$this->Viewer_GetLocalViewer();
$this->oMapper=Engine::GetMapper(__CLASS__);
}
/**
* Отправляет юзеру уведомление о новом комментарии в его топике
*
* @param ModuleUser_EntityUser $oUserTo
* @param ModuleTopic_EntityTopic $oTopic
* @param CommentEntity_TopicComment $oComment
* @param ModuleUser_EntityUser $oUserComment
* @param ModuleUser_EntityUser $oUserTo Объект пользователя кому отправляем
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @param ModuleComment_EntityComment $oComment Объект комментария
* @param ModuleUser_EntityUser $oUserComment Объект пользователя, написавшего комментарий
* @return bool
*/
public function SendCommentNewToAuthorTopic(ModuleUser_EntityUser $oUserTo, ModuleTopic_EntityTopic $oTopic, ModuleComment_EntityComment $oComment, ModuleUser_EntityUser $oUserComment) {
/**
* Проверяем можно ли юзеру рассылать уведомление
*/
if (!$oUserTo->getSettingsNoticeNewComment()) {
return ;
return false;
}
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oTopic',$oTopic);
$this->oViewerLocal->Assign('oComment',$oComment);
$this->oViewerLocal->Assign('oUserComment',$oUserComment);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.comment_new.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_comment_new'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_comment_new'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
}
$this->Send(
$oUserTo,
'notify.comment_new.tpl',
$this->Lang_Get('notify_subject_comment_new'),
array(
'oUserTo' => $oUserTo,
'oTopic' => $oTopic,
'oComment' => $oComment,
'oUserComment' => $oUserComment,
)
);
return true;
}
/**
* Отправляет юзеру уведомление об ответе на его комментарий
*
* @param ModuleUser_EntityUser $oUserTo
* @param ModuleTopic_EntityTopic $oTopic
* @param CommentEntity_TopicComment $oComment
* @param ModuleUser_EntityUser $oUserComment
* @param ModuleUser_EntityUser $oUserTo Объект пользователя кому отправляем
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @param ModuleComment_EntityComment $oComment Объект комментария
* @param ModuleUser_EntityUser $oUserComment Объект пользователя, написавшего комментарий
* @return bool
*/
public function SendCommentReplyToAuthorParentComment(ModuleUser_EntityUser $oUserTo, ModuleTopic_EntityTopic $oTopic, ModuleComment_EntityComment $oComment, ModuleUser_EntityUser $oUserComment) {
/**
* Проверяем можно ли юзеру рассылать уведомление
*/
if (!$oUserTo->getSettingsNoticeReplyComment()) {
return ;
}
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oTopic',$oTopic);
$this->oViewerLocal->Assign('oComment',$oComment);
$this->oViewerLocal->Assign('oUserComment',$oUserComment);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.comment_reply.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_comment_reply'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_comment_reply'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
return false;
}
$this->Send(
$oUserTo,
'notify.comment_reply.tpl',
$this->Lang_Get('notify_subject_comment_reply'),
array(
'oUserTo' => $oUserTo,
'oTopic' => $oTopic,
'oComment' => $oComment,
'oUserComment' => $oUserComment,
)
);
return true;
}
/**
* Отправляет юзеру уведомление о новом топике в блоге, в котором он состоит
*
* @param ModuleUser_EntityUser $oUserTo
* @param ModuleTopic_EntityTopic $oTopic
* @param ModuleBlog_EntityBlog $oBlog
* @param ModuleUser_EntityUser $oUserTopic
* @param ModuleUser_EntityUser $oUserTo Объект пользователя кому отправляем
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @param ModuleBlog_EntityBlog $oBlog Объект блога
* @param ModuleUser_EntityUser $oUserTopic Объект пользователя, написавшего топик
* @return bool
*/
public function SendTopicNewToSubscribeBlog(ModuleUser_EntityUser $oUserTo, ModuleTopic_EntityTopic $oTopic, ModuleBlog_EntityBlog $oBlog, ModuleUser_EntityUser $oUserTopic) {
/**
* Проверяем можно ли юзеру рассылать уведомление
*/
if (!$oUserTo->getSettingsNoticeNewTopic()) {
return ;
}
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oTopic',$oTopic);
$this->oViewerLocal->Assign('oBlog',$oBlog);
$this->oViewerLocal->Assign('oUserTopic',$oUserTopic);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.topic_new.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_topic_new').' «'.htmlspecialchars($oBlog->getTitle()).'»',
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_topic_new').' «'.htmlspecialchars($oBlog->getTitle()).'»');
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
return false;
}
$this->Send(
$oUserTo,
'notify.topic_new.tpl',
$this->Lang_Get('notify_subject_topic_new').' «'.htmlspecialchars($oBlog->getTitle()).'»',
array(
'oUserTo' => $oUserTo,
'oTopic' => $oTopic,
'oBlog' => $oBlog,
'oUserTopic' => $oUserTopic,
)
);
return true;
}
/**
* Отправляет уведомление с новым линком активации
*
* @param ModuleUser_EntityUser $oUser Объект пользователя
*/
public function SendReactivationCode(ModuleUser_EntityUser $oUser) {
$this->Send(
$oUser,
'notify.reactivation.tpl',
$this->Lang_Get('notify_subject_reactvation'),
array(
'oUser' => $oUser,
)
);
}
/**
* Отправляет уведомление при регистрации с активацией
*
* @param ModuleUser_EntityUser $oUser
* @param string $sPassword
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param string $sPassword Пароль пользователя
*/
public function SendRegistrationActivate(ModuleUser_EntityUser $oUser,$sPassword) {
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUser',$oUser);
$this->oViewerLocal->Assign('sPassword',$sPassword);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.registration_activate.tpl'));
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUser->getMail(),$oUser->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_registration_activate'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
public function SendRegistrationActivate(ModuleUser_EntityUser $oUser,$sPassword) {
$this->Send(
$oUser,
'notify.registration_activate.tpl',
$this->Lang_Get('notify_subject_registration_activate'),
array(
'oUser' => $oUser,
'sPassword' => $sPassword,
)
);
}
/**
* Отправляет уведомление о регистрации
*
* @param ModuleUser_EntityUser $oUser
* @param string $sPassword
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param string $sPassword Пароль пользователя
*/
public function SendRegistration(ModuleUser_EntityUser $oUser,$sPassword) {
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUser',$oUser);
$this->oViewerLocal->Assign('sPassword',$sPassword);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.registration.tpl'));
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUser->getMail(),$oUser->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_registration'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
public function SendRegistration(ModuleUser_EntityUser $oUser,$sPassword) {
$this->Send(
$oUser,
'notify.registration.tpl',
$this->Lang_Get('notify_subject_registration'),
array(
'oUser' => $oUser,
'sPassword' => $sPassword,
)
);
}
/**
* Отправляет инвайт
*
* @param ModuleUser_EntityUser $oUserFrom
* @param string $sMailTo
* @param ModuleUser_EntityInvite $oInvite
* @param ModuleUser_EntityUser $oUserFrom Пароль пользователя, который отправляет инвайт
* @param string $sMailTo Емайл на который отправляем инвайт
* @param ModuleUser_EntityInvite $oInvite Объект инвайта
*/
public function SendInvite(ModuleUser_EntityUser $oUserFrom,$sMailTo,ModuleUser_EntityInvite $oInvite) {
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserFrom',$oUserFrom);
$this->oViewerLocal->Assign('sMailTo',$sMailTo);
$this->oViewerLocal->Assign('oInvite',$oInvite);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch('notify/'.$this->Lang_GetLang()."/notify.invite.tpl");
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $sMailTo,
'user_login' => null,
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_invite'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($sMailTo);
$this->Mail_SetSubject($this->Lang_Get('notify_subject_invite'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
}
public function SendInvite(ModuleUser_EntityUser $oUserFrom,$sMailTo,ModuleUser_EntityInvite $oInvite) {
$this->Send(
$sMailTo,
'notify.invite.tpl',
$this->Lang_Get('notify_subject_invite'),
array(
'sMailTo' => $sMailTo,
'oUserFrom' => $oUserFrom,
'oInvite' => $oInvite,
)
);
}
/**
* Отправляет уведомление при новом личном сообщении
*
* @param ModuleUser_EntityUser $oUserTo
* @param ModuleUser_EntityUser $oUserFrom
* @param ModuleTalk_EntityTalk $oTalk
* @param ModuleUser_EntityUser $oUserTo Объект пользователя, которому отправляем сообщение
* @param ModuleUser_EntityUser $oUserFrom Объект пользователя, который отправляет сообщение
* @param ModuleTalk_EntityTalk $oTalk Объект сообщения
* @return bool
*/
public function SendTalkNew(ModuleUser_EntityUser $oUserTo,ModuleUser_EntityUser $oUserFrom,ModuleTalk_EntityTalk $oTalk) {
/**
* Проверяем можно ли юзеру рассылать уведомление
*/
if (!$oUserTo->getSettingsNoticeNewTalk()) {
return ;
}
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oUserFrom',$oUserFrom);
$this->oViewerLocal->Assign('oTalk',$oTalk);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.talk_new.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_talk_new'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_talk_new'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
return false;
}
$this->Send(
$oUserTo,
'notify.talk_new.tpl',
$this->Lang_Get('notify_subject_talk_new'),
array(
'oUserTo' => $oUserTo,
'oUserFrom' => $oUserFrom,
'oTalk' => $oTalk,
)
);
return true;
}
/**
* Отправляет уведомление о новом сообщение в личке
*
* @param ModuleUser_EntityUser $oUserTo Объект пользователя, которому отправляем уведомление
* @param ModuleUser_EntityUser $oUserFrom Объект пользователя, которыф написал комментарий
* @param ModuleTalk_EntityTalk $oTalk Объект сообщения
* @param ModuleComment_EntityComment $oTalkComment Объект комментария
* @return bool
*/
public function SendTalkCommentNew(ModuleUser_EntityUser $oUserTo,ModuleUser_EntityUser $oUserFrom,ModuleTalk_EntityTalk $oTalk,ModuleComment_EntityComment $oTalkComment) {
/**
* Проверяем можно ли юзеру рассылать уведомление
*/
if (!$oUserTo->getSettingsNoticeNewTalk()) {
return ;
}
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oUserFrom',$oUserFrom);
$this->oViewerLocal->Assign('oTalk',$oTalk);
$this->oViewerLocal->Assign('oTalkComment',$oTalkComment);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.talk_comment_new.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_talk_comment_new'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_talk_comment_new'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
return false;
}
$this->Send(
$oUserTo,
'notify.talk_comment_new.tpl',
$this->Lang_Get('notify_subject_talk_comment_new'),
array(
'oUserTo' => $oUserTo,
'oUserFrom' => $oUserFrom,
'oTalk' => $oTalk,
'oTalkComment' => $oTalkComment,
)
);
return true;
}
/**
* Отправляет пользователю сообщение о добавлении его в друзья
*
* @param ModuleUser_EntityUser $oUserTo
* @param ModuleUser_EntityUser $oUserFrom
* @param ModuleUser_EntityUser $oUserTo Объект пользователя
* @param ModuleUser_EntityUser $oUserFrom Объект пользователя, которого добавляем в друзья
* @param string $sText Текст сообщения
* @param string $sPath URL для подтверждения дружбы
* @return bool
*/
public function SendUserFriendNew(ModuleUser_EntityUser $oUserTo,ModuleUser_EntityUser $oUserFrom, $sText,$sPath) {
public function SendUserFriendNew(ModuleUser_EntityUser $oUserTo,ModuleUser_EntityUser $oUserFrom, $sText,$sPath) {
/**
* Проверяем можно ли юзеру рассылать уведомление
*/
if (!$oUserTo->getSettingsNoticeNewFriend()) {
return ;
}
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oUserFrom',$oUserFrom);
$this->oViewerLocal->Assign('sText',$sText);
$this->oViewerLocal->Assign('sPath',$sPath);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.user_friend_new.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_user_friend_new'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_user_friend_new'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
return false;
}
$this->Send(
$oUserTo,
'notify.user_friend_new.tpl',
$this->Lang_Get('notify_subject_user_friend_new'),
array(
'oUserTo' => $oUserTo,
'oUserFrom' => $oUserFrom,
'sText' => $sText,
'sPath' => $sPath,
)
);
return true;
}
/**
* Отправляет пользователю сообщение о приглашение его в закрытый блог
*
* @param ModuleUser_EntityUser $oUserTo
* @param ModuleUser_EntityUser $oUserFrom
* @param ModuleUser_EntityUser $oUserTo Объект пользователя, который отправляет приглашение
* @param ModuleUser_EntityUser $oUserFrom Объект пользователя, которого приглашаем
* @param ModuleBlog_EntityBlog $oBlog Объект блога
* @param $sPath
*/
public function SendBlogUserInvite(ModuleUser_EntityUser $oUserTo,ModuleUser_EntityUser $oUserFrom, ModuleBlog_EntityBlog $oBlog,$sPath) {
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUserTo',$oUserTo);
$this->oViewerLocal->Assign('oUserFrom',$oUserFrom);
$this->oViewerLocal->Assign('oBlog',$oBlog);
$this->oViewerLocal->Assign('sPath',$sPath);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.blog_invite_new.tpl'));
/**
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
array(
'user_mail' => $oUserTo->getMail(),
'user_login' => $oUserTo->getLogin(),
'notify_text' => $sBody,
'notify_subject' => $this->Lang_Get('notify_subject_blog_invite_new'),
'date_created' => date("Y-m-d H:i:s"),
'notify_task_status' => self::NOTIFY_TASK_STATUS_NULL,
)
);
if(Config::Get('module.notify.insert_single')) {
$this->aTask[] = $oNotifyTask;
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUserTo->getMail(),$oUserTo->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_blog_invite_new'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
}
}
public function SendBlogUserInvite(ModuleUser_EntityUser $oUserTo,ModuleUser_EntityUser $oUserFrom, ModuleBlog_EntityBlog $oBlog,$sPath) {
$this->Send(
$oUserTo,
'notify.blog_invite_new.tpl',
$this->Lang_Get('notify_subject_blog_invite_new'),
array(
'oUserTo' => $oUserTo,
'oUserFrom' => $oUserFrom,
'oBlog' => $oBlog,
'sPath' => $sPath,
)
);
}
/**
* Уведомление при восстановлении пароля
*
* @param ModuleUser_EntityUser $oUser
* @param ModuleUser_EntityReminder $oReminder
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param ModuleUser_EntityReminder $oReminder объект напоминания пароля
*/
public function SendReminderCode(ModuleUser_EntityUser $oUser,ModuleUser_EntityReminder $oReminder) {
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUser',$oUser);
$this->oViewerLocal->Assign('oReminder',$oReminder);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.reminder_code.tpl'));
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUser->getMail(),$oUser->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_reminder_code'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
public function SendReminderCode(ModuleUser_EntityUser $oUser,ModuleUser_EntityReminder $oReminder) {
$this->Send(
$oUser,
'notify.reminder_code.tpl',
$this->Lang_Get('notify_subject_reminder_code'),
array(
'oUser' => $oUser,
'oReminder' => $oReminder,
)
);
}
/**
* Уведомление с новым паролем после его восставновления
*
* @param ModuleUser_EntityUser $oUser
* @param unknown_type $sNewPassword
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param string $sNewPassword Новый пароль
*/
public function SendReminderPassword(ModuleUser_EntityUser $oUser,$sNewPassword) {
/**
* Передаём в шаблон переменные
*/
$this->oViewerLocal->Assign('oUser',$oUser);
$this->oViewerLocal->Assign('sNewPassword',$sNewPassword);
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath('notify.reminder_password.tpl'));
/**
* Отправляем мыло
*/
$this->Mail_SetAdress($oUser->getMail(),$oUser->getLogin());
$this->Mail_SetSubject($this->Lang_Get('notify_subject_reminder_password'));
$this->Mail_SetBody($sBody);
$this->Mail_setHTML();
$this->Mail_Send();
public function SendReminderPassword(ModuleUser_EntityUser $oUser,$sNewPassword) {
$this->Send(
$oUser,
'notify.reminder_password.tpl',
$this->Lang_Get('notify_subject_reminder_password'),
array(
'oUser' => $oUser,
'sNewPassword' => $sNewPassword,
)
);
}
/**
* Уведомление при ответе на сообщение на стене
*
* @param ModuleWall_EntityWall $oWallParent
* @param ModuleWall_EntityWall $oWall
* @param ModuleUser_EntityUser $oUserWall
* @param ModuleWall_EntityWall $oWallParent Объект сообщения на стене, на которое отвечаем
* @param ModuleWall_EntityWall $oWall Объект нового сообщения на стене
* @param ModuleUser_EntityUser $oUser Объект пользователя
*/
public function SendWallReply(ModuleWall_EntityWall $oWallParent, ModuleWall_EntityWall $oWall, ModuleUser_EntityUser $oUser) {
$this->Send(
@ -639,12 +371,11 @@ class ModuleNotify extends Module {
)
);
}
/**
* Уведомление о новом сообщение на стене
*
* @param ModuleWall_EntityWall $oWall
* @param ModuleUser_EntityUser $oUser
* @param ModuleWall_EntityWall $oWall Объект нового сообщения на стене
* @param ModuleUser_EntityUser $oUser Объект пользователя
*/
public function SendWallNew(ModuleWall_EntityWall $oWall, ModuleUser_EntityUser $oUser) {
$this->Send(
@ -659,17 +390,16 @@ class ModuleNotify extends Module {
)
);
}
/**
* Универсальный метод отправки уведомлений на email
*
* @param ModuleUser_EntityUser | string $oUserTo - кому отправляем (пользователь или email)
* @param unknown_type $sTemplate - шаблон для отправки
* @param unknown_type $sSubject - тема письма
* @param unknown_type $aAssign - ассоциативный массив для загрузки переменных в шаблон письма
* @param unknown_type $sPluginName - плагин из которого происходит отправка
* @param ModuleUser_EntityUser|string $oUserTo Кому отправляем (пользователь или email)
* @param string $sTemplate Шаблон для отправки
* @param string $sSubject Тема письма
* @param array $aAssign Ассоциативный массив для загрузки переменных в шаблон письма
* @param string|null $sPluginName Плагин из которого происходит отправка
*/
public function Send($oUserTo,$sTemplate,$sSubject,$aAssign=array(),$sPluginName=null) {
public function Send($oUserTo,$sTemplate,$sSubject,$aAssign=array(),$sPluginName=null) {
if ($oUserTo instanceof ModuleUser_EntityUser) {
$sMail=$oUserTo->getMail();
$sName=$oUserTo->getLogin();
@ -682,19 +412,19 @@ class ModuleNotify extends Module {
*/
foreach ($aAssign as $k=>$v) {
$this->oViewerLocal->Assign($k,$v);
}
}
/**
* Формируем шаблон
*/
$sBody=$this->oViewerLocal->Fetch($this->GetTemplatePath($sTemplate,$sPluginName));
/**
* Если в конфигураторе указан отложенный метод отправки,
* Если в конфигураторе указан отложенный метод отправки,
* то добавляем задание в массив. В противном случае,
* сразу отсылаем на email
*/
if(Config::Get('module.notify.delayed')) {
$oNotifyTask=Engine::GetEntity(
'Notify_Task',
'Notify_Task',
array(
'user_mail' => $sMail,
'user_login' => $sName,
@ -709,7 +439,7 @@ class ModuleNotify extends Module {
} else {
$this->oMapper->AddTask($oNotifyTask);
}
} else {
} else {
/**
* Отправляем мыло
*/
@ -720,25 +450,21 @@ class ModuleNotify extends Module {
$this->Mail_Send();
}
}
/**
* При завершении работы модуля проверяем наличие
* При завершении работы модуля проверяем наличие
* отложенных заданий в массиве и при необходимости
* передаем их в меппер
*/
*/
public function Shutdown() {
if(!empty($this->aTask) && Config::Get('module.notify.delayed')) {
$this->oMapper->AddTaskArray($this->aTask);
$this->aTask=array();
}
}
/**
* Получает массив заданий на публикацию из базы
* с указанным количественным ограничением (выборка FIFO)
* Получает массив заданий на публикацию из базы с указанным количественным ограничением (выборка FIFO)
*
* @param int $iLimit
* @param int $iLimit Количество
* @return array
*/
public function GetTasksDelayed($iLimit=10) {
@ -747,9 +473,9 @@ class ModuleNotify extends Module {
: array();
}
/**
* Отправляет на e-mail
* Отправляет на e-mail
*
* @param ModuleNotify_EntityTask $oTask
* @param ModuleNotify_EntityTask $oTask Объект задания на отправку
*/
public function SendTask($oTask) {
$this->Mail_SetAdress($oTask->getUserMail(),$oTask->getUserLogin());
@ -761,7 +487,7 @@ class ModuleNotify extends Module {
/**
* Удаляет отложенное Notify-задание из базы
*
* @param ModuleNotify_EntityTask $oTask
* @param ModuleNotify_EntityTask $oTask Объект задания на отправку
* @return bool
*/
public function DeleteTask($oTask) {
@ -770,26 +496,25 @@ class ModuleNotify extends Module {
/**
* Удаляет отложенные Notify-задания по списку идентификаторов
*
* @param array $aArrayId
* @return bool
* @param array $aArrayId Список ID заданий на отправку
* @return bool
*/
public function DeleteTaskByArrayId($aArrayId) {
return $this->oMapper->DeleteTaskByArrayId($aArrayId);
}
/**
* Возвращает путь к шаблону по переданному имени
*
* @param string $sName
* @param string $sPluginName
* @param string $sName Название шаблона
* @param string $sPluginName Название или класс плагина
* @return string
*/
public function GetTemplatePath($sName,$sPluginName=null) {
public function GetTemplatePath($sName,$sPluginName=null) {
if ($sPluginName) {
$sPluginName = preg_match('/^Plugin([\w]+)(_[\w]+)?$/Ui',$sPluginName,$aMatches)
? strtolower($aMatches[1])
: strtolower($sPluginName);
? strtolower($aMatches[1])
: strtolower($sPluginName);
$sLangDir=Plugin::GetTemplatePath($sPluginName).'notify/'.$this->Lang_GetLang();
if(is_dir($sLangDir)) {
return $sLangDir.'/'.$sName;
@ -798,9 +523,9 @@ class ModuleNotify extends Module {
} else {
$sLangDir = 'notify/'.$this->Lang_GetLang();
/**
* Если директория с сообщениями на текущем языке отсутствует,
* используем язык по умолчанию
*/
* Если директория с сообщениями на текущем языке отсутствует,
* используем язык по умолчанию
*/
if(is_dir(rtrim(Config::Get('path.smarty.template'),'/').'/'.$sLangDir)) {
return $sLangDir.'/'.$sName;
}

View file

@ -15,51 +15,126 @@
---------------------------------------------------------
*/
class ModuleNotify_EntityTask extends Entity
{
public function getTaskId() {
return $this->_getDataOne('notify_task_id');
}
public function getUserMail() {
return $this->_getDataOne('user_mail');
}
public function getUserLogin() {
return $this->_getDataOne('user_login');
}
public function getNotifyText() {
return $this->_getDataOne('notify_text');
}
public function getDateCreated() {
return $this->_getDataOne('date_created');
}
public function getTaskStatus() {
return $this->_getDataOne('notify_task_status');
}
public function getNotifySubject() {
return $this->_getDataOne('notify_subject');
}
public function setTaskId($data) {
$this->_aData['notify_task_id']=$data;
}
public function setUserMail($data) {
$this->_aData['user_mail']=$data;
}
public function setUserLogin($data) {
$this->_aData['user_login']=$data;
}
public function setNotifyText($data) {
$this->_aData['notify_text']=$data;
}
public function setDateCreated($data) {
$this->_aData['date_created']=$data;
}
public function setTaskStatus($data) {
$this->_aData['notify_task_status']=$data;
}
public function setNotifySubject($data) {
$this->_aData['notify_subject']=$data;
}
/**
* Объект сущности задания на отправку емайла
*
* @package modules.notify
* @since 1.0
*/
class ModuleNotify_EntityTask extends Entity {
/**
* Возвращает ID задания
*
* @return int|null
*/
public function getTaskId() {
return $this->_getDataOne('notify_task_id');
}
/**
* Возвращает емайл
*
* @return string|null
*/
public function getUserMail() {
return $this->_getDataOne('user_mail');
}
/**
* Возвращает логин пользователя
*
* @return string|null
*/
public function getUserLogin() {
return $this->_getDataOne('user_login');
}
/**
* Возвращает текст сообщения
*
* @return string|null
*/
public function getNotifyText() {
return $this->_getDataOne('notify_text');
}
/**
* Возвращает дату создания сообщения
*
* @return string|null
*/
public function getDateCreated() {
return $this->_getDataOne('date_created');
}
/**
* Возвращает статус отправки
*
* @return int|null
*/
public function getTaskStatus() {
return $this->_getDataOne('notify_task_status');
}
/**
* Возвращает тему сообщения
*
* @return string|null
*/
public function getNotifySubject() {
return $this->_getDataOne('notify_subject');
}
/**
* Устанавливает ID задания
*
* @param int $data
*/
public function setTaskId($data) {
$this->_aData['notify_task_id']=$data;
}
/**
* Устанавливает емайл
*
* @param string $data
*/
public function setUserMail($data) {
$this->_aData['user_mail']=$data;
}
/**
* Устанавливает логин
*
* @param string $data
*/
public function setUserLogin($data) {
$this->_aData['user_login']=$data;
}
/**
* Устанавливает текст уведомления
*
* @param string $data
*/
public function setNotifyText($data) {
$this->_aData['notify_text']=$data;
}
/**
* Устанавливает дату создания задания
*
* @param string $data
*/
public function setDateCreated($data) {
$this->_aData['date_created']=$data;
}
/**
* Устанавливает статус задания
*
* @param int $data
*/
public function setTaskStatus($data) {
$this->_aData['notify_task_status']=$data;
}
/**
* Устанавливает тему сообщения
*
* @param string $data
*/
public function setNotifySubject($data) {
$this->_aData['notify_subject']=$data;
}
}
?>

View file

@ -15,8 +15,19 @@
---------------------------------------------------------
*/
class ModuleNotify_MapperNotify extends Mapper {
/**
* Маппер для работы с БД
*
* @package modules.notify
* @since 1.0
*/
class ModuleNotify_MapperNotify extends Mapper {
/**
* Добавляет задание
*
* @param ModuleNotify_EntityTask $oNotifyTask Объект задания
* @return bool
*/
public function AddTask(ModuleNotify_EntityTask $oNotifyTask) {
$sql = "
INSERT INTO ".Config::Get('db.table.notify_task')."
@ -24,7 +35,7 @@ class ModuleNotify_MapperNotify extends Mapper {
VALUES
( ?, ?, ?, ?, ?, ?d )
";
if ($this->oDb->query(
$sql,
$oNotifyTask->getUserLogin(),
@ -32,64 +43,84 @@ class ModuleNotify_MapperNotify extends Mapper {
$oNotifyTask->getNotifySubject(),
$oNotifyTask->getNotifyText(),
$oNotifyTask->getDateCreated(),
$oNotifyTask->getTaskStatus()
$oNotifyTask->getTaskStatus()
)===0) {
return true;
}
}
return false;
}
/**
* Добавляет задания списком
*
* @param array $aTasks Список объектов заданий
* @return bool
*/
public function AddTaskArray($aTasks) {
if(!is_array($aTasks)&&count($aTasks)==0) {
return false;
}
$aValues=array();
foreach ($aTasks as $oTask) {
$aValues[]="(".implode(',',
array(
$this->oDb->escape($oTask->getUserLogin()),
$this->oDb->escape($oTask->getUserMail()),
$this->oDb->escape($oTask->getNotifySubject()),
$this->oDb->escape($oTask->getNotifyText()),
$this->oDb->escape($oTask->getDateCreated()),
$this->oDb->escape($oTask->getTaskStatus())
)
$aValues[]="(".implode(',',
array(
$this->oDb->escape($oTask->getUserLogin()),
$this->oDb->escape($oTask->getUserMail()),
$this->oDb->escape($oTask->getNotifySubject()),
$this->oDb->escape($oTask->getNotifyText()),
$this->oDb->escape($oTask->getDateCreated()),
$this->oDb->escape($oTask->getTaskStatus())
)
).")";
}
$sql = "
INSERT INTO ".Config::Get('db.table.notify_task')."
( user_login, user_mail, notify_subject, notify_text, date_created, notify_task_status )
VALUES
".implode(', ', $aValues);
".implode(', ', $aValues);
return $this->oDb->query($sql);
}
/**
* Удаляет задание
*
* @param ModuleNotify_EntityTask $oNotifyTask Объект задания
* @return bool
*/
public function DeleteTask(ModuleNotify_EntityTask $oNotifyTask) {
$sql = "
DELETE FROM ".Config::Get('db.table.notify_task')."
WHERE
notify_task_id = ?d
";
";
if ($this->oDb->query($sql,$oNotifyTask->getTaskId())) {
return true;
}
}
return false;
}
/**
* Удаляет отложенные Notify-задания по списку идентификаторов
*
* @param array $aTaskId Список ID заданий на отправку
* @return bool
*/
public function DeleteTaskByArrayId($aTaskId) {
$sql = "
DELETE FROM ".Config::Get('db.table.notify_task')."
WHERE
notify_task_id IN(?a)
";
";
if ($this->oDb->query($sql,$aTaskId)) {
return true;
}
}
return false;
}
/**
* Получает массив заданий на публикацию из базы с указанным количественным ограничением (выборка FIFO)
*
* @param int $iLimit Количество
* @return array
*/
public function GetTasks($iLimit) {
$sql = "SELECT *
FROM ".Config::Get('db.table.notify_task')."
@ -100,8 +131,8 @@ class ModuleNotify_MapperNotify extends Mapper {
foreach ($aRows as $aTask) {
$aTasks[]=Engine::GetEntity('Notify_Task',$aTask);
}
}
return $aTasks;
}
return $aTasks;
}
}
?>

View file

@ -16,8 +16,10 @@
*/
/**
* Модуль управления рейтингами и силой
* Модуль управления рейтингами и силой
*
* @package modules.rating
* @since 1.0
*/
class ModuleRating extends Module {
@ -25,14 +27,16 @@ class ModuleRating extends Module {
* Инициализация модуля
*
*/
public function Init() {
public function Init() {
}
/**
* Расчет рейтинга при голосовании за комментарий
*
* @param ModuleUser_EntityUser $oUser
* @param CommentEntity_TopicComment $oComment
* @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует
* @param ModuleComment_EntityComment $oComment Объект комментария
* @param int $iValue
* @return int
*/
public function VoteComment(ModuleUser_EntityUser $oUser, ModuleComment_EntityComment $oComment, $iValue) {
/**
@ -41,7 +45,7 @@ class ModuleRating extends Module {
$oComment->setRating($oComment->getRating()+$iValue);
/**
* Начисляем силу автору коммента, используя логарифмическое распределение
*/
*/
$skill=$oUser->getSkill();
$iMinSize=0.004;
$iMaxSize=0.5;
@ -51,7 +55,7 @@ class ModuleRating extends Module {
$iCountRange=$iMaxCount-$iMinCount;
if ($iCountRange==0) {
$iCountRange=1;
}
}
if ($skill>50 and $skill<200) {
$skill_new=$skill/70;
} elseif ($skill>=200) {
@ -73,9 +77,10 @@ class ModuleRating extends Module {
/**
* Расчет рейтинга и силы при гоосовании за топик
*
* @param ModuleUser_EntityUser $oUser
* @param ModuleTopic_EntityTopic $oTopic
* @param unknown_type $iValue
* @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @param int $iValue
* @return int
*/
public function VoteTopic(ModuleUser_EntityUser $oUser, ModuleTopic_EntityTopic $oTopic, $iValue) {
$skill=$oUser->getSkill();
@ -93,7 +98,7 @@ class ModuleRating extends Module {
$oTopic->setRating($oTopic->getRating()+$iDeltaRating);
/**
* Начисляем силу и рейтинг автору топика, используя логарифмическое распределение
*/
*/
$iMinSize=0.1;
$iMaxSize=8;
$iSizeRange=$iMaxSize-$iMinSize;
@ -102,7 +107,7 @@ class ModuleRating extends Module {
$iCountRange=$iMaxCount-$iMinCount;
if ($iCountRange==0) {
$iCountRange=1;
}
}
if ($skill>50 and $skill<200) {
$skill_new=$skill/70;
} elseif ($skill>=200) {
@ -125,15 +130,16 @@ class ModuleRating extends Module {
/**
* Расчет рейтинга и силы при голосовании за блог
*
* @param ModuleUser_EntityUser $oUser
* @param ModuleBlog_EntityBlog $oBlog
* @param unknown_type $iValue
* @param ModuleUser_EntityUser $oUser Объект пользователя, который голосует
* @param ModuleBlog_EntityBlog $oBlog Объект блога
* @param int $iValue
* @return int
*/
public function VoteBlog(ModuleUser_EntityUser $oUser, ModuleBlog_EntityBlog $oBlog, $iValue) {
public function VoteBlog(ModuleUser_EntityUser $oUser, ModuleBlog_EntityBlog $oBlog, $iValue) {
/**
* Устанавливаем рейтинг блога, используя логарифмическое распределение
*/
$skill=$oUser->getSkill();
*/
$skill=$oUser->getSkill();
$iMinSize=1.13;
$iMaxSize=15;
$iSizeRange=$iMaxSize-$iMinSize;
@ -142,7 +148,7 @@ class ModuleRating extends Module {
$iCountRange=$iMaxCount-$iMinCount;
if ($iCountRange==0) {
$iCountRange=1;
}
}
if ($skill>50 and $skill<200) {
$skill_new=$skill/20;
} elseif ($skill>=200) {
@ -162,12 +168,13 @@ class ModuleRating extends Module {
*
* @param ModuleUser_EntityUser $oUser
* @param ModuleUser_EntityUser $oUserTarget
* @param unknown_type $iValue
* @param int $iValue
* @return float
*/
public function VoteUser(ModuleUser_EntityUser $oUser, ModuleUser_EntityUser $oUserTarget, $iValue) {
public function VoteUser(ModuleUser_EntityUser $oUser, ModuleUser_EntityUser $oUserTarget, $iValue) {
/**
* Начисляем силу и рейтинг юзеру, используя логарифмическое распределение
*/
*/
$skill=$oUser->getSkill();
$iMinSize=0.42;
$iMaxSize=3.2;
@ -177,7 +184,7 @@ class ModuleRating extends Module {
$iCountRange=$iMaxCount-$iMinCount;
if ($iCountRange==0) {
$iCountRange=1;
}
}
if ($skill>50 and $skill<200) {
$skill_new=$skill/40;
} elseif ($skill>=200) {
@ -187,14 +194,10 @@ class ModuleRating extends Module {
}
$iDelta=$iMinSize+(log($skill_new+1)-$iMinCount)*($iSizeRange/$iCountRange);
/**
* Сохраняем силу и рейтинг
*/
$iRatingNew=$oUserTarget->getRating()+$iValue*$iDelta;
//$iSkillNew=$oUserTarget->getSkill()+$iValue*$iDelta/3.67;
//$iSkillNew=($iSkillNew<0) ? 0 : $iSkillNew;
//$oUserTarget->setSkill($iSkillNew);
* Определяем новый рейтинг
*/
$iRatingNew=$oUserTarget->getRating()+$iValue*$iDelta;
$oUserTarget->setRating($iRatingNew);
///$this->User_Update($oUserTarget);
return $iValue*$iDelta;
}
}

View file

@ -4,18 +4,27 @@ require_once(Config::Get('path.root.engine').'/lib/external/Sphinx/sphinxapi.php
/**
* Модуль для работы с машиной полнотекстового поиска Sphinx
*
* @package modules.sphinx
* @since 1.0
*/
class ModuleSphinx extends Module {
/**
* Объект сфинкса
*
* @var SphinxClient|null
*/
protected $oSphinx = null;
/**
* Инициализация
*
*/
public function Init() {
public function Init() {
$this->InitSphinx();
}
/**
* Инициализация сфинкса
*/
protected function InitSphinx() {
/**
* Получаем объект Сфинкса(из Сфинкс АПИ)
@ -27,17 +36,13 @@ class ModuleSphinx extends Module {
*/
$this->oSphinx->SetSortMode(SPH_SORT_EXTENDED, "@weight DESC, @id DESc");
}
public function Shutdown() {
}
/**
* Возвращает число найденых элементов в зависимоти от их типа
*
* @param unknown_type $sTerms
* @param unknown_type $sObjType
* @param unknown_type $aExtraFilters
* @return unknown
* @param string $sTerms Поисковый запрос
* @param string $sObjType Тип поиска
* @param array $aExtraFilters Список фильтров
* @return int
*/
public function GetNumResultsByType($sTerms, $sObjType = 'topics', $aExtraFilters){
$aResults = $this->FindContent($sTerms, $sObjType, 1, 1, $aExtraFilters);
@ -46,25 +51,25 @@ class ModuleSphinx extends Module {
/**
* Непосредственно сам поиск
*
* @param unknown_type $sTerms
* @param unknown_type $sObjType
* @param unknown_type $iOffset
* @param unknown_type $iLimit
* @param unknown_type $aExtraFilters
* @return unknown
* @param string $sTerms Поисковый запрос
* @param string $sObjType Тип поиска
* @param int $iOffset Сдвиг элементов
* @param int $iLimit Количество элементов
* @param array $aExtraFilters Список фильтров
* @return array
*/
public function FindContent($sTerms, $sObjType, $iOffset, $iLimit, $aExtraFilters){
/**
* используем кеширование при поиске
*/
$sExtraFilters = serialize($aExtraFilters);
$cacheKey = Config::Get('module.search.entity_prefix')."searchResult_{$sObjType}_{$sTerms}_{$iOffset}_{$iLimit}_{$sExtraFilters}";
$cacheKey = Config::Get('module.search.entity_prefix')."searchResult_{$sObjType}_{$sTerms}_{$iOffset}_{$iLimit}_{$sExtraFilters}";
if (false === ($data = $this->Cache_Get($cacheKey))) {
/**
* Параметры поиска
*/
$this->oSphinx->SetMatchMode(SPH_MATCH_ALL);
$this->oSphinx->SetLimits($iOffset, $iLimit);
$this->oSphinx->SetLimits($iOffset, $iLimit);
/**
* Устанавливаем атрибуты поиска
*/
@ -72,7 +77,7 @@ class ModuleSphinx extends Module {
if(!is_null($aExtraFilters)){
foreach($aExtraFilters AS $sAttribName => $sAttribValue){
$this->oSphinx->SetFilter(
$sAttribName,
$sAttribName,
(is_array($sAttribValue)) ? $sAttribValue : array($sAttribValue)
);
}
@ -82,7 +87,7 @@ class ModuleSphinx extends Module {
*/
if(!is_array($data = $this->oSphinx->Query($sTerms, Config::Get('module.search.entity_prefix').$sObjType.'Index'))) {
return FALSE; // Скорее всего недоступен демон searchd
}
}
/**
* Если результатов нет, то и в кеш писать не стоит...
* хотя тут момент спорный
@ -96,7 +101,7 @@ class ModuleSphinx extends Module {
/**
* Получить ошибку при последнем обращении к поиску
*
* @return unknown
* @return string
*/
public function GetLastError(){
return $this->oSphinx->GetLastError();
@ -104,18 +109,18 @@ class ModuleSphinx extends Module {
/**
* Получаем сниппеты(превью найденых элементов)
*
* @param unknown_type $sText
* @param unknown_type $sIndex
* @param unknown_type $sTerms
* @param unknown_type $before_match
* @param unknown_type $after_match
* @return unknown
* @param string $sText Текст
* @param string $sIndex Название индекса
* @param string $sTerms Поисковый запрос
* @param string $before_match Добавляемый текст перед ключом
* @param string $after_match Добавляемый текст после ключа
* @return array
*/
public function GetSnippet($sText, $sIndex, $sTerms, $before_match, $after_match){
$aReturn = $this->oSphinx->BuildExcerpts(array($sText), Config::Get('module.search.entity_prefix').$sIndex.'Index', $sTerms, array(
'before_match' => $before_match,
'after_match' => $after_match,
)
'before_match' => $before_match,
'after_match' => $after_match,
)
);
return $aReturn[0];
}

View file

@ -18,11 +18,16 @@
/**
* Модуль потока событий на сайте
*
* @package modules.stream
* @since 1.0
*/
class ModuleStream extends Module {
/**
* Объект маппера
*
* @var ModuleStream_MapperStream
*/
protected $oMapper = null;
/**
* Список дефолтных типов событий, они добавляются каждому пользователю при регистрации
*
@ -49,24 +54,25 @@ class ModuleStream extends Module {
'join_blog' => array('related' => 'blog','unique_user'=>true)
);
/**
* Инициализация модуля
*/
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
}
/**
* Возвращает все типы событий
*
* @return unknown
* @return array
*/
public function getEventTypes() {
return $this->aEventTypes;
}
/**
* Возвращает типы событий с учетом фильтра(доступности)
*
* @param null $aTypes
* @return null|unknown
* @param array|null $aTypes Список типов
* @return array
*/
public function getEventTypesFilter($aTypes=null) {
if (is_null($aTypes)) {
@ -84,9 +90,9 @@ class ModuleStream extends Module {
/**
* Добавляет новый тип события, метод для расширения списка событий плагинами
*
* @param unknown_type $sName
* @param unknown_type $aParams
* @return unknown
* @param string $sName Название типа
* @param array $aParams Параметры
* @return bool
*/
public function AddEventType($sName,$aParams) {
if (!array_key_exists($sName,$this->aEventTypes)) {
@ -98,16 +104,20 @@ class ModuleStream extends Module {
/**
* Проверка допустимого типа событий
*
* @param string $sType
* @param string $sType Тип
* @return bool
*/
public function IsAllowEventType($sType) {
if (!is_string($sType)) {
return false;
}
return array_key_exists($sType,$this->aEventTypes);
}
/**
* Добавление события в БД
*
* @param unknown_type $oObject
* @return unknown
* @param ModuleStream_EntityEvent $oObject Объект события
* @return ModuleStream_EntityEvent|bool
*/
public function AddEvent($oObject) {
if ($iId=$this->oMapper->AddEvent($oObject)) {
@ -119,8 +129,8 @@ class ModuleStream extends Module {
/**
* Обновление события
*
* @param unknown_type $oObject
* @return unknown
* @param ModuleStream_EntityEvent $oObject Объект события
* @return int
*/
public function UpdateEvent($oObject) {
return $this->oMapper->UpdateEvent($oObject);
@ -128,18 +138,22 @@ class ModuleStream extends Module {
/**
* Получает событие по типу и его ID
*
* @param unknown_type $sEventType
* @param unknown_type $iTargetId
* @return unknown
* @param string $sEventType Тип
* @param int $iTargetId ID владельца события
* @param int|null $iUserId ID пользователя
* @return ModuleStream_EntityEvent
*/
public function GetEventByTarget($sEventType, $iTargetId, $iUserId=null) {
return $this->oMapper->GetEventByTarget($sEventType, $iTargetId, $iUserId);
}
/**
* Запись события в ленту
* @param type $oUser
* @param type $iEventType
* @param type $iTargetId
*
* @param int $iUserId ID пользователя
* @param string $sEventType Тип события
* @param int $iTargetId ID владельца
* @param int $iPublish Статус
* @return bool
*/
public function Write($iUserId, $sEventType, $iTargetId, $iPublish=1) {
$iPublish=(int)$iPublish;
@ -195,9 +209,9 @@ class ModuleStream extends Module {
/**
* Чтение потока пользователя
*
* @param int $iCount
* @param int $iFromId
* @param int $iUserId
* @param int|null $iCount Количество
* @param int|null $iFromId ID события с которого начинать выборку
* @param int|null $iUserId ID пользователя
* @return array
*/
public function Read($iCount=null,$iFromId=null,$iUserId=null) {
@ -219,12 +233,11 @@ class ModuleStream extends Module {
return $this->ReadEvents($aEventTypes,$aUsersList,$iCount,$iFromId);
}
/**
* Чтение всей активности на сайте
*
* @param int $iCount
* @param int $iFromId
* @param int|null $iCount Количество
* @param int|null $iFromId ID события с которого начинать выборку
* @return array
*/
public function ReadAll($iCount=null,$iFromId=null) {
@ -238,8 +251,9 @@ class ModuleStream extends Module {
/**
* Чтение активности конкретного пользователя
*
* @param int $iCount
* @param int $iUserId
* @param int $iUserId ID пользователя
* @param int|null $iCount Количество
* @param int|null $iFromId ID события с которого начинать выборку
* @return array
*/
public function ReadByUserId($iUserId,$iCount=null,$iFromId=null) {
@ -254,11 +268,10 @@ class ModuleStream extends Module {
return $this->ReadEvents($aEventTypes,$aUsersList,$iCount,$iFromId);
}
/**
* Количество событий конкретного пользователя
*
* @param $iUserId
* @param int $iUserId ID пользователя
* @return int
*/
public function GetCountByUserId($iUserId) {
@ -270,11 +283,10 @@ class ModuleStream extends Module {
return $this->oMapper->GetCount($aEventTypes, $iUserId);
}
/**
* Количество событий на которые подписан пользователь
*
* @param $iUserId
* @param int $iUserId ID пользователя
* @return int
*/
public function GetCountByReaderId($iUserId) {
@ -290,7 +302,6 @@ class ModuleStream extends Module {
return $this->oMapper->GetCount($aEventTypes, $aUsersList);
}
/**
* Количество событий на всем сайте
*
@ -305,15 +316,23 @@ class ModuleStream extends Module {
return $this->oMapper->GetCount($aEventTypes, null);
}
/**
* Количество событий для пользователя
*
* @param array $aEventTypes Список типов событий
* @param array|null $aUserId ID пользователя
* @return int
*/
public function GetCount($aEventTypes, $aUserId=null) {
return $this->oMapper->GetCount($aEventTypes, $aUserId);
}
/**
* @param array $aEventTypes
* @param array | null $aUsersList
* @param int $iCount
* @param int $iFromId
* Чтение событий
*
* @param array $aEventTypes Список типов событий
* @param array|null $aUsersList Список пользователей, чьи события читать
* @param int $iCount Количество
* @param int $iFromId ID события с которого начинать выборку
* @return array
*/
public function ReadEvents($aEventTypes,$aUsersList,$iCount=null,$iFromId=null) {
@ -324,7 +343,6 @@ class ModuleStream extends Module {
$aEventTypes=$this->getEventTypesFilter($aEventTypes);
if (!count($aEventTypes)) return array();
/**
* Получаем список событий
*/
@ -384,26 +402,29 @@ class ModuleStream extends Module {
}
return $aEvents;
}
/**
* Получение типов событий, на которые подписан пользователь
* @param type $iUserId
* @return type
*
* @param int $iUserId ID пользователя
* @return array
*/
public function getTypesList($iUserId) {
return $this->oMapper->getTypesList($iUserId);
}
/**
* Получение списка id пользователей, на которых подписан пользователь
* @return type
*
* @param int $iUserId ID пользователя
* @return array
*/
protected function getUsersList($iUserId) {
return $this->oMapper->getUserSubscribes($iUserId);
}
/**
* Получение списка пользователей, на которых подписан пользователь
* @param type $iUserId
* @return type
*
* @param int $iUserId ID пользователя
* @return array
*/
public function getUserSubscribes($iUserId) {
$aIds = $this->oMapper->getUserSubscribes($iUserId);
@ -412,8 +433,8 @@ class ModuleStream extends Module {
/**
* Проверяет подписан ли пользователь на конкретного пользователя
*
* @param $iUserId
* @param $iTargetUserId
* @param $iUserId ID пользователя
* @param $iTargetUserId ID пользователя на которого подписан
* @return bool
*/
public function IsSubscribe($iUserId,$iTargetUserId) {
@ -421,9 +442,10 @@ class ModuleStream extends Module {
}
/**
* Редактирование списка событий, на которые подписан юзер
* @param int $iUserId
* @param string $sType
* @return type
*
* @param int $iUserId ID пользователя
* @param string $sType Тип
* @return bool
*/
public function switchUserEventType($iUserId, $sType) {
if ($this->IsAllowEventType($sType)) {
@ -434,7 +456,7 @@ class ModuleStream extends Module {
/**
* Переключает дефолтный список типов событий у пользователя
*
* @param int $iUserId
* @param int $iUserId ID пользователя
*/
public function switchUserEventDefaultTypes($iUserId) {
foreach($this->aEventDefaultTypes as $sType) {
@ -443,28 +465,27 @@ class ModuleStream extends Module {
}
/**
* Подписать пользователя
* @param type $iUserId Id подписываемого пользователя
* @param type $iSubscribeType Тип подписки (см. константы класса)
* @param type $iTargetId Id цели подписки
*
* @param int $iUserId ID пользователя
* @param int $iTargetUserId ID пользователя на которого подписываем
*/
public function subscribeUser($iUserId, $iTargetUserId) {
return $this->oMapper->subscribeUser($iUserId, $iTargetUserId);
$this->oMapper->subscribeUser($iUserId, $iTargetUserId);
}
/**
* Отписать пользователя
* @param type $iUserId Id подписываемого пользователя
* @param type $iSubscribeType Тип подписки (см. константы класса)
* @param type $iTargetId Id цели подписки
*
* @param int $iUserId ID пользователя
* @param int $iTargetUserId ID пользователя на которого подписываем
*/
public function unsubscribeUser($iUserId, $iTargetUserId) {
return $this->oMapper->unsubscribeUser($iUserId, $iTargetUserId);
$this->oMapper->unsubscribeUser($iUserId, $iTargetUserId);
}
/**
* Получает список записей на стене
*
* @param unknown_type $aIds
* @return unknown
* @param array $aIds Список ID записей на стене
* @return array
*/
protected function loadRelatedWall($aIds) {
return $this->Wall_GetWallAdditionalData($aIds);
@ -472,8 +493,8 @@ class ModuleStream extends Module {
/**
* Получает список топиков
*
* @param unknown_type $aIds
* @return unknown
* @param array $aIds Список ID топиков
* @return array
*/
protected function loadRelatedTopic($aIds) {
return $this->Topic_GetTopicsAdditionalData($aIds);
@ -481,8 +502,8 @@ class ModuleStream extends Module {
/**
* Получает список блогов
*
* @param unknown_type $aIds
* @return unknown
* @param array $aIds Список ID блогов
* @return array
*/
protected function loadRelatedBlog($aIds) {
return $this->Blog_GetBlogsAdditionalData($aIds);
@ -490,8 +511,8 @@ class ModuleStream extends Module {
/**
* Получает список комментариев
*
* @param unknown_type $aIds
* @return unknown
* @param array $aIds Список ID комментариев
* @return array
*/
protected function loadRelatedComment($aIds) {
return $this->Comment_GetCommentsAdditionalData($aIds);
@ -500,8 +521,8 @@ class ModuleStream extends Module {
/**
* Получает список пользователей
*
* @param unknown_type $aIds
* @return unknown
* @param array $aIds Список ID пользователей
* @return array
*/
protected function loadRelatedUser($aIds) {
return $this->User_GetUsersAdditionalData($aIds);

View file

@ -15,6 +15,13 @@
---------------------------------------------------------
*/
/**
* Объект сущности события в активности
*
* @package modules.stream
* @since 1.0
*/
class ModuleStream_EntityEvent extends Entity {
}
?>

View file

@ -15,8 +15,19 @@
---------------------------------------------------------
*/
/**
* Объект маппера для работы с БД
*
* @package modules.stream
* @since 1.0
*/
class ModuleStream_MapperStream extends Mapper {
/**
* Добавление события в БД
*
* @param ModuleStream_EntityEvent $oObject
* @return int|bool
*/
public function AddEvent($oObject) {
$sql = "INSERT INTO ".Config::Get('db.table.stream_event')." SET ?a ";
if ($iId=$this->oDb->query($sql,$oObject->_getData())) {
@ -24,7 +35,14 @@ class ModuleStream_MapperStream extends Mapper {
}
return false;
}
/**
* Получает событие по типу и его ID
*
* @param string $sEventType Тип
* @param int $iTargetId ID владельца события
* @param int|null $iUserId ID пользователя
* @return ModuleStream_EntityEvent
*/
public function GetEventByTarget($sEventType, $iTargetId, $iUserId=null) {
$sql = "SELECT * FROM
".Config::Get('db.table.stream_event')."
@ -34,24 +52,46 @@ class ModuleStream_MapperStream extends Mapper {
}
return null;
}
/**
* Обновление события
*
* @param ModuleStream_EntityEvent $oObject Объект события
* @return int
*/
public function UpdateEvent($oObject) {
$sql = "UPDATE ".Config::Get('db.table.stream_event')." SET ?a WHERE id = ?d ";
return $this->oDb->query($sql,$oObject->_getData(array('publish')),$oObject->getId());
}
/**
* Получение типов событий, на которые подписан пользователь
*
* @param int $iUserId ID пользователя
* @return array
*/
public function getTypesList($iUserId) {
$sql = 'SELECT event_type FROM ' . Config::Get('db.table.stream_user_type') . ' WHERE user_id = ?d';
$aRet = $this->oDb->selectCol($sql, $iUserId);
return $aRet;
}
/**
* Получение списка пользователей, на которых подписан пользователь
*
* @param int $iUserId ID пользователя
* @return array
*/
public function getUserSubscribes($iUserId) {
$sql = 'SELECT target_user_id FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE user_id = ?d';
return $this->oDb->selectCol($sql, $iUserId);
}
/**
* Чтение событий
*
* @param array $aEventTypes Список типов событий
* @param array|null $aUsersList Список пользователей, чьи события читать
* @param int $iCount Количество
* @param int $iFromId ID события с которого начинать выборку
* @return array
*/
public function Read($aEventTypes, $aUsersList, $iCount, $iFromId) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.stream_event'). '
WHERE
@ -70,7 +110,13 @@ class ModuleStream_MapperStream extends Mapper {
}
return $aReturn;
}
/**
* Количество событий для пользователя
*
* @param array $aEventTypes Список типов событий
* @param array|null $aUserId ID пользователя
* @return int
*/
public function GetCount($aEventTypes, $aUserId) {
if (!is_null($aUserId) and !is_array($aUserId)) {
$aUserId=array($aUserId);
@ -85,7 +131,13 @@ class ModuleStream_MapperStream extends Mapper {
}
return 0;
}
/**
* Редактирование списка событий, на которые подписан юзер
*
* @param int $iUserId ID пользователя
* @param string $sEventType Тип
* @return bool
*/
public function switchUserEventType($iUserId, $sEventType) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.stream_user_type') . ' WHERE user_id = ?d AND event_type = ?';
if ($this->oDb->select($sql, $iUserId, $sEventType)) {
@ -95,7 +147,12 @@ class ModuleStream_MapperStream extends Mapper {
}
$this->oDb->query($sql, $iUserId, $sEventType);
}
/**
* Подписать пользователя
*
* @param int $iUserId ID пользователя
* @param int $iTargetUserId ID пользователя на которого подписываем
*/
public function subscribeUser($iUserId, $iTargetUserId) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE
user_id = ?d AND target_user_id = ?d';
@ -105,13 +162,24 @@ class ModuleStream_MapperStream extends Mapper {
$this->oDb->query($sql, $iUserId, $iTargetUserId);
}
}
/**
* Отписать пользователя
*
* @param int $iUserId ID пользователя
* @param int $iTargetUserId ID пользователя на которого подписываем
*/
public function unsubscribeUser($iUserId, $iTargetUserId) {
$sql = 'DELETE FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE
user_id = ?d AND target_user_id = ?d';
$this->oDb->query($sql, $iUserId, $iTargetUserId);
}
/**
* Проверяет подписан ли пользователь на конкретного пользователя
*
* @param $iUserId ID пользователя
* @param $iTargetUserId ID пользователя на которого подписан
* @return bool
*/
public function IsSubscribe($iUserId,$iTargetUserId) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.stream_subscribe') . ' WHERE
user_id = ?d AND target_user_id = ?d LIMIT 0,1';
@ -120,5 +188,4 @@ class ModuleStream_MapperStream extends Mapper {
}
return false;
}
}

View file

@ -18,10 +18,21 @@
/**
* Модуль Subscribe - подписки пользователей
*
* @package modules.subscribe
* @since 1.0
*/
class ModuleSubscribe extends Module {
class ModuleSubscribe extends Module {
/**
* Объект маппера
*
* @var ModuleSubscribe_MapperSubscribe
*/
protected $oMapper;
/**
* Объект текущего пользователя
*
* @var ModuleUser_EntityUser|null
*/
protected $oUserCurrent;
/**
* Список доступных объектов подписок с параметрами
@ -32,26 +43,29 @@ class ModuleSubscribe extends Module {
protected $aTargetTypes=array(
'topic_new_comment' => array(),
);
/**
* Инициализация
*
*/
public function Init() {
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
$this->oUserCurrent=$this->User_GetUserCurrent();
}
/**
* Возвращает список типов объектов для облаты
* Возвращает список типов объектов
*
* @return array
*/
public function GetTargetTypes() {
return $this->aTargetTypes;
}
/**
* Добавляет в разрешенные новый тип
* @param unknown_type $sTargetType
*
* @param string $sTargetType Тип
* @param array $aParams Параметры
* @return bool
*/
public function AddTargetType($sTargetType,$aParams=array()) {
if (!array_key_exists($sTargetType,$this->aTargetTypes)) {
@ -60,23 +74,22 @@ class ModuleSubscribe extends Module {
}
return false;
}
/**
* Проверяет разрешен ли данный тип в подписке
*
* @param $sTargetType
* @param string $sTargetType Тип
* @return bool
*/
public function IsAllowTargetType($sTargetType) {
return in_array($sTargetType,array_keys($this->aTargetTypes));
}
/**
* Проверка объекта подписки
*
* @param string $sTargetType
* @param int $iTargetId
* @param int $iCheckType
* @param string $sTargetType Тип
* @param int $iTargetId ID владельца
* @param int $iStatus Статус подписки
* @return bool
*/
public function CheckTarget($sTargetType,$iTargetId,$iStatus=null) {
$sMethod = 'CheckTarget'.func_camelize($sTargetType);
@ -85,13 +98,13 @@ class ModuleSubscribe extends Module {
}
return false;
}
/**
* Возвращает URL страницы с объектом подписки
* Актуально при переходе по ссылки с отпиской от рассылки и последующим редиректом
*
* @param string $sTargetType
* @param int $iTargetId
* @param string $sTargetType Тип
* @param int $iTargetId ID владельца
* @return bool
*/
public function GetUrlTarget($sTargetType,$iTargetId) {
$sMethod = 'GetUrlTarget'.func_camelize($sTargetType);
@ -100,11 +113,10 @@ class ModuleSubscribe extends Module {
}
return false;
}
/**
* Проверка на подписку для гостей
*
* @param $sTargetType
* @param string $sTargetType Тип
* @return bool
*/
public function IsAllowTargetForGuest($sTargetType) {
@ -115,12 +127,11 @@ class ModuleSubscribe extends Module {
}
return false;
}
/**
* Добавляет подписку в БД
*
* @param $oSubscribe
* @return ModuleSubscribe_EntitySubscribe | bool
* @param ModuleSubscribe_EntitySubscribe $oSubscribe Объект подписки
* @return ModuleSubscribe_EntitySubscribe|bool
*/
public function AddSubscribe($oSubscribe) {
if ($sId=$this->oMapper->AddSubscribe($oSubscribe)) {
@ -129,16 +140,18 @@ class ModuleSubscribe extends Module {
}
return false;
}
/**
* Создает подписку, если уже есть, то возвращает существующую
*
* @param $sTargetType
* @param $sTargetId
* @param $sMail
* @return ModuleSubscribe_EntitySubscribe
* @param string $sTargetType Тип
* @param string $sTargetId ID владельца
* @param string $sMail Емайл
* @return ModuleSubscribe_EntitySubscribe|bool
*/
public function AddSubscribeSimple($sTargetType,$sTargetId,$sMail) {
if (!$sMail) {
return false;
}
if (!($oSubscribe=$this->Subscribe_GetSubscribeByTargetAndMail($sTargetType,$sTargetId,$sMail))) {
$oSubscribe=Engine::GetEntity('Subscribe');
$oSubscribe->setTargetType($sTargetType);
@ -152,31 +165,34 @@ class ModuleSubscribe extends Module {
}
return $oSubscribe;
}
/**
* Обновление подписки
*
* @param ModuleSubscribe_EntitySubscribe $oSubscribe Объект подписки
* @return int
*/
public function UpdateSubscribe($oSubscribe) {
return $this->oMapper->UpdateSubscribe($oSubscribe);
}
/**
* Возвращает список подписок по фильтру
*
* @param $aFilter
* @param $aOrder
* @param $iCurrPage
* @param $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetSubscribes($aFilter,$aOrder,$iCurrPage,$iPerPage) {
return array('collection'=>$this->oMapper->GetSubscribes($aFilter,$aOrder,$iCount,$iCurrPage,$iPerPage),'count'=>$iCount);
}
/**
* Возвращает подписку по объекту подписки и емайлу
*
* @param $sTargetType
* @param $iTargetId
* @param $sMail
* @return ModuleSubscribe_EntitySubscribe
* @param string $sTargetType Тип
* @param int $iTargetId ID владельца
* @param string $sMail Емайл
* @return ModuleSubscribe_EntitySubscribe|null
*/
public function GetSubscribeByTargetAndMail($sTargetType,$iTargetId,$sMail) {
$aRes=$this->GetSubscribes(array('target_type'=>$sTargetType,'target_id'=>$iTargetId,'mail'=>$sMail),array(),1,1);
@ -185,12 +201,11 @@ class ModuleSubscribe extends Module {
}
return null;
}
/**
* Возвращает подписку по ключу
*
* @param $sKey
* @return ModuleSubscribe_EntitySubscribe
* @param string $sKey Ключ
* @return ModuleSubscribe_EntitySubscribe|null
*/
public function GetSubscribeByKey($sKey) {
$aRes=$this->GetSubscribes(array('key'=>$sKey),array(),1,1);
@ -199,17 +214,16 @@ class ModuleSubscribe extends Module {
}
return null;
}
/**
* Производит отправку писем по подписчикам подписки
*
* @param $sTargetType Тип объекта подписки
* @param $iTargetId ID объекта подписки
* @param $sTemplate Имя шаблона письма, например, notify.mail.tpl
* @param $sTitle Заголовок письма
* @param int $sTargetType Тип объекта подписки
* @param int $iTargetId ID объекта подписки
* @param string $sTemplate Имя шаблона письма, например, notify.mail.tpl
* @param string $sTitle Заголовок письма
* @param array $aParams Параметра для передачи в шаблон письма
* @param array $aExcludeMail Список емайлов на которые НЕ нужно отправлять
* @param string $sPluginName Название или класс плагина для корректной отправки
*/
public function Send($sTargetType,$iTargetId,$sTemplate,$sTitle,$aParams=array(),$aExcludeMail=array(),$sPluginName=null) {
$iPage=1;
@ -229,14 +243,13 @@ class ModuleSubscribe extends Module {
$aSubscribes=$this->Subscribe_GetSubscribes(array('target_type'=>$sTargetType,'target_id'=>$iTargetId,'status'=>1),array(),$iPage,20);
}
}
/**
* Проверка объекта подписки с типом "topic_new_comment"
* Название метода формируется автоматически
*
* @param int $iTargetId
* @param int $iStatus
* @param int $iTargetId ID владельца
* @param int $iStatus Статус
* @return bool
*/
public function CheckTargetTopicNewComment($iTargetId,$iStatus) {
if ($oTopic=$this->Topic_GetTopicById($iTargetId)) {
@ -253,13 +266,12 @@ class ModuleSubscribe extends Module {
}
return false;
}
/**
* Возвращает URL на страницы объекта подписки с типом "topic_new_comment"
* Название метода формируется автоматически
*
* @param $iTargetId
* @return bool
* @param int $iTargetId ID топика
* @return string|bool
*/
public function GetUrlTargetTopicNewComment($iTargetId) {
if ($oTopic=$this->Topic_GetTopicById($iTargetId) and $oTopic->getPublish()) {

View file

@ -15,7 +15,13 @@
---------------------------------------------------------
*/
class ModuleSubscribe_EntitySubscribe extends Entity {
/**
* Объект сущности подписки
*
* @package modules.subscribe
* @since 1.0
*/
class ModuleSubscribe_EntitySubscribe extends Entity {
}
?>

View file

@ -15,17 +15,33 @@
---------------------------------------------------------
*/
class ModuleSubscribe_MapperSubscribe extends Mapper {
/**
* Объект маппера для работы с БД
*
* @package modules.subscribe
* @since 1.0
*/
class ModuleSubscribe_MapperSubscribe extends Mapper {
/**
* Добавляет подписку в БД
*
* @param ModuleSubscribe_EntitySubscribe $oSubscribe Объект подписки
* @return int|bool
*/
public function AddSubscribe($oSubscribe) {
$sql = "INSERT INTO ".Config::Get('db.table.subscribe')." SET ?a ";
$sql = "INSERT INTO ".Config::Get('db.table.subscribe')." SET ?a ";
if ($iId=$this->oDb->query($sql,$oSubscribe->_getData())) {
return $iId;
}
}
return false;
}
/**
* Получение подписки по типы и емайлу
*
* @param string $sType Тип
* @param string $sMail Емайл
* @return ModuleSubscribe_EntitySubscribe|null
*/
public function GetSubscribeByTypeAndMail($sType,$sMail) {
$sql = "SELECT * FROM ".Config::Get('db.table.subscribe')." WHERE target_type = ? and mail = ?";
if ($aRow=$this->oDb->selectRow($sql,$sType,$sMail)) {
@ -33,21 +49,33 @@ class ModuleSubscribe_MapperSubscribe extends Mapper {
}
return null;
}
/**
* Обновление подписки
*
* @param ModuleSubscribe_EntitySubscribe $oSubscribe Объект подписки
* @return int
*/
public function UpdateSubscribe($oSubscribe) {
$sql = "UPDATE ".Config::Get('db.table.subscribe')."
SET
status = ?,
date_remove = ?
WHERE id = ?d
";
";
return $this->oDb->query($sql,$oSubscribe->getStatus(),
$oSubscribe->getDateRemove(),
$oSubscribe->getId());
$oSubscribe->getDateRemove(),
$oSubscribe->getId());
}
/**
* Возвращает список подписок по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetSubscribes($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('id','date_add','status');
$sOrder='';

View file

@ -18,16 +18,35 @@
/**
* Модуль разговоров(почта)
*
* @package modules.talk
* @since 1.0
*/
class ModuleTalk extends Module {
/**
* Статус TalkUser в базе данных
* Пользователь активен в разговоре
*/
const TALK_USER_ACTIVE = 1;
/**
* Пользователь удалил разговор
*/
const TALK_USER_DELETE_BY_SELF = 2;
/**
* Пользователя удалил из разговора автор письма
*/
const TALK_USER_DELETE_BY_AUTHOR = 4;
/**
* Объект маппера
*
* @var ModuleTalk_MapperTalk
*/
protected $oMapper;
/**
* Объект текущего пользователя
*
* @var ModuleUser_EntityUser|null
*/
protected $oUserCurrent=null;
/**
@ -41,11 +60,13 @@ class ModuleTalk extends Module {
/**
* Формирует и отправляет личное сообщение
*
* @param string $sTitle
* @param string $sText
* @param int | ModuleUser_EntityUser $oUserFrom
* @param array | int | ModuleUser_EntityUser $aUserTo
* @param bool $bSendNotify
* @param string $sTitle Заголовок сообщения
* @param string $sText Текст сообщения
* @param int|ModuleUser_EntityUser $oUserFrom Пользователь от которого отправляем
* @param array|int|ModuleUser_EntityUser $aUserTo Пользователь которому отправляем
* @param bool $bSendNotify Отправлять или нет уведомление на емайл
* @param bool $bUseBlacklist Исклюать или нет пользователей из блэклиста
* @return ModuleTalk_EntityTalk|bool
*/
public function SendTalk($sTitle,$sText,$oUserFrom,$aUserTo,$bSendNotify=true,$bUseBlacklist=true) {
$iUserIdFrom=$oUserFrom instanceof ModuleUser_EntityUser ? $oUserFrom->getId() : (int)$oUserFrom;
@ -101,8 +122,8 @@ class ModuleTalk extends Module {
/**
* Добавляет новую тему разговора
*
* @param ModuleTopic_EntityTopic $oTalk
* @return unknown
* @param ModuleTalk_EntityTalk $oTalk Объект сообщения
* @return ModuleTalk_EntityTalk|bool
*/
public function AddTalk(ModuleTalk_EntityTalk $oTalk) {
if ($sId=$this->oMapper->AddTalk($oTalk)) {
@ -116,17 +137,19 @@ class ModuleTalk extends Module {
/**
* Обновление разговора
*
* @param ModuleTalk_EntityTalk $oTalk
* @param ModuleTalk_EntityTalk $oTalk Объект сообщения
* @return int
*/
public function UpdateTalk(ModuleTalk_EntityTalk $oTalk) {
$this->Cache_Delete("talk_{$oTalk->getId()}");
return $this->oMapper->UpdateTalk($oTalk);
}
/**
* Получает дополнительные данные(объекты) для разговоров по их ID
*
* @param array $aTalkId Список ID сообщений
* @param array|null $aAllowData Список дополнительных типов подгружаемых в объект
* @return array
*/
public function GetTalksAdditionalData($aTalkId,$aAllowData=null) {
if (is_null($aAllowData)) {
@ -205,7 +228,8 @@ class ModuleTalk extends Module {
/**
* Получить список разговоров по списку айдишников
*
* @param unknown_type $aTalkId
* @param array $aTalkId Список ID сообщений
* @return array
*/
public function GetTalksByArrayId($aTalkId) {
if (Config::Get('sys.cache.solid')) {
@ -263,6 +287,12 @@ class ModuleTalk extends Module {
$aTalks=func_array_sort_by_keys($aTalks,$aTalkId);
return $aTalks;
}
/**
* Получить список разговоров по списку айдишников, используя общий кеш
*
* @param array $aTalkId Список ID сообщений
* @return array
*/
public function GetTalksByArrayIdSolid($aTalkId) {
if (!is_array($aTalkId)) {
$aTalkId=array($aTalkId);
@ -283,7 +313,9 @@ class ModuleTalk extends Module {
/**
* Получить список отношений разговор-юзер по списку айдишников
*
* @param unknown_type $aTalkId
* @param array $aTalkId Список ID сообщений
* @param int $sUserId ID пользователя
* @return array
*/
public function GetTalkUsersByArray($aTalkId,$sUserId) {
if (!is_array($aTalkId)) {
@ -341,10 +373,13 @@ class ModuleTalk extends Module {
/**
* Получает тему разговора по айдишнику
*
* @param unknown_type $sId
* @return unknown
* @param int $sId ID сообщения
* @return ModuleTalk_EntityTalk|null
*/
public function GetTalkById($sId) {
if (!is_numeric($sId)) {
return null;
}
$aTalks=$this->GetTalksAdditionalData($sId);
if (isset($aTalks[$sId])) {
$aResult=$this->GetTalkUsersByTalkId($sId);
@ -359,8 +394,8 @@ class ModuleTalk extends Module {
/**
* Добавляет юзера к разговору(теме)
*
* @param ModuleTalk_EntityTalkUser $oTalkUser
* @return unknown
* @param ModuleTalk_EntityTalkUser $oTalkUser Объект связи пользователя и сообщения(разговора)
* @return bool
*/
public function AddTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
$this->Cache_Delete("talk_{$oTalkUser->getTalkId()}");
@ -375,8 +410,8 @@ class ModuleTalk extends Module {
/**
* Помечает разговоры как прочитанные
*
* @param $aTalkId
* @param $iUserId
* @param array $aTalkId Список ID сообщений
* @param int $iUserId ID пользователя
*/
public function MarkReadTalkUserByArray($aTalkId,$iUserId) {
if(!is_array($aTalkId)){
@ -398,10 +433,12 @@ class ModuleTalk extends Module {
/**
* Удаляет юзера из разговора
*
* @param ModuleTalk_EntityTalkUser $oTalkUser
* @return unknown
* @param array $aTalkId Список ID сообщений
* @param int $sUserId ID пользователя
* @param int $iActive Статус связи
* @return bool
*/
public function DeleteTalkUserByArray($aTalkId,$sUserId,$iAcitve=self::TALK_USER_DELETE_BY_SELF) {
public function DeleteTalkUserByArray($aTalkId,$sUserId,$iActive=self::TALK_USER_DELETE_BY_SELF) {
if(!is_array($aTalkId)){
$aTalkId=array($aTalkId);
}
@ -412,7 +449,7 @@ class ModuleTalk extends Module {
array(
'target_id' => $sTalkId,
'target_type' => 'talk',
'user_id' => $this->oUserCurrent->getId()
'user_id' => $sUserId
)
)
);
@ -425,7 +462,7 @@ class ModuleTalk extends Module {
);
}
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("update_talk_user"));
$ret = $this->oMapper->DeleteTalkUserByArray($aTalkId,$sUserId,$iAcitve);
$ret = $this->oMapper->DeleteTalkUserByArray($aTalkId,$sUserId,$iActive);
// Удаляем пустые беседы, если в них нет пользователей
foreach ($aTalkId as $sTalkId) {
@ -438,9 +475,9 @@ class ModuleTalk extends Module {
/**
* Есть ли юзер в этом разговоре
*
* @param unknown_type $sTalkId
* @param unknown_type $sUserId
* @return unknown
* @param int $sTalkId ID разговора
* @param int $sUserId ID пользователя
* @return ModuleTalk_EntityTalkUser|null
*/
public function GetTalkUser($sTalkId,$sUserId) {
$aTalkUser=$this->GetTalkUsersByArray($sTalkId,$sUserId);
@ -452,10 +489,10 @@ class ModuleTalk extends Module {
/**
* Получить все темы разговора где есть юзер
*
* @param string $sUserId
* @param int $iPage
* @param int $iPerPage
* @return array
* @param int $sUserId ID пользователя
* @param int $iPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetTalksByUserId($sUserId,$iPage,$iPerPage) {
$data=array(
@ -463,7 +500,6 @@ class ModuleTalk extends Module {
'count'=>$iCount
);
$aTalks=$this->GetTalksAdditionalData($data['collection']);
/**
* Добавляем данные об участниках разговора
*/
@ -477,14 +513,13 @@ class ModuleTalk extends Module {
$data['collection']=$aTalks;
return $data;
}
/**
* Получить все темы разговора по фильтру
*
* @param array $aFilter
* @param int $iPage
* @param int $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param int $iPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetTalksByFilter($aFilter,$iPage,$iPerPage) {
$data=array(
@ -506,12 +541,11 @@ class ModuleTalk extends Module {
$data['collection']=$aTalks;
return $data;
}
/**
* Обновляет связку разговор-юзер
*
* @param ModuleTalk_EntityTalkUser $oTalkUser
* @return unknown
* @param ModuleTalk_EntityTalkUser $oTalkUser Объект связи пользователя с разговором
* @return bool
*/
public function UpdateTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
//чистим зависимые кеши
@ -519,12 +553,11 @@ class ModuleTalk extends Module {
$this->Cache_Delete("talk_user_{$oTalkUser->getTalkId()}_{$oTalkUser->getUserId()}");
return $this->oMapper->UpdateTalkUser($oTalkUser);
}
/**
* Получает число новых тем и комментов где есть юзер
*
* @param unknown_type $sUserId
* @return unknown
* @param int $sUserId ID пользователя
* @return int
*/
public function GetCountTalkNew($sUserId) {
if (false === ($data = $this->Cache_Get("talk_count_all_new_user_{$sUserId}"))) {
@ -533,13 +566,11 @@ class ModuleTalk extends Module {
}
return $data;
}
/**
* Получает список юзеров в теме разговора
*
* @param string $sTalkId
* @param array $aActive
* @param int $sTalkId ID разговора
* @param array $aActive Список статусов
* @return array
*/
public function GetUsersTalk($sTalkId,$aActive=array()) {
@ -548,11 +579,10 @@ class ModuleTalk extends Module {
$data=$this->oMapper->GetUsersTalk($sTalkId,$aActive);
return $this->User_GetUsersAdditionalData($data);
}
/**
* Возвращает массив пользователей, участвующих в разговоре
*
* @param string $sTalkId
* @param int $sTalkId ID разговора
* @return array
*/
public function GetTalkUsersByTalkId($sTalkId) {
@ -578,59 +608,55 @@ class ModuleTalk extends Module {
}
return $aTalkUsers;
}
/**
* Увеличивает число новых комментов у юзеров
*
* @param unknown_type $sTalkId
* @param unknown_type $aExcludeId
* @return unknown
* @param int $sTalkId ID разговора
* @param array $aExcludeId Список ID пользователей для исключения
* @return int
*/
public function increaseCountCommentNew($sTalkId,$aExcludeId=null) {
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("update_talk_user_{$sTalkId}"));
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("update_talk_user"));
return $this->oMapper->increaseCountCommentNew($sTalkId,$aExcludeId);
}
/**
* Получает привязку письма к ибранному(добавлено ли письмо в избранное у юзера)
*
* @param string $sTalkId
* @param string $sUserId
* @param int $sTalkId ID разговора
* @param int $sUserId ID пользователя
* @return ModuleFavourite_EntityFavourite|null
*/
public function GetFavouriteTalk($sTalkId,$sUserId) {
return $this->Favourite_GetFavourite($sTalkId,'talk',$sUserId);
}
/**
* Получить список избранного по списку айдишников
*
* @param array $aTalkId
* @param array $aTalkId Список ID разговоров
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouriteTalkByArray($aTalkId,$sUserId) {
return $this->Favourite_GetFavouritesByArray($aTalkId,'talk',$sUserId);
}
/**
* Получить список избранного по списку айдишников, но используя единый кеш
*
* @param array $aTalkId
* @param int $sUserId
* @param array $aTalkId Список ID разговоров
* @param int $sUserId ID пользователя
* @return array
*/
public function GetFavouriteTalksByArraySolid($aTalkId,$sUserId) {
return $this->Favourite_GetFavouritesByArraySolid($aTalkId,'talk',$sUserId);
}
/**
* Получает список писем из избранного пользователя
*
* @param string $sUserId
* @param int $iCount
* @param int $iCurrPage
* @param int $iPerPage
* @return array
* @param int $sUserId ID пользователя
* @param int $iCurrPage Номер текущей страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetTalksFavouriteByUserId($sUserId,$iCurrPage,$iPerPage) {
// Получаем список идентификаторов избранных комментов
@ -655,7 +681,7 @@ class ModuleTalk extends Module {
/**
* Возвращает число писем в избранном
*
* @param string $sUserId
* @param int $sUserId ID пользователя
* @return int
*/
public function GetCountTalksFavouriteByUserId($sUserId) {
@ -664,7 +690,7 @@ class ModuleTalk extends Module {
/**
* Добавляет письмо в избранное
*
* @param ModuleFavourite_EntityFavourite $oFavourite
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function AddFavouriteTalk(ModuleFavourite_EntityFavourite $oFavourite) {
@ -675,7 +701,7 @@ class ModuleTalk extends Module {
/**
* Удаляет письмо из избранного
*
* @param ModuleFavourite_EntityFavourite $oFavourite
* @param ModuleFavourite_EntityFavourite $oFavourite Объект избранного
* @return bool
*/
public function DeleteFavouriteTalk(ModuleFavourite_EntityFavourite $oFavourite) {
@ -686,29 +712,27 @@ class ModuleTalk extends Module {
/**
* Получает информацию о пользователях, занесенных в блеклист
*
* @param string $sUserId
* @param int $sUserId ID пользователя
* @return array
*/
public function GetBlacklistByUserId($sUserId) {
$data=$this->oMapper->GetBlacklistByUserId($sUserId);
return $this->User_GetUsersAdditionalData($data);
}
/**
* Возвращает пользователей, у которых данный занесен в Blacklist
*
* @param string $sUserId
* @param int $sUserId ID пользователя
* @return array
*/
public function GetBlacklistByTargetId($sUserId) {
return $this->oMapper->GetBlacklistByTargetId($sUserId);
}
/**
* Добавление пользователя в блеклист по переданному идентификатору
*
* @param string $sTargetId
* @param string $sUserId
* @param int $sTargetId ID пользователя, которого добавляем в блэклист
* @param int $sUserId ID пользователя
* @return bool
*/
public function AddUserToBlacklist($sTargetId, $sUserId) {
@ -717,8 +741,8 @@ class ModuleTalk extends Module {
/**
* Добавление пользователя в блеклист по списку идентификаторов
*
* @param array $aTargetId
* @param string $sUserId
* @param array $aTargetId Список ID пользователей, которых добавляем в блэклист
* @param int $sUserId ID пользователя
* @return bool
*/
public function AddUserArrayToBlacklist($aTargetId, $sUserId) {
@ -730,21 +754,20 @@ class ModuleTalk extends Module {
/**
* Удаляем пользователя из блеклиста
*
* @param string $sTargetId
* @param string $sUserId
* @param int $sTargetId ID пользователя, которого удаляем из блэклиста
* @param int $sUserId ID пользователя
* @return bool
*/
public function DeleteUserFromBlacklist($sTargetId, $sUserId) {
return $this->oMapper->DeleteUserFromBlacklist($sTargetId, $sUserId);
}
/**
* Возвращает список последних инбоксов пользователя,
* отправленных не более чем $iTimeLimit секунд назад
*
* @param string $sUserId
* @param int $iTimeLimit
* @param int $iCountLimit
* @param int $sUserId ID пользователя
* @param int $iTimeLimit Количество секунд
* @param int $iCountLimit Количество
* @return array
*/
public function GetLastTalksByUserId($sUserId,$iTimeLimit,$iCountLimit=1) {
@ -756,11 +779,10 @@ class ModuleTalk extends Module {
return $aTalks;
}
/**
* Удаление письма из БД
*
* @param unknown_type $iTalkId
* @param int $iTalkId ID разговора
*/
public function DeleteTalk($iTalkId) {
$this->oMapper->deleteTalk($iTalkId);

View file

@ -15,40 +15,95 @@
---------------------------------------------------------
*/
class ModuleTalk_EntityTalk extends Entity
{
public function getId() {
return $this->_getDataOne('talk_id');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getTitle() {
return $this->_getDataOne('talk_title');
}
public function getText() {
return $this->_getDataOne('talk_text');
}
public function getDate() {
return $this->_getDataOne('talk_date');
}
public function getDateLast() {
return $this->_getDataOne('talk_date_last');
}
/**
* Объект сущности сообщения
*
* @package modules.talk
* @since 1.0
*/
class ModuleTalk_EntityTalk extends Entity {
/**
* Возвращает ID сообщения
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('talk_id');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Вовзращает заголовок сообщения
*
* @return string|null
*/
public function getTitle() {
return $this->_getDataOne('talk_title');
}
/**
* Возвращает текст сообщения
*
* @return string|null
*/
public function getText() {
return $this->_getDataOne('talk_text');
}
/**
* Возвращает дату сообщения
*
* @return string|null
*/
public function getDate() {
return $this->_getDataOne('talk_date');
}
/**
* Возвращает дату последнего сообщения
*
* @return string|null
*/
public function getDateLast() {
return $this->_getDataOne('talk_date_last');
}
/**
* Возвращает ID последнего пользователя
*
* @return int|null
*/
public function getUserIdLast() {
return $this->_getDataOne('talk_user_id_last');
}
public function getUserIp() {
return $this->_getDataOne('talk_user_ip');
}
/**
* Вовзращает IP пользователя
*
* @return string|null
*/
public function getUserIp() {
return $this->_getDataOne('talk_user_ip');
}
/**
* Возвращает ID последнего комментария
*
* @return int|null
*/
public function getCommentIdLast() {
return $this->_getDataOne('talk_comment_id_last');
}
public function getCountComment() {
return $this->_getDataOne('talk_count_comment');
}
/**
* Возвращает количество комментариев
*
* @return int|null
*/
public function getCountComment() {
return $this->_getDataOne('talk_count_comment');
}
/**
* Возвращает последний текст(коммент) из письма, если комментов нет, то текст исходного сообщения
*
@ -60,80 +115,168 @@ class ModuleTalk_EntityTalk extends Entity
}
return $this->getText();
}
public function getUsers() {
return $this->_getDataOne('users');
}
public function getUser() {
return $this->_getDataOne('user');
}
public function getTalkUser() {
return $this->_getDataOne('talk_user');
}
/**
* Возращает true, если разговор занесен в избранное
*
* @return bool
*/
public function getIsFavourite() {
return $this->_getDataOne('talk_is_favourite');
}
/**
* Получает пользователей разговора
* Возвращает список пользователей
*
* @return array|null
*/
public function getUsers() {
return $this->_getDataOne('users');
}
/**
* Возвращает объект пользователя
*
* @return ModuleUser_EntityUser|null
*/
public function getUser() {
return $this->_getDataOne('user');
}
/**
* Возвращает объект связи пользователя с сообщением
*
* @return ModuleTalk_EntityTalkUser|null
*/
public function getTalkUser() {
return $this->_getDataOne('talk_user');
}
/**
* Возращает true, если разговор занесен в избранное
*
* @return bool
*/
public function getIsFavourite() {
return $this->_getDataOne('talk_is_favourite');
}
/**
* Возращает пользователей разговора
*
* @return array
*/
public function getTalkUsers() {
return $this->_getDataOne('talk_users');
}
public function getTalkUsers() {
return $this->_getDataOne('talk_users');
}
/**
* Устанавливает ID сообщения
*
* @param int $data
*/
public function setId($data) {
$this->_aData['talk_id']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setTitle($data) {
$this->_aData['talk_title']=$data;
}
public function setText($data) {
$this->_aData['talk_text']=$data;
}
public function setDate($data) {
$this->_aData['talk_date']=$data;
}
public function setDateLast($data) {
$this->_aData['talk_date_last']=$data;
}
$this->_aData['talk_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает заголовок сообщения
*
* @param string $data
*/
public function setTitle($data) {
$this->_aData['talk_title']=$data;
}
/**
* Устанавливает текст сообщения
*
* @param string $data
*/
public function setText($data) {
$this->_aData['talk_text']=$data;
}
/**
* Устанавливает дату разговора
*
* @param string $data
*/
public function setDate($data) {
$this->_aData['talk_date']=$data;
}
/**
* Устанавливает дату последнего сообщения в разговоре
*
* @param string $data
*/
public function setDateLast($data) {
$this->_aData['talk_date_last']=$data;
}
/**
* Устанавливает ID последнего пользователя
*
* @param int $data
*/
public function setUserIdLast($data) {
$this->_aData['talk_user_id_last']=$data;
}
public function setUserIp($data) {
$this->_aData['talk_user_ip']=$data;
}
/**
* Устанавливает IP пользователя
*
* @param string $data
*/
public function setUserIp($data) {
$this->_aData['talk_user_ip']=$data;
}
/**
* Устанавливает ID последнего комментария
*
* @param string $data
*/
public function setCommentIdLast($data) {
$this->_aData['talk_comment_id_last']=$data;
}
public function setCountComment($data) {
$this->_aData['talk_count_comment']=$data;
}
public function setUsers($data) {
$this->_aData['users']=$data;
}
public function setUser($data) {
$this->_aData['user']=$data;
}
public function setTalkUser($data) {
$this->_aData['talk_user']=$data;
}
public function setIsFavourite($data) {
$this->_aData['talk_is_favourite']=$data;
}
public function setTalkUsers($data) {
$this->_aData['talk_users']=$data;
}
/**
* Устанавливает количество комментариев
*
* @param int $data
*/
public function setCountComment($data) {
$this->_aData['talk_count_comment']=$data;
}
/**
* Устанавливает список пользователей
*
* @param array $data
*/
public function setUsers($data) {
$this->_aData['users']=$data;
}
/**
* Устанавливает объект пользователя
*
* @param ModuleUser_EntityUser $data
*/
public function setUser($data) {
$this->_aData['user']=$data;
}
/**
* Устанавливает объект связи
*
* @param ModuleTalk_EntityTalkUser $data
*/
public function setTalkUser($data) {
$this->_aData['talk_user']=$data;
}
/**
* Устанавливает факт налиция разговора в избранном текущего пользователя
*
* @param bool $data
*/
public function setIsFavourite($data) {
$this->_aData['talk_is_favourite']=$data;
}
/**
* Устанавливает список связей
*
* @param array $data
*/
public function setTalkUsers($data) {
$this->_aData['talk_users']=$data;
}
}
?>

View file

@ -15,63 +15,127 @@
---------------------------------------------------------
*/
class ModuleTalk_EntityTalkUser extends Entity
{
public function getTalkId() {
return $this->_getDataOne('talk_id');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getDateLast() {
return $this->_getDataOne('date_last');
}
public function getCommentIdLast() {
return $this->_getDataOne('comment_id_last');
}
public function getCommentCountNew() {
return $this->_getDataOne('comment_count_new');
}
/**
* Возвращает статус активности пользователя
*
* @return int
*/
public function getUserActive(){
/**
* Объект связи пользователя с разовором
*
* @package modules.talk
* @since 1.0
*/
class ModuleTalk_EntityTalkUser extends Entity {
/**
* Возвращает ID разговора
*
* @return int|null
*/
public function getTalkId() {
return $this->_getDataOne('talk_id');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает дату последнего сообщения
*
* @return string|null
*/
public function getDateLast() {
return $this->_getDataOne('date_last');
}
/**
* Возвращает ID последнего комментария
*
* @return int|null
*/
public function getCommentIdLast() {
return $this->_getDataOne('comment_id_last');
}
/**
* Возвращает количество новых сообщений
*
* @return int|null
*/
public function getCommentCountNew() {
return $this->_getDataOne('comment_count_new');
}
/**
* Возвращает статус активности пользователя
*
* @return int
*/
public function getUserActive(){
return $this->_getDataOne('talk_user_active') ? $this->_getDataOne('talk_user_active') : ModuleTalk::TALK_USER_ACTIVE;
}
/**
* Возвращает соответствующий пользователю объект UserEntity
*
* @return UserEntity | null
*/
public function getUser() {
return $this->_getDataOne('user');
}
}
/**
* Возвращает соответствующий пользователю объект
*
* @return ModuleUser_EntityUser | null
*/
public function getUser() {
return $this->_getDataOne('user');
}
/**
* Устанавливает ID разговора
*
* @param int $data
*/
public function setTalkId($data) {
$this->_aData['talk_id']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setDateLast($data) {
$this->_aData['date_last']=$data;
}
public function setCommentIdLast($data) {
$this->_aData['comment_id_last']=$data;
}
public function setCommentCountNew($data) {
$this->_aData['comment_count_new']=$data;
}
public function setUserActive($data) {
$this->_aData['talk_user_active']=$data;
}
public function setUser($data) {
$this->_aData['user']=$data;
}
$this->_aData['talk_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает последнюю дату
*
* @param string $data
*/
public function setDateLast($data) {
$this->_aData['date_last']=$data;
}
/**
* Устанавливает ID последнее комментария
*
* @param int $data
*/
public function setCommentIdLast($data) {
$this->_aData['comment_id_last']=$data;
}
/**
* Устанавливает количество новых комментариев
*
* @param int $data
*/
public function setCommentCountNew($data) {
$this->_aData['comment_count_new']=$data;
}
/**
* Устанавливает статус связи
*
* @param int $data
*/
public function setUserActive($data) {
$this->_aData['talk_user_active']=$data;
}
/**
* Устанавливает объект пользователя
*
* @param ModuleUser_EntityUser $data
*/
public function setUser($data) {
$this->_aData['user']=$data;
}
}
?>

View file

@ -15,7 +15,19 @@
---------------------------------------------------------
*/
class ModuleTalk_MapperTalk extends Mapper {
/**
* Объект маппера для работы с БД
*
* @package modules.talk
* @since 1.0
*/
class ModuleTalk_MapperTalk extends Mapper {
/**
* Добавляет новую тему разговора
*
* @param ModuleTalk_EntityTalk $oTalk Объект сообщения
* @return int|bool
*/
public function AddTalk(ModuleTalk_EntityTalk $oTalk) {
$sql = "INSERT INTO ".Config::Get('db.table.talk')."
(user_id,
@ -27,14 +39,18 @@ class ModuleTalk_MapperTalk extends Mapper {
talk_user_ip
)
VALUES(?d, ?, ?, ?, ?, ?, ?)
";
";
if ($iId=$this->oDb->query($sql,$oTalk->getUserId(),$oTalk->getTitle(),$oTalk->getText(),$oTalk->getDate(),$oTalk->getDateLast(),$oTalk->getUserIdLast(),$oTalk->getUserIp()))
{
return $iId;
}
}
return false;
}
/**
* Удаление письма из БД
*
* @param int $iTalkId ID разговора
*/
public function DeleteTalk($iTalkId) {
// Удаление беседы
$sql = 'DELETE FROM '.Config::Get('db.table.talk').' WHERE talk_id = ?d';
@ -43,7 +59,12 @@ class ModuleTalk_MapperTalk extends Mapper {
$sql = 'DELETE FROM '.Config::Get('db.table.talk_user').' WHERE talk_id = ?d';
$this->oDb->query($sql,$iTalkId);
}
/**
* Обновление разговора
*
* @param ModuleTalk_EntityTalk $oTalk Объект сообщения
* @return int
*/
public function UpdateTalk(ModuleTalk_EntityTalk $oTalk) {
$sql = "UPDATE ".Config::Get('db.table.talk')." SET
talk_date_last = ? ,
@ -52,15 +73,20 @@ class ModuleTalk_MapperTalk extends Mapper {
talk_count_comment = ?
WHERE
talk_id = ?d
";
";
return $this->oDb->query($sql,$oTalk->getDateLast(),$oTalk->getUserIdLast(),$oTalk->getCommentIdLast(),$oTalk->getCountComment(),$oTalk->getId());
}
/**
* Получить список разговоров по списку айдишников
*
* @param array $aArrayId Список ID сообщений
* @return array
*/
public function GetTalksByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
t.*
FROM
@ -73,15 +99,21 @@ class ModuleTalk_MapperTalk extends Mapper {
foreach ($aRows as $aRow) {
$aTalks[]=Engine::GetEntity('Talk',$aRow);
}
}
}
return $aTalks;
}
/**
* Получить список отношений разговор-юзер по списку айдишников
*
* @param array $aArrayId Список ID сообщений
* @param int $sUserId ID пользователя
* @return array
*/
public function GetTalkUserByArray($aArrayId,$sUserId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
t.*
FROM
@ -99,8 +131,13 @@ class ModuleTalk_MapperTalk extends Mapper {
}
return $aTalkUsers;
}
public function GetTalkById($sId) {
/**
* Получает тему разговора по айдишнику
*
* @param int $sId ID сообщения
* @return ModuleTalk_EntityTalk|null
*/
public function GetTalkById($sId) {
$sql = "SELECT
t.*,
@ -113,14 +150,18 @@ class ModuleTalk_MapperTalk extends Mapper {
AND
t.user_id=u.user_id
";
if ($aRow=$this->oDb->selectRow($sql,$sId)) {
return Engine::GetEntity('Talk',$aRow);
}
return null;
}
/**
* Добавляет юзера к разговору(теме)
*
* @param ModuleTalk_EntityTalkUser $oTalkUser Объект связи пользователя и сообщения(разговора)
* @return bool
*/
public function AddTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
$sql = "INSERT INTO ".Config::Get('db.table.talk_user')."
(talk_id,
@ -131,20 +172,25 @@ class ModuleTalk_MapperTalk extends Mapper {
VALUES(?d, ?d, ?, ?d)
ON DUPLICATE KEY
UPDATE talk_user_active = ?d
";
";
if ($this->oDb->query($sql,
$oTalkUser->getTalkId(),
$oTalkUser->getUserId(),
$oTalkUser->getDateLast(),
$oTalkUser->getUserActive(),
$oTalkUser->getUserActive()
$oTalkUser->getTalkId(),
$oTalkUser->getUserId(),
$oTalkUser->getDateLast(),
$oTalkUser->getUserActive(),
$oTalkUser->getUserActive()
)===0) {
return true;
}
}
return false;
}
public function UpdateTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
/**
* Обновляет связку разговор-юзер
*
* @param ModuleTalk_EntityTalkUser $oTalkUser Объект связи пользователя с разговором
* @return bool
*/
public function UpdateTalkUser(ModuleTalk_EntityTalkUser $oTalkUser) {
$sql = "UPDATE ".Config::Get('db.table.talk_user')."
SET
date_last = ?,
@ -155,8 +201,8 @@ class ModuleTalk_MapperTalk extends Mapper {
talk_id = ?d
AND
user_id = ?d
";
";
if (
$this->oDb->query(
$sql,
@ -169,15 +215,21 @@ class ModuleTalk_MapperTalk extends Mapper {
)
) {
return true;
}
}
return false;
}
/**
* Удаляет юзера из разговора
*
* @param array $aTalkId Список ID сообщений
* @param int $sUserId ID пользователя
* @param int $iActive Статус связи
* @return bool
*/
public function DeleteTalkUserByArray($aTalkId,$sUserId,$iActive) {
if (!is_array($aTalkId)) {
$aTalkId=array($aTalkId);
}
}
$sql = "
UPDATE ".Config::Get('db.table.talk_user')."
SET
@ -186,16 +238,19 @@ class ModuleTalk_MapperTalk extends Mapper {
talk_id IN (?a)
AND
user_id = ?d
";
if ($this->oDb->query($sql,$iActive,$aTalkId,$sUserId))
";
if ($this->oDb->query($sql,$iActive,$aTalkId,$sUserId))
{
return true;
}
}
return false;
}
/**
* Возвращает количество новых комментариев
*
* @param $sUserId
* @return bool
*/
public function GetCountCommentNew($sUserId) {
$sql = "
SELECT
@ -212,7 +267,12 @@ class ModuleTalk_MapperTalk extends Mapper {
}
return false;
}
/**
* Получает число новых тем и комментов где есть юзер
*
* @param int $sUserId ID пользователя
* @return int
*/
public function GetCountTalkNew($sUserId) {
$sql = "
SELECT
@ -231,8 +291,16 @@ class ModuleTalk_MapperTalk extends Mapper {
}
return false;
}
public function GetTalksByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) {
/**
* Получить все темы разговора где есть юзер
*
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTalksByUserId($sUserId,&$iCount,$iCurrPage,$iPerPage) {
$sql = "SELECT
tu.talk_id
FROM
@ -247,7 +315,7 @@ class ModuleTalk_MapperTalk extends Mapper {
ORDER BY t.talk_date_last desc, t.talk_date desc
LIMIT ?d, ?d
";
$aTalks=array();
if ($aRows=$this->oDb->selectPage($iCount,$sql,$sUserId,ModuleTalk::TALK_USER_ACTIVE,($iCurrPage-1)*$iPerPage, $iPerPage)) {
foreach ($aRows as $aRow) {
@ -255,9 +323,14 @@ class ModuleTalk_MapperTalk extends Mapper {
}
}
return $aTalks;
}
}
/**
* Получает список юзеров в теме разговора
*
* @param int $sTalkId ID разговора
* @param array $aUserActive Список статусов
* @return array
*/
public function GetUsersTalk($sTalkId,$aUserActive=array()) {
$sql = "
SELECT
@ -267,9 +340,9 @@ class ModuleTalk_MapperTalk extends Mapper {
WHERE
talk_id = ?
{ AND talk_user_active IN(?a) }
";
";
$aReturn=array();
if ($aRows=$this->oDb->select($sql,$sTalkId,
if ($aRows=$this->oDb->select($sql,$sTalkId,
(count($aUserActive) ? $aUserActive : DBSIMPLE_SKIP )
)) {
foreach ($aRows as $aRow) {
@ -279,25 +352,30 @@ class ModuleTalk_MapperTalk extends Mapper {
return $aReturn;
}
/**
* Увеличивает число новых комментов у юзеров
*
* @param int $sTalkId ID разговора
* @param array $aExcludeId Список ID пользователей для исключения
* @return int
*/
public function increaseCountCommentNew($sTalkId,$aExcludeId) {
if (!is_null($aExcludeId) and !is_array($aExcludeId)) {
$aExcludeId=array($aExcludeId);
}
$sql = "UPDATE
".Config::Get('db.table.talk_user')."
SET comment_count_new=comment_count_new+1
WHERE
talk_id = ?
{ AND user_id NOT IN (?a) }";
{ AND user_id NOT IN (?a) }";
return $this->oDb->select($sql,$sTalkId,!is_null($aExcludeId) ? $aExcludeId : DBSIMPLE_SKIP);
}
/**
* Возвращает массив участников разговора
* Возвращает массив пользователей, участвующих в разговоре
*
* @param string $sTalkId
* @param int $sTalkId ID разговора
* @return array
*/
public function GetTalkUsers($sTalkId) {
@ -309,7 +387,7 @@ class ModuleTalk_MapperTalk extends Mapper {
WHERE
talk_id = ?
";
";
$aReturn=array();
if ($aRows=$this->oDb->select($sql,$sTalkId)) {
foreach ($aRows as $aRow) {
@ -317,16 +395,16 @@ class ModuleTalk_MapperTalk extends Mapper {
}
}
return $aReturn;
return $aReturn;
}
/**
* Возвращает список идентификаторов писем, удовлетворяющих условию фильтра
* Получить все темы разговора по фильтру
*
* @param array $aFilter
* @param int $iCount
* @param int $iCurrPage
* @param int $iPerPage
* @return array
* @param array $aFilter Фильтр
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetTalksByFilter($aFilter,&$iCount,$iCurrPage,$iPerPage) {
if (isset($aFilter['id']) and !is_array($aFilter['id'])) {
@ -354,7 +432,7 @@ class ModuleTalk_MapperTalk extends Mapper {
ORDER BY t.talk_date_last desc, t.talk_date desc
LIMIT ?d, ?d
";
$aTalks=array();
if (
$aRows=$this->oDb->selectPage(
@ -380,57 +458,53 @@ class ModuleTalk_MapperTalk extends Mapper {
}
return $aTalks;
}
/**
* Возвращает идентификаторы пользователей, добавленых в блеклист
* Получает информацию о пользователях, занесенных в блеклист
*
* @param string $sUserId
* @param int $sUserId ID пользователя
* @return array
*/
public function GetBlacklistByUserId($sUserId) {
public function GetBlacklistByUserId($sUserId) {
$sql = "SELECT
tb.user_target_id
FROM
".Config::Get('db.table.talk_blacklist')." as tb
WHERE
tb.user_id = ?d";
tb.user_id = ?d";
$aTargetId=array();
if ($aRows=$this->oDb->select($sql,$sUserId)) {
foreach ($aRows as $aRow) {
$aTargetId[]=$aRow['user_target_id'];
}
}
}
return $aTargetId;
}
}
/**
* Получает идентификаторы пользователей, у которых текущей
* занесен в блеклист
* Возвращает пользователей, у которых данный занесен в Blacklist
*
* @param string $sUserId
* @param int $sUserId ID пользователя
* @return array
*/
public function GetBlacklistByTargetId($sUserId) {
public function GetBlacklistByTargetId($sUserId) {
$sql = "SELECT
tb.user_id
FROM
".Config::Get('db.table.talk_blacklist')." as tb
WHERE
tb.user_target_id = ?d";
tb.user_target_id = ?d";
$aUserId=array();
if ($aRows=$this->oDb->select($sql,$sUserId)) {
foreach ($aRows as $aRow) {
$aUserId[]=$aRow['user_id'];
}
}
}
return $aUserId;
}
/**
* Добавление пользователя в блеклист
* Добавление пользователя в блеклист по переданному идентификатору
*
* @param string $sTargetId
* @param string $sUserId
* @param int $sTargetId ID пользователя, которого добавляем в блэклист
* @param int $sUserId ID пользователя
* @return bool
*/
public function AddUserToBlacklist($sTargetId, $sUserId) {
@ -439,53 +513,51 @@ class ModuleTalk_MapperTalk extends Mapper {
( user_id, user_target_id )
VALUES
(?d, ?d)
";
";
if ($this->oDb->query($sql,$sUserId,$sTargetId)===0) {
return true;
}
return false;
}
return false;
}
/**
* Удаление пользователя из блеклиста
* Удаляем пользователя из блеклиста
*
* @param string $sTargetId
* @param stringe $sUserId
* @param int $sTargetId ID пользователя, которого удаляем из блэклиста
* @param int $sUserId ID пользователя
* @return bool
*/
public function DeleteUserFromBlacklist($sTargetId, $sUserId) {
public function DeleteUserFromBlacklist($sTargetId, $sUserId) {
$sql = "
DELETE FROM ".Config::Get('db.table.talk_blacklist')."
WHERE
user_id = ?d
AND
user_target_id = ?d
";
";
if ($this->oDb->query($sql,$sUserId,$sTargetId)) {
return true;
}
return false;
}
return false;
}
/**
* Добавление пользователей в блеклист по массиву переданных идентификаторов
* Добавление пользователя в блеклист по списку идентификаторов
*
* @param array $aTargetId
* @param string $sUserId
* @param array $aTargetId Список ID пользователей, которых добавляем в блэклист
* @param int $sUserId ID пользователя
* @return bool
*/
public function AddUserArrayToBlacklist($aTargetId, $sUserId) {
public function AddUserArrayToBlacklist($aTargetId, $sUserId) {
$sql = "
INSERT INTO ".Config::Get('db.table.talk_blacklist')."
( user_id, user_target_id )
VALUES
(?d, ?d)
";
$bOk=true;
";
$bOk=true;
foreach ($aTargetId as $sTarget) {
$bOk = $bOk && $this->oDb->query($sql, $sUserId, $sTarget);
}
return $bOk;
}
return $bOk;
}
}
?>

View file

@ -18,21 +18,26 @@
/**
* Модуль Tools - различные вспомогательные методы
*
* @package modules.tools
* @since 1.0
*/
class ModuleTools extends Module {
/**
* Инициализация
*
*/
public function Init() {
}
/**
* Строит логарифмическое облако - расчитывает значение size в зависимости от count
* У объектов в коллекции обязательно должны быть методы getCount() и setSize()
*
* @param array $aCollection
* @param aray $aCollection Список тегов
* @param int $iMinSize Минимальный размер
* @param int $iMaxSize Максимальный размер
* @return array
*/
public function MakeCloud($aCollection,$iMinSize=1,$iMaxSize=10) {
if (count($aCollection)) {

File diff suppressed because it is too large Load diff

View file

@ -15,7 +15,19 @@
---------------------------------------------------------
*/
/**
* Объект сущности топика
*
* @package modules.topic
* @since 1.0
*/
class ModuleTopic_EntityTopic extends Entity {
/**
* Массив объектов(не всегда) для дополнительных типов топиков(линки, опросы, подкасты и т.п.)
*
* @var array
*/
protected $aExtra=null;
/**
* Определяем правила валидации
@ -33,20 +45,12 @@ class ModuleTopic_EntityTopic extends Entity {
$this->aValidateRules[]=array('topic_type','topic_type','on'=>array('topic','link','question','photoset'));
$this->aValidateRules[]=array('link_url','url','allowEmpty'=>false,'label'=>$this->Lang_Get('topic_link_create_url'),'on'=>array('link'));
}
/**
* массив объектов(не всегда) для дополнительных типов топиков(линки, опросы, подкасты и т.п.)
*
* @var array
*/
protected $aExtra=null;
/**
* Проверка типа топика
*
* @param $sValue
* @param $aParams
* @return bool | string
* @param string $sValue Проверяемое значение
* @param array $aParams Параметры
* @return bool|string
*/
public function ValidateTopicType($sValue,$aParams) {
if ($this->Topic_IsAllowTopicType($sValue)) {
@ -57,9 +61,9 @@ class ModuleTopic_EntityTopic extends Entity {
/**
* Проверка топика на уникальность
*
* @param $sValue
* @param $aParams
* @return bool | string
* @param string $sValue Проверяемое значение
* @param array $aParams Параметры
* @return bool|string
*/
public function ValidateTopicUnique($sValue,$aParams) {
$this->setTextHash(md5($this->getType().$sValue.$this->getTitle()));
@ -74,9 +78,9 @@ class ModuleTopic_EntityTopic extends Entity {
/**
* Валидация ID блога
*
* @param $sValue
* @param $aParams
* @return bool | string
* @param string $sValue Проверяемое значение
* @param array $aParams Параметры
* @return bool|string
*/
public function ValidateBlogId($sValue,$aParams) {
if ($sValue==0) {
@ -88,109 +92,266 @@ class ModuleTopic_EntityTopic extends Entity {
return $this->Lang_Get('topic_create_blog_error_unknown');
}
/**
* Возвращает ID топика
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('topic_id');
}
/**
* Возвращает ID блога
*
* @return int|null
*/
public function getBlogId() {
return $this->_getDataOne('blog_id');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает тип топика
*
* @return string|null
*/
public function getType() {
return $this->_getDataOne('topic_type');
}
/**
* Возвращает заголовок топика
*
* @return string|null
*/
public function getTitle() {
return $this->_getDataOne('topic_title');
}
/**
* Возвращает текст топика
*
* @return string|null
*/
public function getText() {
return $this->_getDataOne('topic_text');
}
/**
* Возвращает короткий текст топика (до ката)
*
* @return string|null
*/
public function getTextShort() {
return $this->_getDataOne('topic_text_short');
}
/**
* Возвращает исходный текст топика, без примененя парсера тегов
*
* @return string|null
*/
public function getTextSource() {
return $this->_getDataOne('topic_text_source');
}
/**
* Возвращает сериализованные строку дополнительный данных топика
*
* @return string
*/
public function getExtra() {
return $this->_getDataOne('topic_extra') ? $this->_getDataOne('topic_extra') : serialize('');
}
/**
* Возвращает строку со списком тегов через запятую
*
* @return string|null
*/
public function getTags() {
return $this->_getDataOne('topic_tags');
}
/**
* Возвращает дату создания топика
*
* @return string|null
*/
public function getDateAdd() {
return $this->_getDataOne('topic_date_add');
}
/**
* Возвращает дату редактирования топика
*
* @return string|null
*/
public function getDateEdit() {
return $this->_getDataOne('topic_date_edit');
}
/**
* Возвращает IP пользователя
*
* @return string|null
*/
public function getUserIp() {
return $this->_getDataOne('topic_user_ip');
}
/**
* Возвращает статус опубликованности топика
*
* @return int|null
*/
public function getPublish() {
return $this->_getDataOne('topic_publish');
}
/**
* Возвращает статус опубликованности черновика
*
* @return int|null
*/
public function getPublishDraft() {
return $this->_getDataOne('topic_publish_draft');
}
/**
* Возвращает статус публикации топика на главной странице
*
* @return int|null
*/
public function getPublishIndex() {
return $this->_getDataOne('topic_publish_index');
}
/**
* Возвращает рейтинг топика
*
* @return string
*/
public function getRating() {
return number_format(round($this->_getDataOne('topic_rating'),2), 0, '.', '');
}
/**
* Возвращает число проголосовавших за топик
*
* @return int|null
*/
public function getCountVote() {
return $this->_getDataOne('topic_count_vote');
}
/**
* Возвращает число проголосовавших за топик положительно
*
* @return int|null
*/
public function getCountVoteUp() {
return $this->_getDataOne('topic_count_vote_up');
}
/**
* Возвращает число проголосовавших за топик отрицательно
*
* @return int|null
*/
public function getCountVoteDown() {
return $this->_getDataOne('topic_count_vote_down');
}
/**
* Возвращает число воздержавшихся при голосовании за топик
*
* @return int|null
*/
public function getCountVoteAbstain() {
return $this->_getDataOne('topic_count_vote_abstain');
}
/**
* Возвращает число прочтений топика
*
* @return int|null
*/
public function getCountRead() {
return $this->_getDataOne('topic_count_read');
}
/**
* Возвращает количество комментариев к топику
*
* @return int|null
*/
public function getCountComment() {
return $this->_getDataOne('topic_count_comment');
}
/**
* Возвращает текст ката
*
* @return string|null
*/
public function getCutText() {
return $this->_getDataOne('topic_cut_text');
}
/**
* Возвращает статус запрета комментировать топик
*
* @return int|null
*/
public function getForbidComment() {
return $this->_getDataOne('topic_forbid_comment');
}
/**
* Возвращает хеш топика для проверки топика на уникальность
*
* @return string|null
*/
public function getTextHash() {
return $this->_getDataOne('topic_text_hash');
}
/**
* Возвращает массив тегов
*
* @return array
*/
public function getTagsArray() {
if ($this->getTags()) {
return explode(',',$this->getTags());
}
return array();
}
/**
* Возвращает количество новых комментариев в топике для текущего пользователя
*
* @return int|null
*/
public function getCountCommentNew() {
return $this->_getDataOne('count_comment_new');
}
/**
* Возвращает дату прочтения топика для текущего пользователя
*
* @return string|null
*/
public function getDateRead() {
return $this->_getDataOne('date_read');
}
/**
* Возвращает объект пользователя, автора топик
*
* @return ModuleUser_EntityUser|null
*/
public function getUser() {
if (!$this->_getDataOne('user')) {
$this->_aData['user']=$this->User_GetUserById($this->getUserId());
}
return $this->_getDataOne('user');
}
/**
* Возвращает объект блого, в котором находится топик
*
* @return ModuleBlog_EntityBlog|null
*/
public function getBlog() {
return $this->_getDataOne('blog');
}
/**
* Возвращает полный URL до топика
*
* @return string
*/
public function getUrl() {
if ($this->getBlog()->getType()=='personal') {
return Router::GetPath('blog').$this->getId().'.html';
@ -198,21 +359,46 @@ class ModuleTopic_EntityTopic extends Entity {
return Router::GetPath('blog').$this->getBlog()->getUrl().'/'.$this->getId().'.html';
}
}
/**
* Возвращает объект голосования за топик текущим пользователем
*
* @return ModuleVote_EntityVote|null
*/
public function getVote() {
return $this->_getDataOne('vote');
}
/**
* Возвращает статус голосовал ли пользователь в топике-опросе
*
* @return bool|null
*/
public function getUserQuestionIsVote() {
return $this->_getDataOne('user_question_is_vote');
}
/**
* Проверяет находится ли данный топик в избранном у текущего пользователя
*
* @return bool
*/
public function getIsFavourite() {
if ($this->getFavourite()) {
return true;
}
return false;
}
/**
* Возвращает количество добавивших топик в избранное
*
* @return int|null
*/
public function getCountFavourite() {
return $this->_getDataOne('topic_count_favourite');
}
/**
* Возвращает объект подписки на новые комментарии к топику
*
* @return ModuleSubscribe_EntitySubscribe|null
*/
public function getSubscribeNewComment() {
if (!($oUserCurrent=$this->User_GetUserCurrent())) {
return null;
@ -225,18 +411,31 @@ class ModuleTopic_EntityTopic extends Entity {
***************************************************************************************************************************************************
*/
/**
* Извлекает сериализованные данные топика
*/
protected function extractExtra() {
if (is_null($this->aExtra)) {
$this->aExtra=@unserialize($this->getExtra());
}
}
/**
* Устанавливает значение нужного параметра
*
* @param string $sName Название параметра/данных
* @param mixed $data Данные
*/
protected function setExtraValue($sName,$data) {
$this->extractExtra();
$this->aExtra[$sName]=$data;
$this->setExtra($this->aExtra);
}
/**
* Извлекает значение параметра
*
* @param string $sName Название параметра
* @return null|mixed
*/
protected function getExtraValue($sName) {
$this->extractExtra();
if (isset($this->aExtra[$sName])) {
@ -245,7 +444,12 @@ class ModuleTopic_EntityTopic extends Entity {
return null;
}
// методы для топика-ссылки
/**
* Возвращает URL для топика-ссылки
*
* @param bool $bShort Укарачивать урл или нет
* @return null|string
*/
public function getLinkUrl($bShort=false) {
if ($this->getType()!='link') {
return null;
@ -271,25 +475,45 @@ class ModuleTopic_EntityTopic extends Entity {
}
return null;
}
/**
* Устанавливает URL для топика-ссылки
*
* @param string $data
*/
public function setLinkUrl($data) {
if ($this->getType()!='link') {
return;
}
$this->setExtraValue('url',$data);
}
/**
* Возвращает количество переходов по ссылке в топике-ссылке
*
* @return int|null
*/
public function getLinkCountJump() {
if ($this->getType()!='link') {
return null;
}
return (int)$this->getExtraValue('count_jump');
}
/**
* Устанавливает количество переходов по ссылке в топике-ссылке
*
* @param string $data
*/
public function setLinkCountJump($data) {
if ($this->getType()!='link') {
return;
}
$this->setExtraValue('count_jump',$data);
}
//методы для топика-вопроса
/**
* Добавляет вариант ответа в топик-опрос
*
* @param string $data
*/
public function addQuestionAnswer($data) {
if ($this->getType()!='question') {
return;
@ -298,12 +522,21 @@ class ModuleTopic_EntityTopic extends Entity {
$this->aExtra['answers'][]=array('text'=>$data,'count'=>0);
$this->setExtra($this->aExtra);
}
/**
* Очищает варианты ответа в топике-опрос
*/
public function clearQuestionAnswer() {
if ($this->getType()!='question') {
return;
}
$this->setExtraValue('answers',array());
}
/**
* Возвращает варианты ответа в топике-опрос
*
* @param bool $bSortVote
* @return array|null
*/
public function getQuestionAnswers($bSortVote=false) {
if ($this->getType()!='question') {
return null;
@ -318,6 +551,11 @@ class ModuleTopic_EntityTopic extends Entity {
}
return array();
}
/**
* Увеличивает количество ответов на данный вариант в топике-опросе
*
* @param int $sIdAnswer ID варианта ответа
*/
public function increaseQuestionAnswerVote($sIdAnswer) {
if ($aAnswers=$this->getQuestionAnswers()) {
if (isset($aAnswers[$sIdAnswer])) {
@ -327,6 +565,11 @@ class ModuleTopic_EntityTopic extends Entity {
}
}
}
/**
* Возвращает максимально количество ответов на вариант в топике-опросе
*
* @return int
*/
public function getQuestionAnswerMax() {
$aAnswers=$this->getQuestionAnswers();
$iMax=0;
@ -337,6 +580,12 @@ class ModuleTopic_EntityTopic extends Entity {
}
return $iMax;
}
/**
* Возвращает в процентах количество проголосовавших за конкретный вариант
*
* @param int $sIdAnswer ID варианта
* @return int|string
*/
public function getQuestionAnswerPercent($sIdAnswer) {
if ($aAnswers=$this->getQuestionAnswers()) {
if (isset($aAnswers[$sIdAnswer])) {
@ -349,26 +598,45 @@ class ModuleTopic_EntityTopic extends Entity {
}
}
}
/**
* Возвращает общее число принявших участие в опросе в топике-опросе
*
* @return int|null
*/
public function getQuestionCountVote() {
if ($this->getType()!='question') {
return null;
}
return (int)$this->getExtraValue('count_vote');
}
/**
* Устанавливает общее число принявших участие в опросе в топике-опросе
*
* @param int $data
*/
public function setQuestionCountVote($data) {
if ($this->getType()!='question') {
return;
}
$this->setExtraValue('count_vote',$data);
}
/**
* Возвращает число воздержавшихся от участия в опросе в топике-опросе
*
* @return int|null
*/
public function getQuestionCountVoteAbstain() {
if ($this->getType()!='question') {
return null;
}
return (int)$this->getExtraValue('count_vote_abstain');
}
/**
* Устанавливает число воздержавшихся от участия в опросе в топике-опросе
*
* @param int $data
* @return mixed
*/
public function setQuestionCountVoteAbstain($data) {
if ($this->getType()!='question') {
return;
@ -376,123 +644,313 @@ class ModuleTopic_EntityTopic extends Entity {
$this->setExtraValue('count_vote_abstain',$data);
}
// Методы для фото-топика
/**
* Возвращает фотографии из топика-фотосета
*
* @param int|null $iFromId ID с которого начинать выборку
* @param int|null $iCount Количество
* @return array
*/
public function getPhotosetPhotos($iFromId = null, $iCount = null) {
return $this->Topic_getPhotosByTopicId($this->getId(), $iFromId, $iCount);
}
/**
* Возвращает количество фотографий в топике-фотосете
*
* @return int|null
*/
public function getPhotosetCount() {
return $this->getExtraValue('count_photo');
}
/**
* Возвращает ID главной фото в топике-фотосете
*
* @return int|null
*/
public function getPhotosetMainPhotoId() {
return $this->getExtraValue('main_photo_id');
}
/**
* Устанавливает ID главной фото в топике-фотосете
*
* @param int $data
*/
public function setPhotosetMainPhotoId($data) {
$this->setExtraValue('main_photo_id',$data);
}
/**
* Устанавливает количество фотографий в топике-фотосете
*
* @param int $data
*/
public function setPhotosetCount($data) {
$this->setExtraValue('count_photo',$data);
}
//*************************************************************************************************************************************************
/**
* Устанваливает ID топика
*
* @param int $data
*/
public function setId($data) {
$this->_aData['topic_id']=$data;
}
/**
* Устанавливает ID блога
*
* @param int $data
*/
public function setBlogId($data) {
$this->_aData['blog_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает тип топика
*
* @param string $data
*/
public function setType($data) {
$this->_aData['topic_type']=$data;
}
/**
* Устанавливает заголовок топика
*
* @param string $data
*/
public function setTitle($data) {
$this->_aData['topic_title']=$data;
}
/**
* Устанавливает текст топика
*
* @param string $data
*/
public function setText($data) {
$this->_aData['topic_text']=$data;
}
/**
* Устанавливает сериализованную строчку дополнительных данных
*
* @param string $data
*/
public function setExtra($data) {
$this->_aData['topic_extra']=serialize($data);
}
/**
* Устанавливает короткий текст топика до ката
*
* @param string $data
*/
public function setTextShort($data) {
$this->_aData['topic_text_short']=$data;
}
/**
* Устаналивает исходный текст топика
*
* @param string $data
*/
public function setTextSource($data) {
$this->_aData['topic_text_source']=$data;
}
/**
* Устанавливает список тегов в виде строки
*
* @param string $data
*/
public function setTags($data) {
$this->_aData['topic_tags']=$data;
}
/**
* Устанавливает дату создания топика
*
* @param string $data
*/
public function setDateAdd($data) {
$this->_aData['topic_date_add']=$data;
}
/**
* Устанавливает дату редактирования топика
*
* @param string $data
*/
public function setDateEdit($data) {
$this->_aData['topic_date_edit']=$data;
}
/**
* Устанавливает IP пользователя
*
* @param string $data
*/
public function setUserIp($data) {
$this->_aData['topic_user_ip']=$data;
}
/**
* Устанавливает флаг публикации топика
*
* @param string $data
*/
public function setPublish($data) {
$this->_aData['topic_publish']=$data;
}
/**
* Устанавливает флаг публикации черновика
*
* @param string $data
*/
public function setPublishDraft($data) {
$this->_aData['topic_publish_draft']=$data;
}
/**
* Устанавливает флаг публикации на главной странице
*
* @param string $data
*/
public function setPublishIndex($data) {
$this->_aData['topic_publish_index']=$data;
}
/**
* Устанавливает рейтинг топика
*
* @param string $data
*/
public function setRating($data) {
$this->_aData['topic_rating']=$data;
}
/**
* Устанавливает количество проголосовавших
*
* @param int $data
*/
public function setCountVote($data) {
$this->_aData['topic_count_vote']=$data;
}
/**
* Устанавливает количество проголосовавших в плюс
*
* @param int $data
*/
public function setCountVoteUp($data) {
$this->_aData['topic_count_vote_up']=$data;
}
/**
* Устанавливает количество проголосовавших в минус
*
* @param int $data
*/
public function setCountVoteDown($data) {
$this->_aData['topic_count_vote_down']=$data;
}
/**
* Устанавливает число воздержавшихся
*
* @param int $data
*/
public function setCountVoteAbstain($data) {
$this->_aData['topic_count_vote_abstain']=$data;
}
/**
* Устанавливает число прочтения топика
*
* @param int $data
*/
public function setCountRead($data) {
$this->_aData['topic_count_read']=$data;
}
/**
* Устанавливает количество комментариев
*
* @param int $data
*/
public function setCountComment($data) {
$this->_aData['topic_count_comment']=$data;
}
/**
* Устанавливает текст ката
*
* @param string $data
*/
public function setCutText($data) {
$this->_aData['topic_cut_text']=$data;
}
/**
* Устанавливает флаг запрета коментирования топика
*
* @param int $data
*/
public function setForbidComment($data) {
$this->_aData['topic_forbid_comment']=$data;
}
/**
* Устанавливает хеш топика
*
* @param string $data
*/
public function setTextHash($data) {
$this->_aData['topic_text_hash']=$data;
}
/**
* Устанавливает объект пользователя
*
* @param ModuleUser_EntityUser $data
*/
public function setUser($data) {
$this->_aData['user']=$data;
}
/**
* Устанавливает объект блога
*
* @param ModuleBlog_EntityBlog $data
*/
public function setBlog($data) {
$this->_aData['blog']=$data;
}
/**
* Устанавливает факт голосования пользователя в топике-опросе
*
* @param int $data
*/
public function setUserQuestionIsVote($data) {
$this->_aData['user_question_is_vote']=$data;
}
/**
* Устанавливает объект голосования за топик
*
* @param ModuleVote_EntityVote $data
*/
public function setVote($data) {
$this->_aData['vote']=$data;
}
/**
* Устанавливает количество новых комментариев
*
* @param int $data
*/
public function setCountCommentNew($data) {
$this->_aData['count_comment_new']=$data;
}
/**
* Устанавливает дату прочтения топика текущим пользователем
*
* @param string $data
*/
public function setDateRead($data) {
$this->_aData['date_read']=$data;
}
/**
* Устанавливает количество пользователей, добавивших топик в избранное
*
* @param int $data
*/
public function setCountFavourite($data) {
$this->_aData['topic_count_favourite']=$data;
}

View file

@ -1,31 +1,74 @@
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
class ModuleTopic_EntityTopicPhoto extends Entity
{
public function getId()
{
/**
* Объект сущности фото в топике-фотосете
*
* @package modules.topic
* @since 1.0
*/
class ModuleTopic_EntityTopicPhoto extends Entity {
/**
* Возвращает ID фото
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('id');
}
public function getTopicId()
{
/**
* Возвращает ID топика
*
* @return int|null
*/
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
public function getTargetTmp()
{
/**
* Возвращает ключ временного владельца
*
* @return string|null
*/
public function getTargetTmp() {
return $this->_getDataOne('target_tmp');
}
public function getDescription()
{
/**
* Возвращает описание фото
*
* @return string|null
*/
public function getDescription() {
return $this->_getDataOne('description');
}
public function getPath()
{
/**
* Вовзращает полный веб путь до фото
*
* @return mixed|null
*/
public function getPath() {
return $this->_getDataOne('path');
}
public function getWebPath($sWidth = null)
{
/**
* Возвращает полный веб путь до фото определенного размера
*
* @param string|null $sWidth Размер фото, например, '100' или '150crop'
* @return null|string
*/
public function getWebPath($sWidth = null) {
if ($this->getPath()) {
if ($sWidth) {
$aPathInfo=pathinfo($this->getPath());
@ -38,17 +81,28 @@ class ModuleTopic_EntityTopicPhoto extends Entity
}
}
public function setTopicId($iTopicId)
{
/**
* Устанавливает ID топика
*
* @param int $iTopicId
*/
public function setTopicId($iTopicId) {
$this->_aData['topic_id'] = $iTopicId;
}
public function setTargetTmp($sTargetTmp)
{
/**
* Устанавливает ключ временного владельца
*
* @param string $sTargetTmp
*/
public function setTargetTmp($sTargetTmp) {
$this->_aData['target_tmp'] = $sTargetTmp;
}
public function setDescription($sDescription)
{
/**
* Устанавливает описание фото
*
* @param string $sDescription
*/
public function setDescription($sDescription) {
$this->_aData['description'] = $sDescription;
}
}

View file

@ -15,27 +15,61 @@
---------------------------------------------------------
*/
class ModuleTopic_EntityTopicQuestionVote extends Entity
{
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
public function getVoterId() {
return $this->_getDataOne('user_voter_id');
}
/**
* Объект сущности голосования в топике-опросе
*
* @package modules.topic
* @since 1.0
*/
class ModuleTopic_EntityTopicQuestionVote extends Entity {
/**
* Возвращает ID топика
*
* @return int|null
*/
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
/**
* Возвращает ID проголосовавшего пользователя
*
* @return int|null
*/
public function getVoterId() {
return $this->_getDataOne('user_voter_id');
}
/**
* Возвращает номер варианта
*
* @return int|null
*/
public function getAnswer() {
return $this->_getDataOne('answer');
}
return $this->_getDataOne('answer');
}
/**
* Устанавливает ID топика
*
* @param int $data
*/
public function setTopicId($data) {
$this->_aData['topic_id']=$data;
}
public function setVoterId($data) {
$this->_aData['user_voter_id']=$data;
}
public function setAnswer($data) {
$this->_aData['answer']=$data;
}
$this->_aData['topic_id']=$data;
}
/**
* Устанавливает ID проголосовавшего пользователя
*
* @param int $data
*/
public function setVoterId($data) {
$this->_aData['user_voter_id']=$data;
}
/**
* Устанавливает номер варианта
*
* @param int $data
*/
public function setAnswer($data) {
$this->_aData['answer']=$data;
}
}
?>

View file

@ -15,40 +15,94 @@
---------------------------------------------------------
*/
class ModuleTopic_EntityTopicRead extends Entity
{
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getDateRead() {
return $this->_getDataOne('date_read');
}
public function getCommentCountLast() {
return $this->_getDataOne('comment_count_last');
}
public function getCommentIdLast() {
return $this->_getDataOne('comment_id_last');
}
/**
* Объект сущности факта прочтения топика
*
* @package modules.topic
* @since 1.0
*/
class ModuleTopic_EntityTopicRead extends Entity {
/**
* Возвращает ID топика
*
* @return int|null
*/
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает дату прочтения
*
* @return string|null
*/
public function getDateRead() {
return $this->_getDataOne('date_read');
}
/**
* Возвращает число комментариев в последнем прочтении топика
*
* @return int|null
*/
public function getCommentCountLast() {
return $this->_getDataOne('comment_count_last');
}
/**
* Возвращает ID последнего комментария
*
* @return int|null
*/
public function getCommentIdLast() {
return $this->_getDataOne('comment_id_last');
}
/**
* Устанавливает ID топика
*
* @param int $data
*/
public function setTopicId($data) {
$this->_aData['topic_id']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setDateRead($data) {
$this->_aData['date_read']=$data;
}
public function setCommentCountLast($data) {
$this->_aData['comment_count_last']=$data;
}
public function setCommentIdLast($data) {
$this->_aData['comment_id_last']=$data;
}
$this->_aData['topic_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает дату прочтения
*
* @param string $data
*/
public function setDateRead($data) {
$this->_aData['date_read']=$data;
}
/**
* Устанавливает число комментариев в последнем прочтении топика
*
* @param int $data
*/
public function setCommentCountLast($data) {
$this->_aData['comment_count_last']=$data;
}
/**
* Устанавливает ID последнего комментария
*
* @param int $data
*/
public function setCommentIdLast($data) {
$this->_aData['comment_id_last']=$data;
}
}
?>

View file

@ -15,51 +15,119 @@
---------------------------------------------------------
*/
class ModuleTopic_EntityTopicTag extends Entity
{
public function getId() {
return $this->_getDataOne('topic_tag_id');
}
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getBlogId() {
return $this->_getDataOne('blog_id');
}
public function getText() {
return $this->_getDataOne('topic_tag_text');
}
public function getCount() {
return $this->_getDataOne('count');
}
public function getSize() {
return $this->_getDataOne('size');
}
/**
* Объект сущности тега топика
*
* @package modules.topic
* @since 1.0
*/
class ModuleTopic_EntityTopicTag extends Entity {
/**
* Возвращает ID тега
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('topic_tag_id');
}
/**
* Возвращает ID топика
*
* @return int|null
*/
public function getTopicId() {
return $this->_getDataOne('topic_id');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает ID блога
*
* @return int|null
*/
public function getBlogId() {
return $this->_getDataOne('blog_id');
}
/**
* Возвращает текст тега
*
* @return string|null
*/
public function getText() {
return $this->_getDataOne('topic_tag_text');
}
/**
* Возвращает количество тегов
*
* @return int|null
*/
public function getCount() {
return $this->_getDataOne('count');
}
/**
* Возвращает просчитанный размер тега для облака тегов
*
* @return int|null
*/
public function getSize() {
return $this->_getDataOne('size');
}
/**
* Устанавливает ID тега
*
* @param int $data
*/
public function setId($data) {
$this->_aData['topic_tag_id']=$data;
}
public function setTopicId($data) {
$this->_aData['topic_id']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setBlogId($data) {
$this->_aData['blog_id']=$data;
}
public function setText($data) {
$this->_aData['topic_tag_text']=$data;
}
$this->_aData['topic_tag_id']=$data;
}
/**
* Устанавливает ID топика
*
* @param int $data
*/
public function setTopicId($data) {
$this->_aData['topic_id']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает ID блога
*
* @param int $data
*/
public function setBlogId($data) {
$this->_aData['blog_id']=$data;
}
/**
* Устанавливает текст тега
*
* @param string $data
*/
public function setText($data) {
$this->_aData['topic_tag_text']=$data;
}
/**
* Устанавливает просчитанный размер тега для облака тегов
*
* @param int $data
*/
public function setSize($data) {
$this->_aData['size']=$data;
}
$this->_aData['size']=$data;
}
}
?>

View file

@ -15,8 +15,19 @@
---------------------------------------------------------
*/
class ModuleTopic_MapperTopic extends Mapper {
/**
* Объект маппера для работы с БД
*
* @package modules.topic
* @since 1.0
*/
class ModuleTopic_MapperTopic extends Mapper {
/**
* Добавляет топик
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return int|bool
*/
public function AddTopic(ModuleTopic_EntityTopic $oTopic) {
$sql = "INSERT INTO ".Config::Get('db.table.topic')."
(blog_id,
@ -34,17 +45,22 @@ class ModuleTopic_MapperTopic extends Mapper {
topic_text_hash
)
VALUES(?d, ?d, ?, ?, ?, ?, ?, ?d, ?d, ?d, ?, ?, ?)
";
";
if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash()))
$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash()))
{
$oTopic->setId($iId);
$this->AddTopicContent($oTopic);
return $iId;
}
}
return false;
}
/**
* Добавляет контент топика
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return int|bool
*/
public function AddTopicContent(ModuleTopic_EntityTopic $oTopic) {
$sql = "INSERT INTO ".Config::Get('db.table.topic_content')."
(topic_id,
@ -54,15 +70,20 @@ class ModuleTopic_MapperTopic extends Mapper {
topic_extra
)
VALUES(?d, ?, ?, ?, ? )
";
";
if ($iId=$this->oDb->query($sql,$oTopic->getId(),$oTopic->getText(),
$oTopic->getTextShort(),$oTopic->getTextSource(),$oTopic->getExtra()))
$oTopic->getTextShort(),$oTopic->getTextSource(),$oTopic->getExtra()))
{
return $iId;
}
}
return false;
}
/**
* Добавление тега к топику
*
* @param ModuleTopic_EntityTopicTag $oTopicTag Объект тега топика
* @return int
*/
public function AddTopicTag(ModuleTopic_EntityTopicTag $oTopicTag) {
$sql = "INSERT INTO ".Config::Get('db.table.topic_tag')."
(topic_id,
@ -71,45 +92,66 @@ class ModuleTopic_MapperTopic extends Mapper {
topic_tag_text
)
VALUES(?d, ?d, ?d, ?)
";
if ($iId=$this->oDb->query($sql,$oTopicTag->getTopicId(),$oTopicTag->getUserId(),$oTopicTag->getBlogId(),$oTopicTag->getText()))
";
if ($iId=$this->oDb->query($sql,$oTopicTag->getTopicId(),$oTopicTag->getUserId(),$oTopicTag->getBlogId(),$oTopicTag->getText()))
{
return $iId;
}
}
return false;
}
/**
* Удаление контента топика по его номеру
*
* @param int $iTopicId ID топика
* @return bool
*/
public function DeleteTopicContentByTopicId($iTopicId) {
$sql = "DELETE FROM ".Config::Get('db.table.topic_content')." WHERE topic_id = ?d ";
if ($this->oDb->query($sql,$iTopicId)) {
return true;
}
}
return false;
}
/**
* Удаляет теги у топика
*
* @param int $sTopicId ID топика
* @return bool
*/
public function DeleteTopicTagsByTopicId($sTopicId) {
$sql = "DELETE FROM ".Config::Get('db.table.topic_tag')."
WHERE
topic_id = ?d
";
";
if ($this->oDb->query($sql,$sTopicId)) {
return true;
}
}
return false;
}
/**
* Удаляет топик.
* Если тип таблиц в БД InnoDB, то удалятся всё связи по топику(комменты,голосования,избранное)
*
* @param int $sTopicId Объект топика или ID
* @return bool
*/
public function DeleteTopic($sTopicId) {
$sql = "DELETE FROM ".Config::Get('db.table.topic')."
WHERE
topic_id = ?d
";
";
if ($this->oDb->query($sql,$sTopicId)) {
return true;
}
}
return false;
}
/**
* Получает топик по уникальному хешу(текст топика)
*
* @param int $sUserId
* @param string $sHash
* @return int|null
*/
public function GetTopicUnique($sUserId,$sHash) {
$sql = "SELECT topic_id FROM ".Config::Get('db.table.topic')."
WHERE
@ -123,12 +165,17 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return null;
}
/**
* Получить список топиков по списку айдишников
*
* @param array $aArrayId Список ID топиков
* @return array
*/
public function GetTopicsByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
t.*,
tc.*
@ -143,21 +190,28 @@ class ModuleTopic_MapperTopic extends Mapper {
foreach ($aRows as $aTopic) {
$aTopics[]=Engine::GetEntity('Topic',$aTopic);
}
}
}
return $aTopics;
}
/**
* Список топиков по фильтру
*
* @param array $aFilter Фильтр
* @param int $iCount Возвращает общее число элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTopics($aFilter,&$iCount,$iCurrPage,$iPerPage) {
$sWhere=$this->buildFilter($aFilter);
if(!isset($aFilter['order'])) {
$aFilter['order'] = 't.topic_date_add desc';
}
if (!is_array($aFilter['order'])) {
$aFilter['order'] = array($aFilter['order']);
}
$sql = "SELECT
t.topic_id
FROM
@ -169,19 +223,24 @@ class ModuleTopic_MapperTopic extends Mapper {
AND
t.blog_id=b.blog_id
ORDER BY ".
implode(', ', $aFilter['order'])
."
LIMIT ?d, ?d";
implode(', ', $aFilter['order'])
."
LIMIT ?d, ?d";
$aTopics=array();
if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage)) {
if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage)) {
foreach ($aRows as $aTopic) {
$aTopics[]=$aTopic['topic_id'];
}
}
}
return $aTopics;
}
public function GetCountTopics($aFilter) {
/**
* Количество топиков по фильтру
*
* @param array $aFilter Фильтр
* @return int
*/
public function GetCountTopics($aFilter) {
$sWhere=$this->buildFilter($aFilter);
$sql = "SELECT
count(t.topic_id) as count
@ -194,23 +253,28 @@ class ModuleTopic_MapperTopic extends Mapper {
".$sWhere."
AND
t.blog_id=b.blog_id;";
t.blog_id=b.blog_id;";
if ($aRow=$this->oDb->selectRow($sql)) {
return $aRow['count'];
}
return false;
}
/**
* Возвращает все топики по фильтру
*
* @param array $aFilter Фильтр
* @return array
*/
public function GetAllTopics($aFilter) {
$sWhere=$this->buildFilter($aFilter);
if(!isset($aFilter['order'])) {
$aFilter['order'] = 't.topic_id desc';
}
if (!is_array($aFilter['order'])) {
$aFilter['order'] = array($aFilter['order']);
}
$sql = "SELECT
t.topic_id
FROM
@ -221,18 +285,27 @@ class ModuleTopic_MapperTopic extends Mapper {
".$sWhere."
AND
t.blog_id=b.blog_id
ORDER by ".implode(', ', $aFilter['order'])." ";
ORDER by ".implode(', ', $aFilter['order'])." ";
$aTopics=array();
if ($aRows=$this->oDb->select($sql)) {
if ($aRows=$this->oDb->select($sql)) {
foreach ($aRows as $aTopic) {
$aTopics[]=$aTopic['topic_id'];
}
}
}
return $aTopics;
return $aTopics;
}
public function GetTopicsByTag($sTag,$aExcludeBlog,&$iCount,$iCurrPage,$iPerPage) {
/**
* Получает список топиков по тегу
*
* @param string $sTag Тег
* @param array $aExcludeBlog Список ID блогов для исключения
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetTopicsByTag($sTag,$aExcludeBlog,&$iCount,$iCurrPage,$iPerPage) {
$sql = "
SELECT
topic_id
@ -243,13 +316,13 @@ class ModuleTopic_MapperTopic extends Mapper {
{ AND blog_id NOT IN (?a) }
ORDER BY topic_id DESC
LIMIT ?d, ?d ";
$aTopics=array();
if ($aRows=$this->oDb->selectPage(
$iCount,$sql,$sTag,
(is_array($aExcludeBlog)&&count($aExcludeBlog)) ? $aExcludeBlog : DBSIMPLE_SKIP,
($iCurrPage-1)*$iPerPage, $iPerPage
)
$iCount,$sql,$sTag,
(is_array($aExcludeBlog)&&count($aExcludeBlog)) ? $aExcludeBlog : DBSIMPLE_SKIP,
($iCurrPage-1)*$iPerPage, $iPerPage
)
) {
foreach ($aRows as $aTopic) {
$aTopics[]=$aTopic['topic_id'];
@ -257,8 +330,14 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $aTopics;
}
/**
* Получает топики по рейтингу и дате
*
* @param string $sDate Дата
* @param int $iLimit Количество
* @param array $aExcludeBlog Список ID блогов для исключения
* @return array
*/
public function GetTopicsRatingByDate($sDate,$iLimit,$aExcludeBlog=array()) {
$sql = "SELECT
t.topic_id
@ -272,13 +351,13 @@ class ModuleTopic_MapperTopic extends Mapper {
t.topic_rating >= 0
{ AND t.blog_id NOT IN(?a) }
ORDER by t.topic_rating desc, t.topic_id desc
LIMIT 0, ?d ";
LIMIT 0, ?d ";
$aTopics=array();
if ($aRows=$this->oDb->select(
$sql,$sDate,
(is_array($aExcludeBlog)&&count($aExcludeBlog)) ? $aExcludeBlog : DBSIMPLE_SKIP,
$iLimit
)
$sql,$sDate,
(is_array($aExcludeBlog)&&count($aExcludeBlog)) ? $aExcludeBlog : DBSIMPLE_SKIP,
$iLimit
)
) {
foreach ($aRows as $aTopic) {
$aTopics[]=$aTopic['topic_id'];
@ -286,7 +365,13 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $aTopics;
}
/**
* Получает список тегов топиков
*
* @param int $iLimit Количество
* @param array $aExcludeTopic Список ID топиков для исключения
* @return array
*/
public function GetTopicTags($iLimit,$aExcludeTopic=array()) {
$sql = "SELECT
tt.topic_tag_text,
@ -301,26 +386,32 @@ class ModuleTopic_MapperTopic extends Mapper {
ORDER BY
count desc
LIMIT 0, ?d
";
";
$aReturn=array();
$aReturnSort=array();
if ($aRows=$this->oDb->select(
$sql,
(is_array($aExcludeTopic)&&count($aExcludeTopic)) ? $aExcludeTopic : DBSIMPLE_SKIP,
$iLimit
)
$sql,
(is_array($aExcludeTopic)&&count($aExcludeTopic)) ? $aExcludeTopic : DBSIMPLE_SKIP,
$iLimit
)
) {
foreach ($aRows as $aRow) {
foreach ($aRows as $aRow) {
$aReturn[mb_strtolower($aRow['topic_tag_text'],'UTF-8')]=$aRow;
}
ksort($aReturn);
foreach ($aReturn as $aRow) {
$aReturnSort[]=Engine::GetEntity('Topic_TopicTag',$aRow);
$aReturnSort[]=Engine::GetEntity('Topic_TopicTag',$aRow);
}
}
return $aReturnSort;
}
/**
* Получает список тегов из топиков открытых блогов (open,personal)
*
* @param int $iLimit Количество
* @param int|null $iUserId ID пользователя, чью теги получаем
* @return array
*/
public function GetOpenTopicTags($iLimit,$iUserId=null) {
$sql = "
SELECT
@ -341,36 +432,45 @@ class ModuleTopic_MapperTopic extends Mapper {
ORDER BY
count desc
LIMIT 0, ?d
";
";
$aReturn=array();
$aReturnSort=array();
if ($aRows=$this->oDb->select($sql,is_null($iUserId) ? DBSIMPLE_SKIP : $iUserId,$iLimit)) {
foreach ($aRows as $aRow) {
foreach ($aRows as $aRow) {
$aReturn[mb_strtolower($aRow['topic_tag_text'],'UTF-8')]=$aRow;
}
ksort($aReturn);
foreach ($aReturn as $aRow) {
$aReturnSort[]=Engine::GetEntity('Topic_TopicTag',$aRow);
$aReturnSort[]=Engine::GetEntity('Topic_TopicTag',$aRow);
}
}
return $aReturnSort;
}
/**
* Увеличивает у топика число комментов
*
* @param int $sTopicId ID топика
* @return bool
*/
public function increaseTopicCountComment($sTopicId) {
$sql = "UPDATE ".Config::Get('db.table.topic')."
SET
topic_count_comment=topic_count_comment+1
WHERE
topic_id = ?
";
";
if ($this->oDb->query($sql,$sTopicId)) {
return true;
}
}
return false;
}
public function UpdateTopic(ModuleTopic_EntityTopic $oTopic) {
/**
* Обновляет топик
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return bool
*/
public function UpdateTopic(ModuleTopic_EntityTopic $oTopic) {
$sql = "UPDATE ".Config::Get('db.table.topic')."
SET
blog_id= ?d,
@ -395,15 +495,20 @@ class ModuleTopic_MapperTopic extends Mapper {
topic_text_hash = ?
WHERE
topic_id = ?d
";
";
if ($this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getTitle(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateEdit(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getRating(),$oTopic->getCountVote(),$oTopic->getCountVoteUp(),$oTopic->getCountVoteDown(),$oTopic->getCountVoteAbstain(),$oTopic->getCountRead(),$oTopic->getCountComment(),$oTopic->getCountFavourite(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getTextHash(),$oTopic->getId())) {
$this->UpdateTopicContent($oTopic);
return true;
}
}
return false;
}
public function UpdateTopicContent(ModuleTopic_EntityTopic $oTopic) {
/**
* Обновляет контент топика
*
* @param ModuleTopic_EntityTopic $oTopic Объект топика
* @return bool
*/
public function UpdateTopicContent(ModuleTopic_EntityTopic $oTopic) {
$sql = "UPDATE ".Config::Get('db.table.topic_content')."
SET
topic_text= ?,
@ -412,13 +517,18 @@ class ModuleTopic_MapperTopic extends Mapper {
topic_extra= ?
WHERE
topic_id = ?d
";
";
if ($this->oDb->query($sql,$oTopic->getText(),$oTopic->getTextShort(),$oTopic->getTextSource(),$oTopic->getExtra(),$oTopic->getId())) {
return true;
}
}
return false;
}
/**
* Строит строку условий для SQL запроса топиков
*
* @param array $aFilter Фильтр
* @return string
*/
protected function buildFilter($aFilter) {
$sWhere='';
if (isset($aFilter['topic_date_more'])) {
@ -426,7 +536,7 @@ class ModuleTopic_MapperTopic extends Mapper {
}
if (isset($aFilter['topic_publish'])) {
$sWhere.=" AND t.topic_publish = ".(int)$aFilter['topic_publish'];
}
}
if (isset($aFilter['topic_rating']) and is_array($aFilter['topic_rating'])) {
$sPublishIndex='';
if (isset($aFilter['topic_rating']['publish_index']) and $aFilter['topic_rating']['publish_index']==1) {
@ -436,7 +546,7 @@ class ModuleTopic_MapperTopic extends Mapper {
$sWhere.=" AND ( t.topic_rating >= ".(float)$aFilter['topic_rating']['value']." {$sPublishIndex} ) ";
} else {
$sWhere.=" AND ( t.topic_rating < ".(float)$aFilter['topic_rating']['value']." ) ";
}
}
}
if (isset($aFilter['topic_new'])) {
$sWhere.=" AND t.topic_date_add >= '".$aFilter['topic_new']."'";
@ -468,8 +578,8 @@ class ModuleTopic_MapperTopic extends Mapper {
$sType=$aBlogId;
$aBlogId=array();
}
$aBlogTypes[] = (count($aBlogId)==0)
$aBlogTypes[] = (count($aBlogId)==0)
? "(b.blog_type='".$sType."')"
: "(b.blog_type='".$sType."' AND t.blog_id IN ('".join("','",$aBlogId)."'))";
}
@ -483,9 +593,15 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $sWhere;
}
/**
* Получает список тегов по первым буквам тега
*
* @param string $sTag Тэг
* @param int $iLimit Количество
* @return bool
*/
public function GetTopicTagsByLike($sTag,$iLimit) {
$sTag=mb_strtolower($sTag,"UTF-8");
$sTag=mb_strtolower($sTag,"UTF-8");
$sql = "SELECT
topic_tag_text
FROM
@ -495,7 +611,7 @@ class ModuleTopic_MapperTopic extends Mapper {
GROUP BY
topic_tag_text
LIMIT 0, ?d
";
";
$aReturn=array();
if ($aRows=$this->oDb->select($sql,$sTag.'%',$iLimit)) {
foreach ($aRows as $aRow) {
@ -504,8 +620,13 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $aReturn;
}
public function UpdateTopicRead(ModuleTopic_EntityTopicRead $oTopicRead) {
/**
* Обновляем дату прочтения топика
*
* @param ModuleTopic_EntityTopicRead $oTopicRead Объект факта чтения топика
* @return int
*/
public function UpdateTopicRead(ModuleTopic_EntityTopicRead $oTopicRead) {
$sql = "UPDATE ".Config::Get('db.table.topic_read')."
SET
comment_count_last = ? ,
@ -515,11 +636,16 @@ class ModuleTopic_MapperTopic extends Mapper {
topic_id = ?
AND
user_id = ?
";
";
return $this->oDb->query($sql,$oTopicRead->getCommentCountLast(),$oTopicRead->getCommentIdLast(),$oTopicRead->getDateRead(),$oTopicRead->getTopicId(),$oTopicRead->getUserId());
}
public function AddTopicRead(ModuleTopic_EntityTopicRead $oTopicRead) {
}
/**
* Устанавливаем дату прочтения топика
*
* @param ModuleTopic_EntityTopicRead $oTopicRead Объект факта чтения топика
* @return bool
*/
public function AddTopicRead(ModuleTopic_EntityTopicRead $oTopicRead) {
$sql = "INSERT INTO ".Config::Get('db.table.topic_read')."
SET
comment_count_last = ? ,
@ -527,32 +653,38 @@ class ModuleTopic_MapperTopic extends Mapper {
date_read = ? ,
topic_id = ? ,
user_id = ?
";
";
return $this->oDb->query($sql,$oTopicRead->getCommentCountLast(),$oTopicRead->getCommentIdLast(),$oTopicRead->getDateRead(),$oTopicRead->getTopicId(),$oTopicRead->getUserId());
}
/**
* Удаляет записи о чтении записей по списку идентификаторов
*
* @param array $aTopicId
* @param array $aTopicId Список ID топиков
* @return bool
*/
*/
public function DeleteTopicReadByArrayId($aTopicId) {
$sql = "
DELETE FROM ".Config::Get('db.table.topic_read')."
WHERE
topic_id IN(?a)
";
";
if ($this->oDb->query($sql,$aTopicId)) {
return true;
}
return false;
}
/**
* Получить список просмотром/чтения топиков по списку айдишников
*
* @param array $aArrayId Список ID топиков
* @param int $sUserId ID пользователя
* @return array
*/
public function GetTopicsReadByArray($aArrayId,$sUserId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
t.*
FROM
@ -567,10 +699,15 @@ class ModuleTopic_MapperTopic extends Mapper {
foreach ($aRows as $aRow) {
$aReads[]=Engine::GetEntity('Topic_TopicRead',$aRow);
}
}
}
return $aReads;
}
/**
* Добавляет факт голосования за топик-вопрос
*
* @param ModuleTopic_EntityTopicQuestionVote $oTopicQuestionVote Объект голосования в топике-опросе
* @return bool
*/
public function AddTopicQuestionVote(ModuleTopic_EntityTopicQuestionVote $oTopicQuestionVote) {
$sql = "INSERT INTO ".Config::Get('db.table.topic_question_vote')."
(topic_id,
@ -578,20 +715,25 @@ class ModuleTopic_MapperTopic extends Mapper {
answer
)
VALUES(?d, ?d, ?f)
";
if ($this->oDb->query($sql,$oTopicQuestionVote->getTopicId(),$oTopicQuestionVote->getVoterId(),$oTopicQuestionVote->getAnswer())===0)
";
if ($this->oDb->query($sql,$oTopicQuestionVote->getTopicId(),$oTopicQuestionVote->getVoterId(),$oTopicQuestionVote->getAnswer())===0)
{
return true;
}
}
return false;
}
/**
* Получить список голосований в топике-опросе по списку айдишников
*
* @param array $aArrayId Список ID топиков
* @param int $sUserId ID пользователя
* @return array
*/
public function GetTopicsQuestionVoteByArray($aArrayId,$sUserId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
v.*
FROM
@ -606,57 +748,54 @@ class ModuleTopic_MapperTopic extends Mapper {
foreach ($aRows as $aRow) {
$aVotes[]=Engine::GetEntity('Topic_TopicQuestionVote',$aRow);
}
}
}
return $aVotes;
}
/**
* Перемещает топики в другой блог
*
* @param array $aTopics
* @param string $sBlogId
* @param array $aTopics Список ID топиков
* @param int $sBlogId ID блога
* @return bool
*/
*/
public function MoveTopicsByArrayId($aTopics,$sBlogId) {
if(!is_array($aTopics)) $aTopics = array($aTopics);
$sql = "UPDATE ".Config::Get('db.table.topic')."
SET
blog_id= ?d
WHERE
topic_id IN(?a)
";
";
if ($this->oDb->query($sql,$sBlogId,$aTopics)) {
return true;
}
}
return false;
}
/**
* Перемещает топики в другой блог
*
* @param string $sBlogId
* @param string $sBlogIdNew
* @param int $sBlogId ID старого блога
* @param int $sBlogIdNew ID нового блога
* @return bool
*/
*/
public function MoveTopics($sBlogId,$sBlogIdNew) {
$sql = "UPDATE ".Config::Get('db.table.topic')."
SET
blog_id= ?d
WHERE
blog_id = ?d
";
";
if ($this->oDb->query($sql,$sBlogIdNew,$sBlogId)) {
return true;
}
}
return false;
}
/**
* Перемещает теги топиков в другой блог
*
* @param string $sBlogId
* @param string $sBlogIdNew
* @param int $sBlogId ID старого блога
* @param int $sBlogIdNew ID нового блога
* @return bool
*/
public function MoveTopicsTags($sBlogId,$sBlogIdNew) {
@ -665,42 +804,38 @@ class ModuleTopic_MapperTopic extends Mapper {
blog_id= ?d
WHERE
blog_id = ?d
";
";
if ($this->oDb->query($sql,$sBlogIdNew,$sBlogId)) {
return true;
}
}
return false;
}
/**
* Перемещает теги топиков в другой блог
*
* @param array $aTopics
* @param string $sBlogId
* @param array $aTopics Список ID топиков
* @param int $sBlogId ID блога
* @return bool
*/
public function MoveTopicsTagsByArrayId($aTopics,$sBlogId) {
if(!is_array($aTopics)) $aTopics = array($aTopics);
$sql = "UPDATE ".Config::Get('db.table.topic_tag')."
SET
blog_id= ?d
WHERE
topic_id IN(?a)
";
";
if ($this->oDb->query($sql,$sBlogId,$aTopics)) {
return true;
}
}
return false;
}
/**
* Возвращает список фоток из фото-сета по списку id фоток
* Возвращает список фотографий к топику-фотосет по списку id фоток
*
* @param unknown_type $aArrayId
* @return unknown
* @param array $aPhotoId Список ID фото
* @return array
*/
public function GetTopicPhotosByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
@ -722,16 +857,15 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $aReturn;
}
public function getPhotosByTopicId($iTopicId, $iFromId, $iCount)
{
/**
* Получить список изображений из фотосета по id топика
*
* @param int $iTopicId ID топика
* @param int|null $iFromId ID с которого начинать выборку
* @param int|null $iCount Количество
* @return array
*/
public function getPhotosByTopicId($iTopicId, $iFromId, $iCount) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.topic_photo') . ' WHERE topic_id = ?d {AND id > ?d LIMIT 0, ?d}';
$aPhotos = $this->oDb->select($sql, $iTopicId, ($iFromId !== null) ? $iFromId : DBSIMPLE_SKIP, $iCount);
$aReturn = array();
@ -742,9 +876,13 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $aReturn;
}
public function getPhotosByTargetTmp($sTargetTmp)
{
/**
* Получить список изображений из фотосета по временному коду
*
* @param string $sTargetTmp Временный ключ
* @return array
*/
public function getPhotosByTargetTmp($sTargetTmp) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.topic_photo') . ' WHERE target_tmp = ?';
$aPhotos = $this->oDb->select($sql, $sTargetTmp);
$aReturn = array();
@ -755,9 +893,13 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return $aReturn;
}
public function getTopicPhotoById($iPhotoId)
{
/**
* Получить изображение из фотосета по его id
*
* @param int $iPhotoId ID фото
* @return ModuleTopic_EntityTopicPhoto|null
*/
public function getTopicPhotoById($iPhotoId) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.topic_photo') . ' WHERE id = ?d';
$aPhoto = $this->oDb->selectRow($sql, $iPhotoId);
if ($aPhoto) {
@ -766,23 +908,35 @@ class ModuleTopic_MapperTopic extends Mapper {
return null;
}
}
public function getCountPhotosByTopicId($iTopicId)
{
/**
* Получить число изображений из фотосета по id топика
*
* @param int $iTopicId ID топика
* @return int
*/
public function getCountPhotosByTopicId($iTopicId) {
$sql = 'SELECT count(id) FROM ' . Config::Get('db.table.topic_photo') . ' WHERE topic_id = ?d';
$aPhotosCount = $this->oDb->selectCol($sql, $iTopicId);
return $aPhotosCount[0];
}
public function getCountPhotosByTargetTmp($sTargetTmp)
{
/**
* Получить число изображений из фотосета по id топика
*
* @param string $sTargetTmp Временный ключ
* @return int
*/
public function getCountPhotosByTargetTmp($sTargetTmp) {
$sql = 'SELECT count(id) FROM ' . Config::Get('db.table.topic_photo') . ' WHERE target_tmp = ?';
$aPhotosCount = $this->oDb->selectCol($sql, $sTargetTmp);
return $aPhotosCount[0];
}
public function addTopicPhoto($oPhoto)
{
/**
* Добавить к топику изображение
*
* @param ModuleTopic_EntityTopicPhoto $oPhoto Объект фото к топику-фотосету
* @return bool
*/
public function addTopicPhoto($oPhoto) {
if (!$oPhoto->getTopicId() && !$oPhoto->getTargetTmp()) return false;
$sTargetType = ($oPhoto->getTopicId()) ? 'topic_id' : 'target_tmp';
$iTargetId = ($sTargetType == 'topic_id') ? $oPhoto->getTopicId() : $oPhoto->getTargetTmp();
@ -790,9 +944,12 @@ class ModuleTopic_MapperTopic extends Mapper {
path = ?, description = ?, ?# = ?';
return $this->oDb->query($sql, $oPhoto->getPath(), $oPhoto->getDescription(), $sTargetType, $iTargetId);
}
public function updateTopicPhoto($oPhoto)
{
/**
* Обновить данные по изображению
*
* @param ModuleTopic_EntityTopicPhoto $oPhoto Объект фото
*/
public function updateTopicPhoto($oPhoto) {
if (!$oPhoto->getTopicId() && !$oPhoto->getTargetTmp()) return false;
if ($oPhoto->getTopicId()) {
$oPhoto->setTargetTmp = null;
@ -801,14 +958,21 @@ class ModuleTopic_MapperTopic extends Mapper {
path = ?, description = ?, topic_id = ?d, target_tmp=? WHERE id = ?d';
$this->oDb->query($sql, $oPhoto->getPath(), $oPhoto->getDescription(), $oPhoto->getTopicId(), $oPhoto->getTargetTmp(), $oPhoto->getId());
}
public function deleteTopicPhoto($iPhotoId)
{
/**
* Удалить изображение
*
* @param int $iPhotoId ID фото
*/
public function deleteTopicPhoto($iPhotoId) {
$sql = 'DELETE FROM '. Config::Get('db.table.topic_photo') . ' WHERE
id= ?d';
$this->oDb->query($sql, $iPhotoId);
}
/**
* Пересчитывает счетчик избранных топиков
*
* @return bool
*/
public function RecalculateFavourite() {
$sql = "
UPDATE ".Config::Get('db.table.topic')." t
@ -828,7 +992,11 @@ class ModuleTopic_MapperTopic extends Mapper {
}
return false;
}
/**
* Пересчитывает счетчики голосований
*
* @return bool
*/
public function RecalculateVote() {
$sql = "
UPDATE ".Config::Get('db.table.topic')." t

View file

@ -18,6 +18,8 @@
/**
* Модуль для работы с пользователями
*
* @package modules.user
* @since 1.0
*/
class ModuleUser extends Module {
/**
@ -28,11 +30,24 @@ class ModuleUser extends Module {
const USER_FRIEND_DELETE = 4;
const USER_FRIEND_REJECT = 8;
const USER_FRIEND_NULL = 16;
/**
* Объект маппера
*
* @var ModuleUser_MapperUser
*/
protected $oMapper;
/**
* Объект текущего пользователя
*
* @var ModuleUser_EntityUser|null
*/
protected $oUserCurrent=null;
/**
* Объект сессии текущего пользователя
*
* @var ModuleUser_EntitySession|null
*/
protected $oSession=null;
/**
* Список типов пользовательских полей
*
@ -65,8 +80,6 @@ class ModuleUser extends Module {
* В куках стоит время на сколько запоминать юзера
*/
$this->AutoLogin();
$this->oMapper->SetUserCurrent($this->oUserCurrent);
/**
* Обновляем сессию
*/
@ -74,17 +87,19 @@ class ModuleUser extends Module {
$this->UpdateSession();
}
}
/**
* Возвращает список типов полей
*
* @return array
*/
public function GetUserFieldTypes() {
return $this->aUserFieldTypes;
}
/**
* Добавляет новый тип с пользовательские поля
* @param string $sType
*
* @param string $sType Тип
* @return bool
*/
public function AddUserFieldTypes($sType) {
if (!in_array($sType,$this->aUserFieldTypes)) {
@ -96,10 +111,13 @@ class ModuleUser extends Module {
/**
* Получает дополнительные данные(объекты) для юзеров по их ID
*
* @param array $aUserId Список ID пользователей
* @param array|null $aAllowData Список типод дополнительных данных для подгрузки у пользователей
* @return array
*/
public function GetUsersAdditionalData($aUserId,$aAllowData=null) {
if (is_null($aAllowData)) {
$aAllowData=array('vote','session','friend','geo_target');
$aAllowData=array('vote','session','friend','geo_target','note');
}
func_array_simpleflip($aAllowData);
if (!is_array($aUserId)) {
@ -116,6 +134,7 @@ class ModuleUser extends Module {
$aFriends=array();
$aVote=array();
$aGeoTargets=array();
$aNotes=array();
if (isset($aAllowData['session'])) {
$aSessions=$this->GetSessionsByArrayId($aUserId);
}
@ -129,6 +148,9 @@ class ModuleUser extends Module {
if (isset($aAllowData['geo_target'])) {
$aGeoTargets=$this->Geo_GetTargetsByTargetArray('user',$aUserId);
}
if (isset($aAllowData['note']) and $this->oUserCurrent) {
$aNotes=$this->GetUserNotesByArray($aUserId,$this->oUserCurrent->getId());
}
/**
* Добавляем данные к результату
*/
@ -155,6 +177,13 @@ class ModuleUser extends Module {
} else {
$oUser->setGeoTarget(null);
}
if (isset($aAllowData['note'])) {
if (isset($aNotes[$oUser->getId()])) {
$oUser->setUserNote($aNotes[$oUser->getId()]);
} else {
$oUser->setUserNote(false);
}
}
}
return $aUsers;
@ -162,7 +191,8 @@ class ModuleUser extends Module {
/**
* Список юзеров по ID
*
* @param array $aUserId
* @param array $aUserId Список ID пользователей
* @return array
*/
public function GetUsersByArrayId($aUserId) {
if (!$aUserId) {
@ -223,17 +253,21 @@ class ModuleUser extends Module {
$aUsers=func_array_sort_by_keys($aUsers,$aUserId);
return $aUsers;
}
/**
* Алиас для корректной работы ORM
*
* @param unknown_type $aUserId
* @return unknown
* @param array $aUserId Список ID пользователей
* @return array
*/
public function GetUserItemsByArrayId($aUserId) {
return $this->GetUsersByArrayId($aUserId);
}
/**
* Получение пользователей по списку ID используя общий кеш
*
* @param array $aUserId Список ID пользователей
* @return array
*/
public function GetUsersByArrayIdSolid($aUserId) {
if (!is_array($aUserId)) {
$aUserId=array($aUserId);
@ -254,7 +288,8 @@ class ModuleUser extends Module {
/**
* Список сессий юзеров по ID
*
* @param array $aUserId
* @param array $aUserId Список ID пользователей
* @return array
*/
public function GetSessionsByArrayId($aUserId) {
if (!$aUserId) {
@ -318,8 +353,8 @@ class ModuleUser extends Module {
/**
* Получить список сессий по списку айдишников, но используя единый кеш
*
* @param unknown_type $aUserId
* @return unknown
* @param array $aUserId Список ID пользователей
* @return array
*/
public function GetSessionsByArrayIdSolid($aUserId) {
if (!is_array($aUserId)) {
@ -341,8 +376,8 @@ class ModuleUser extends Module {
/**
* Получает сессию юзера
*
* @param unknown_type $sUserId
* @return unknown
* @param int $sUserId ID пользователя
* @return ModuleUser_EntitySession|null
*/
public function GetSessionByUserId($sUserId) {
$aSessions=$this->GetSessionsByArrayId($sUserId);
@ -365,8 +400,8 @@ class ModuleUser extends Module {
/**
* Добавляет юзера
*
* @param ModuleUser_EntityUser $oUser
* @return unknown
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return ModuleUser_EntityUser|bool
*/
public function Add(ModuleUser_EntityUser $oUser) {
if ($sId=$this->oMapper->Add($oUser)) {
@ -384,8 +419,8 @@ class ModuleUser extends Module {
/**
* Получить юзера по ключу активации
*
* @param unknown_type $sKey
* @return unknown
* @param string $sKey Ключ активации
* @return ModuleUser_EntityUser|null
*/
public function GetUserByActivateKey($sKey) {
$id=$this->oMapper->GetUserByActivateKey($sKey);
@ -394,8 +429,8 @@ class ModuleUser extends Module {
/**
* Получить юзера по ключу сессии
*
* @param unknown_type $sKey
* @return unknown
* @param string $sKey Сессионный ключ
* @return ModuleUser_EntityUser|null
*/
public function GetUserBySessionKey($sKey) {
$id=$this->oMapper->GetUserBySessionKey($sKey);
@ -404,8 +439,8 @@ class ModuleUser extends Module {
/**
* Получить юзера по мылу
*
* @param unknown_type $sMail
* @return unknown
* @param string $sMail Емайл
* @return ModuleUser_EntityUser|null
*/
public function GetUserByMail($sMail) {
$id=$this->oMapper->GetUserByMail($sMail);
@ -414,8 +449,8 @@ class ModuleUser extends Module {
/**
* Получить юзера по логину
*
* @param unknown_type $sLogin
* @return unknown
* @param string $sLogin Логин пользователя
* @return ModuleUser_EntityUser|null
*/
public function GetUserByLogin($sLogin) {
$s=strtolower($sLogin);
@ -429,10 +464,13 @@ class ModuleUser extends Module {
/**
* Получить юзера по айдишнику
*
* @param unknown_type $sId
* @return unknown
* @param int $sId ID пользователя
* @return ModuleUser_EntityUser|null
*/
public function GetUserById($sId) {
if (!is_numeric($sId)) {
return null;
}
$aUsers=$this->GetUsersAdditionalData($sId);
if (isset($aUsers[$sId])) {
return $aUsers[$sId];
@ -442,8 +480,8 @@ class ModuleUser extends Module {
/**
* Обновляет юзера
*
* @param ModuleUser_EntityUser $oUser
* @return unknown
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return bool
*/
public function Update(ModuleUser_EntityUser $oUser) {
//чистим зависимые кеши
@ -454,8 +492,10 @@ class ModuleUser extends Module {
/**
* Авторизовывает юзера
*
* @param ModuleUser_EntityUser $oUser
* @return unknown
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param bool $bRemember Запоминать пользователя или нет
* @param string $sKey Ключ авторизации для куков
* @return bool
*/
public function Authorization(ModuleUser_EntityUser $oUser,$bRemember=true,$sKey=null) {
if (!$oUser->getId() or !$oUser->getActivate()) {
@ -484,6 +524,7 @@ class ModuleUser extends Module {
if ($bRemember) {
setcookie('key',$sKey,time()+Config::Get('sys.cookie.time'),Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'));
}
return true;
}
/**
* Автоматическое заллогинивание по ключу из куков
@ -493,7 +534,7 @@ class ModuleUser extends Module {
if ($this->oUserCurrent) {
return;
}
if (isset($_COOKIE['key']) and $sKey=$_COOKIE['key']) {
if (isset($_COOKIE['key']) and is_string($_COOKIE['key']) and $sKey=$_COOKIE['key']) {
if ($oUser=$this->GetUserBySessionKey($sKey)) {
$this->Authorization($oUser);
} else {
@ -504,7 +545,7 @@ class ModuleUser extends Module {
/**
* Авторизован ли юзер
*
* @return unknown
* @return bool
*/
public function IsAuthorization() {
if ($this->oUserCurrent) {
@ -516,7 +557,7 @@ class ModuleUser extends Module {
/**
* Получить текущего юзера
*
* @return unknown
* @return ModuleUser_EntityUser|null
*/
public function GetUserCurrent() {
return $this->oUserCurrent;
@ -559,7 +600,13 @@ class ModuleUser extends Module {
}
$this->Cache_Set($data, "user_session_{$this->oSession->getUserId()}", array(), 60*60*24*4);
}
/**
* Создание пользовательской сессии
*
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param string $sKey Сессионный ключ
* @return bool
*/
protected function CreateSession(ModuleUser_EntityUser $oUser,$sKey) {
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('user_session_update'));
$this->Cache_Delete("user_session_{$oUser->getId()}");
@ -579,8 +626,8 @@ class ModuleUser extends Module {
/**
* Получить список юзеров по дате последнего визита
*
* @param unknown_type $iLimit
* @return unknown
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByDateLast($iLimit=20) {
if ($this->IsAuthorization()) {
@ -595,11 +642,11 @@ class ModuleUser extends Module {
/**
* Возвращает список пользователей по фильтру
*
* @param $aFilter
* @param $aOrder
* @param $iCurrPage
* @param $iPerPage
* @param array $aAllowData
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элментов на страницу
* @param array $aAllowData Список типо данных для подгрузки к пользователям
* @return array('collection'=>array,'count'=>int)
*/
public function GetUsersByFilter($aFilter,$aOrder,$iCurrPage,$iPerPage,$aAllowData=null) {
@ -614,8 +661,8 @@ class ModuleUser extends Module {
/**
* Получить список юзеров по дате регистрации
*
* @param unknown_type $iLimit
* @return unknown
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByDateRegister($iLimit=20) {
$aResult=$this->GetUsersByFilter(array('activate'=>1),array('id'=>'desc'),1,$iLimit);
@ -624,7 +671,7 @@ class ModuleUser extends Module {
/**
* Получить статистику по юзерам
*
* @return unknown
* @return array
*/
public function GetStatUsers() {
if (false === ($aStat = $this->Cache_Get("user_stats"))) {
@ -642,11 +689,11 @@ class ModuleUser extends Module {
return $aStat;
}
/**
* Получить список логинов по первым буквам
* Получить список юзеров по первым буквам логина
*
* @param unknown_type $sUserLogin
* @param unknown_type $iLimit
* @return unknown
* @param string $sUserLogin Логин
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByLoginLike($sUserLogin,$iLimit) {
if (false === ($data = $this->Cache_Get("user_like_{$sUserLogin}_{$iLimit}"))) {
@ -656,13 +703,11 @@ class ModuleUser extends Module {
$data=$this->GetUsersAdditionalData($data);
return $data;
}
/**
* Получить список отношений друзей
*
* @param array $aUserId
* @param array $aUserId Список ID пользователей проверяемых на дружбу
* @param int $sUserId ID пользователя у которого проверяем друзей
* @return array
*/
public function GetFriendsByArray($aUserId,$sUserId) {
@ -730,10 +775,10 @@ class ModuleUser extends Module {
return $aFriends;
}
/**
* Получить список отношений с френдами по списку айдишников, но используя единый кеш
* Получить список отношений друзей используя единый кеш
*
* @param array $aUserId
* @param string $sUserId
* @param array $aUserId Список ID пользователей проверяемых на дружбу
* @param int $sUserId ID пользователя у которого проверяем друзей
* @return array
*/
public function GetFriendsByArraySolid($aUserId,$sUserId) {
@ -757,9 +802,9 @@ class ModuleUser extends Module {
/**
* Получаем привязку друга к юзеру(есть ли у юзера данный друг)
*
* @param string $sFriendId
* @param string $sUserId
* @return ModuleUser_EntityFriend
* @param int $sFriendId ID пользователя друга
* @param int $sUserId ID пользователя
* @return ModuleUser_EntityFriend|null
*/
public function GetFriend($sFriendId,$sUserId) {
$data=$this->GetFriendsByArray($sFriendId,$sUserId);
@ -771,7 +816,7 @@ class ModuleUser extends Module {
/**
* Добавляет друга
*
* @param ModuleUser_EntityFriend $oFriend
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function AddFriend(ModuleUser_EntityFriend $oFriend) {
@ -785,7 +830,7 @@ class ModuleUser extends Module {
/**
* Удаляет друга
*
* @param ModuleUser_EntityFriend $oFriend
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function DeleteFriend(ModuleUser_EntityFriend $oFriend) {
@ -801,7 +846,7 @@ class ModuleUser extends Module {
/**
* Удаляет информацию о дружбе из базы данных
*
* @param ModuleUser_EntityFriend $oFriend
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function EraseFriend(ModuleUser_EntityFriend $oFriend) {
@ -811,11 +856,10 @@ class ModuleUser extends Module {
$this->Cache_Delete("user_friend_{$oFriend->getUserTo()}_{$oFriend->getUserFrom()}");
return $this->oMapper->EraseFriend($oFriend);
}
/**
* Обновляет информацию о друге
*
* @param ModuleUser_EntityFriend $oFriend
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function UpdateFriend(ModuleUser_EntityFriend $oFriend) {
@ -825,13 +869,12 @@ class ModuleUser extends Module {
$this->Cache_Delete("user_friend_{$oFriend->getUserTo()}_{$oFriend->getUserFrom()}");
return $this->oMapper->UpdateFriend($oFriend);
}
/**
* Получает список друзей
*
* @param int $sUserId
* @param int $iPage
* @param int $iPerPage
* @param int $sUserId ID пользователя
* @param int $iPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetUsersFriend($sUserId,$iPage=1,$iPerPage=10) {
@ -843,12 +886,11 @@ class ModuleUser extends Module {
$data['collection']=$this->GetUsersAdditionalData($data['collection']);
return $data;
}
/**
* Получает количество друзей
*
* @param int $sUserId
* @return array
* @param int $sUserId ID пользователя
* @return int
*/
public function GetCountUsersFriend($sUserId) {
$sKey="count_user_friend_{$sUserId}";
@ -858,13 +900,12 @@ class ModuleUser extends Module {
}
return $data;
}
/**
* Получает инвайт по его коду
*
* @param string $sCode
* @param int $iUsed
* @return string
* @param string $sCode Код инвайта
* @param int $iUsed Флаг испольщования инвайта
* @return ModuleUser_EntityInvite|null
*/
public function GetInviteByCode($sCode,$iUsed=0) {
return $this->oMapper->GetInviteByCode($sCode,$iUsed);
@ -872,8 +913,8 @@ class ModuleUser extends Module {
/**
* Добавляет новый инвайт
*
* @param ModuleUser_EntityInvite $oInvite
* @return unknown
* @param ModuleUser_EntityInvite $oInvite Объект инвайта
* @return ModuleUser_EntityInvite|bool
*/
public function AddInvite(ModuleUser_EntityInvite $oInvite) {
if ($sId=$this->oMapper->AddInvite($oInvite)) {
@ -885,8 +926,8 @@ class ModuleUser extends Module {
/**
* Обновляет инвайт
*
* @param ModuleUser_EntityInvite $oInvite
* @return unknown
* @param ModuleUser_EntityInvite $oInvite бъект инвайта
* @return bool
*/
public function UpdateInvite(ModuleUser_EntityInvite $oInvite) {
//чистим зависимые кеши
@ -896,8 +937,8 @@ class ModuleUser extends Module {
/**
* Генерирует новый инвайт
*
* @param unknown_type $oUser
* @return unknown
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return ModuleUser_EntityInvite|bool
*/
public function GenerateInvite($oUser) {
$oInvite=Engine::GetEntity('User_Invite');
@ -909,9 +950,9 @@ class ModuleUser extends Module {
/**
* Получает число использованых приглашений юзером за определенную дату
*
* @param unknown_type $sUserIdFrom
* @param unknown_type $sDate
* @return unknown
* @param int $sUserIdFrom ID пользователя
* @param string $sDate Дата
* @return int
*/
public function GetCountInviteUsedByDate($sUserIdFrom,$sDate) {
return $this->oMapper->GetCountInviteUsedByDate($sUserIdFrom,$sDate);
@ -919,8 +960,8 @@ class ModuleUser extends Module {
/**
* Получает полное число использованных приглашений юзера
*
* @param unknown_type $sUserIdFrom
* @return unknown
* @param int $sUserIdFrom ID пользователя
* @return int
*/
public function GetCountInviteUsed($sUserIdFrom) {
return $this->oMapper->GetCountInviteUsed($sUserIdFrom);
@ -928,8 +969,8 @@ class ModuleUser extends Module {
/**
* Получаем число доступных приглашений для юзера
*
* @param unknown_type $oUserFrom
* @return unknown
* @param ModuleUser_EntityUser $oUserFrom Объект пользователя
* @return int
*/
public function GetCountInviteAvailable(ModuleUser_EntityUser $oUserFrom) {
$sDay=7;
@ -943,8 +984,8 @@ class ModuleUser extends Module {
/**
* Получает список приглашенных юзеров
*
* @param unknown_type $sUserId
* @return unknown
* @param int $sUserId ID пользователя
* @return array
*/
public function GetUsersInvite($sUserId) {
if (false === ($data = $this->Cache_Get("users_invite_{$sUserId}"))) {
@ -957,8 +998,8 @@ class ModuleUser extends Module {
/**
* Получает юзера который пригласил
*
* @param unknown_type $sUserIdTo
* @return unknown
* @param int $sUserIdTo ID пользователя
* @return ModuleUser_EntityUser|null
*/
public function GetUserInviteFrom($sUserIdTo) {
if (false === ($id = $this->Cache_Get("user_invite_from_{$sUserIdTo}"))) {
@ -970,8 +1011,8 @@ class ModuleUser extends Module {
/**
* Добавляем воспоминание(восстановление) пароля
*
* @param unknown_type $oReminder
* @return unknown
* @param ModuleUser_EntityReminder $oReminder Объект восстановления пароля
* @return bool
*/
public function AddReminder(ModuleUser_EntityReminder $oReminder) {
return $this->oMapper->AddReminder($oReminder);
@ -979,8 +1020,8 @@ class ModuleUser extends Module {
/**
* Сохраняем воспомнинание(восстановление) пароля
*
* @param unknown_type $oReminder
* @return unknown
* @param ModuleUser_EntityReminder $oReminder Объект восстановления пароля
* @return bool
*/
public function UpdateReminder(ModuleUser_EntityReminder $oReminder) {
return $this->oMapper->UpdateReminder($oReminder);
@ -988,21 +1029,19 @@ class ModuleUser extends Module {
/**
* Получаем запись восстановления пароля по коду
*
* @param unknown_type $sCode
* @return unknown
* @param string $sCode Код восстановления пароля
* @return ModuleUser_EntityReminder|null
*/
public function GetReminderByCode($sCode) {
return $this->oMapper->GetReminderByCode($sCode);
}
/**
* Upload user avatar on server
* Make resized images
* Загрузка аватара пользователя
*
* @param string $sFileTmp
* @param ModuleUser_EntityUser $oUser
* @param string $sFileTmp Серверный путь до временного аватара
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param array $aSize Размер области из которой нужно вырезать картинку - array('x1'=>0,'y1'=>0,'x2'=>100,'y2'=>100)
* @return (string|bool)
* @return string|bool
*/
public function UploadAvatar($sFileTmp,$oUser,$aSize=array()) {
if (!file_exists($sFileTmp)) {
@ -1096,9 +1135,9 @@ class ModuleUser extends Module {
return false;
}
/**
* Delete avatar from server
* Удаляет аватар пользователя
*
* @param ModuleUser_EntityUser $oUser
* @param ModuleUser_EntityUser $oUser Объект пользователя
*/
public function DeleteAvatar($oUser) {
/**
@ -1111,14 +1150,13 @@ class ModuleUser extends Module {
}
}
}
/**
* Upload user foto
* загрузка фотографии пользователя
*
* @param string $sFileTmp
* @param ModuleUser_EntityUser $oUser
* @param string $sFileTmp Серверный путь до временной фотографии
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param array $aSize Размер области из которой нужно вырезать картинку - array('x1'=>0,'y1'=>0,'x2'=>100,'y2'=>100)
* @return string
* @return string|bool
*/
public function UploadFoto($sFileTmp,$oUser,$aSize=array()) {
if (!file_exists($sFileTmp)) {
@ -1193,7 +1231,7 @@ class ModuleUser extends Module {
return false;
}
/**
* Delete user foto from server
* Удаляет фото пользователя
*
* @param ModuleUser_EntityUser $oUser
*/
@ -1203,7 +1241,8 @@ class ModuleUser extends Module {
/**
* Проверяет логин на корректность
*
* @param unknown_type $sLogin
* @param string $sLogin Логин пользователя
* @return bool
*/
public function CheckLogin($sLogin) {
if (preg_match("/^[\da-z\_\-]{".Config::Get('module.user.login.min_size').','.Config::Get('module.user.login.max_size')."}$/i",$sLogin)){
@ -1211,106 +1250,110 @@ class ModuleUser extends Module {
}
return false;
}
/**
* Получить дополниетльные поля профиля пользователя
* @param array $aType Типы полей, null - все типы
* @return type
* Получить дополнительные поля профиля пользователя
*
* @param array|null $aType Типы полей, null - все типы
* @return array
*/
public function getUserFields($aType=null) {
return $this->oMapper->getUserFields($aType);
}
/**
* Получить значения дополнительных полей профиля пользователя
* @param int $iUserId
*
* @param int $iUserId ID пользователя
* @param bool $bOnlyNoEmpty Загружать только непустые поля
* @param array $aType Типы полей, null - все типы
* @return type
* @return array
*/
public function getUserFieldsValues($iUserId, $bOnlyNoEmpty = true, $aType=array('')) {
return $this->oMapper->getUserFieldsValues($iUserId, $bOnlyNoEmpty, $aType);
}
/**
* Получить по имени поля его значение дял определённого пользователя
* @param type $iUserId
* @param type $bOnlyNoEmpty Загружать только непустые поля
* @return type
*
* @param int $iUserId ID пользователя
* @param string $sName Имя поля
* @return string
*/
public function getUserFieldValueByName($iUserId, $sName) {
return $this->oMapper->getUserFieldValueByName($iUserId, $sName);
}
/**
* Установить значения дополнительных полей профиля пользователя
* @param type $iUserId
* @param type $aFields Ассоциативный массив полей id => value
* @return type
*
* @param int $iUserId ID пользователя
* @param array $aFields Ассоциативный массив полей id => value
* @param int $iCountMax Максимальное количество одинаковых полей
* @return bool
*/
public function setUserFieldsValues($iUserId, $aFields, $iCountMax=1) {
return $this->oMapper->setUserFieldsValues($iUserId, $aFields, $iCountMax);
}
/**
* Добавить поле
* @param type $sName
* @return type
*
* @param ModuleUser_EntityField $oField Объект пользовательского поля
* @return bool
*/
public function addUserField($oField) {
return $this->oMapper->addUserField($oField);
}
/**
* Изменить поле
* @param type $sName
* @return type
*
* @param ModuleUser_EntityField $oField Объект пользовательского поля
* @return bool
*/
public function updateUserField($oField) {
return $this->oMapper->updateUserField($oField);
}
/**
* Удалить поле
* @param type $iId
* @return type
*
* @param int $iId ID пользовательского поля
* @return bool
*/
public function deleteUserField($iId) {
return $this->oMapper->deleteUserField($iId);
}
/**
* Проверяет существует ли поле с таким именем
*
* @param unknown_type $sName
* @param unknown_type $iId
* @return unknown
* @param string $sName Имя поля
* @param int|null $iId ID поля
* @return bool
*/
public function userFieldExistsByName($sName, $iId = null) {
return $this->oMapper->userFieldExistsByName($sName, $iId);
}
/**
* Проверяет существует ли поле с таким ID
*
* @param unknown_type $iId
* @return unknown
* @param int $iId ID поля
* @return bool
*/
public function userFieldExistsById($iId) {
return $this->oMapper->userFieldExistsById($iId);
}
/**
* Удаляет у пользователя значения полей
*
* @param int $iUserId ID пользователя
* @param array|null $aType Список типов для удаления
* @return bool
*/
public function DeleteUserFieldValues($iUserId,$aType=null) {
return $this->oMapper->DeleteUserFieldValues($iUserId,$aType);
}
/**
* Возвращает список заметок пользователя
*
* @param $iUserId
* @param $iCurrPage
* @param $iPerPage
* @return array
* @param int $iUserId ID пользователя
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array('collection'=>array,'count'=>int)
*/
public function GetUserNotesByUserId($iUserId,$iCurrPage,$iPerPage) {
$aResult=$this->oMapper->GetUserNotesByUserId($iUserId,$iCount,$iCurrPage,$iPerPage);
@ -1331,52 +1374,78 @@ class ModuleUser extends Module {
}
return array('collection'=>$aResult,'count'=>$iCount);
}
/**
* Возвращает количество заметок у пользователя
*
* @param $iUserId
* @return mixed
* @param int $iUserId ID пользователя
* @return int
*/
public function GetCountUserNotesByUserId($iUserId) {
return $this->oMapper->GetCountUserNotesByUserId($iUserId);
}
/**
* Возвращет заметку по автору и пользователю
*
* @param $iTargetUserId
* @param $iUserId
* @param int $iTargetUserId ID пользователя о ком заметка
* @param int $iUserId ID пользователя автора заметки
* @return ModuleUser_EntityNote
*/
public function GetUserNote($iTargetUserId,$iUserId) {
return $this->oMapper->GetUserNote($iTargetUserId,$iUserId);
}
/**
* Врзвращает заметку по ID
* Возвращает заметку по ID
*
* @param $iId
* @param int $iId ID заметки
* @return ModuleUser_EntityNote
*/
public function GetUserNoteById($iId) {
return $this->oMapper->GetUserNoteById($iId);
}
/**
* Возвращает список заметок пользователя по ID целевых юзеров
*
* @param array $aUserId Список ID целевых пользователей
* @param int $sUserId ID пользователя, кто оставлял заметки
* @return array
*/
public function GetUserNotesByArray($aUserId,$sUserId) {
if (!$aUserId) {
return array();
}
if (!is_array($aUserId)) {
$aUserId=array($aUserId);
}
$aUserId=array_unique($aUserId);
$aNotes=array();
$s=join(',',$aUserId);
if (false === ($data = $this->Cache_Get("user_notes_{$sUserId}_id_{$s}"))) {
$data = $this->oMapper->GetUserNotesByArrayUserId($aUserId,$sUserId);
foreach ($data as $oNote) {
$aNotes[$oNote->getTargetUserId()]=$oNote;
}
$this->Cache_Set($aNotes, "user_notes_{$sUserId}_id_{$s}", array("user_note_change_by_user_{$sUserId}"), 60*60*24*1);
return $aNotes;
}
return $data;
}
/**
* Удаляет заметку по ID
*
* @param $iId
* @param int $iId ID заметки
* @return bool
*/
public function DeleteUserNoteById($iId) {
if ($oNote=$this->GetUserNoteById($iId)) {
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("user_note_change_by_user_{$oNote->getUserId()}"));
}
return $this->oMapper->DeleteUserNoteById($iId);
}
/**
* Сохраняет заметку в БД, если ее нет то создает новую
*
* @param $oNote
* @param ModuleUser_EntityNote $oNote Объект заметки
* @return bool|ModuleUser_EntityNote
*/
public function SaveNote($oNote) {
@ -1384,6 +1453,7 @@ class ModuleUser extends Module {
$oNote->setDateAdd(date("Y-m-d H:i:s"));
}
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("user_note_change_by_user_{$oNote->getUserId()}"));
if ($oNoteOld=$this->GetUserNote($oNote->getTargetUserId(),$oNote->getUserId()) ) {
$oNoteOld->setText($oNote->getText());
$this->oMapper->UpdateUserNote($oNoteOld);
@ -1396,11 +1466,10 @@ class ModuleUser extends Module {
}
return false;
}
/**
* Возвращает список префиксов логинов пользователей (для алфавитного указателя)
*
* @param int $iPrefixLength
* @param int $iPrefixLength Длина префикса
* @return array
*/
public function GetGroupPrefixUser($iPrefixLength=1) {
@ -1410,5 +1479,74 @@ class ModuleUser extends Module {
}
return $data;
}
/**
* Добавляет запись о смене емайла
*
* @param ModuleUser_EntityChangemail $oChangemail Объект смены емайла
* @return bool|ModuleUser_EntityChangemail
*/
public function AddUserChangemail($oChangemail) {
if ($sId=$this->oMapper->AddUserChangemail($oChangemail)) {
$oChangemail->setId($sId);
return $oChangemail;
}
return false;
}
/**
* Обновляет запись о смене емайла
*
* @param ModuleUser_EntityChangemail $oChangemail Объект смены емайла
* @return int
*/
public function UpdateUserChangemail($oChangemail) {
return $this->oMapper->UpdateUserChangemail($oChangemail);
}
/**
* Возвращает объект смены емайла по коду подтверждения
*
* @param string $sCode Код подтверждения
* @return ModuleUser_EntityChangemail|null
*/
public function GetUserChangemailByCodeFrom($sCode) {
return $this->oMapper->GetUserChangemailByCodeFrom($sCode);
}
/**
* Возвращает объект смены емайла по коду подтверждения
*
* @param string $sCode Код подтверждения
* @return ModuleUser_EntityChangemail|null
*/
public function GetUserChangemailByCodeTo($sCode) {
return $this->oMapper->GetUserChangemailByCodeTo($sCode);
}
/**
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @param string $sMailNew Новый емайл
* @return bool|ModuleUser_EntityChangemail
*/
public function MakeUserChangemail($oUser,$sMailNew) {
$oChangemail=Engine::GetEntity('ModuleUser_EntityChangemail');
$oChangemail->setUserId($oUser->getId());
$oChangemail->setDateAdd(date("Y-m-d H:i:s"));
$oChangemail->setDateExpired(date("Y-m-d H:i:s",time()+3*24*60*60)); // 3 дня для смены емайла
$oChangemail->setMailFrom($oUser->getMail());
$oChangemail->setMailTo($sMailNew);
$oChangemail->setCodeFrom(func_generator(32));
$oChangemail->setCodeTo(func_generator(32));
if ($this->AddUserChangemail($oChangemail)) {
/**
* Отправляем уведомление
*/
$this->Notify_Send($oUser,
'notify.user_changemail_from.tpl',
$this->Lang_Get('notify_subject_user_changemail'),
array(
'oUser' => $oUser,
'oChangemail' => $oChangemail,
));
return $oChangemail;
}
return false;
}
}
?>

View file

@ -0,0 +1,27 @@
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Сущность смены емайла пользователем
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityChangemail extends Entity {
}
?>

View file

@ -15,22 +15,60 @@
---------------------------------------------------------
*/
/**
* Сущность пользовательского поля у пользователя
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityField extends Entity {
/**
* Возвращает ID поля
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('id');
}
/**
* Возвращает имя поля(уникальное)
*
* @return string|null
*/
public function getName(){
return $this->_getDataOne('name');
}
/**
* Возвращает тип поля
*
* @return string|null
*/
public function getType(){
return $this->_getDataOne('type');
}
/**
* Возвращает заголовок/описание поля
*
* @return string|null
*/
public function getTitle(){
return $this->_getDataOne('title');
}
/**
* Возвращает паттерн подстановки поля
*
* @return string|null
*/
public function getPattern(){
return $this->_getDataOne('pattern');
}
/**
* Возвращает значение поля у пользователя
*
* @param bool $bEscapeValue Экранировать значение
* @param bool $bTransformed Применять паттерн или нет
* @return string
*/
public function getValue($bEscapeValue = false, $bTransformed = false){
if (!isset($this->_aData['value']) || !$this->_aData['value']) return '';
if ($bEscapeValue) $this->_aData['value'] = htmlspecialchars($this->_aData['value']);
@ -52,22 +90,51 @@ class ModuleUser_EntityField extends Entity {
}
/**
* Устанавливает ID поля
*
* @param int $iId
*/
public function setId($iId) {
$this->_aData['id']=$iId;
}
/**
* Устанавливает имя поля(уникальное)
*
* @param string $sName
*/
public function setName($sName) {
$this->_aData['name']=$sName;
}
/**
* Устанавливает тип поля
*
* @param string $sName
*/
public function setType($sName) {
$this->_aData['type']=$sName;
}
/**
* Устанавливает заголовок/описание поля
*
* @param string $sTitle
*/
public function setTitle($sTitle) {
$this->_aData['title']=$sTitle;
}
/**
* Устанавливает паттерн подстановки поля
*
* @param string $sPattern
*/
public function setPattern($sPattern) {
$this->_aData['pattern']=$sPattern;
}
/**
* Устанавливает значение поля у пользователя
*
* @param string $sValue
*/
public function setValue($sValue) {
$this->_aData['value']=$sValue;
}

View file

@ -15,87 +15,154 @@
---------------------------------------------------------
*/
class ModuleUser_EntityFriend extends Entity
{
/**
* При переданном параметре $sUserId возвращает тот идентификатор,
* который не равен переданному
*
* @param ( string|null )
* @return string
*/
public function getFriendId($sUserId=null) {
if(!$sUserId) {
$sUserId=$this->getUserId();
}
if($this->_getDataOne('user_from')==$sUserId) {
return $this->_aData['user_to'];
}
if($this->_getDataOne('user_to')==$sUserId) {
return $this->_aData['user_from'];
}
return false;
}
/**
* Получает идентификатор пользователя,
* относительно которого был сделан запрос
*
* @return int
*/
public function getUserId() {
/**
* Сущность дружбу - связи пользователей друг с другом
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityFriend extends Entity {
/**
* При переданном параметре $sUserId возвращает тот идентификатор,
* который не равен переданному
*
* @param string|null $sUserId ID пользователя
* @return string
*/
public function getFriendId($sUserId=null) {
if(!$sUserId) {
$sUserId=$this->getUserId();
}
if($this->_getDataOne('user_from')==$sUserId) {
return $this->_aData['user_to'];
}
if($this->_getDataOne('user_to')==$sUserId) {
return $this->_aData['user_from'];
}
return false;
}
/**
* Получает идентификатор пользователя,
* относительно которого был сделан запрос
*
* @return int
*/
public function getUserId() {
return $this->_getDataOne('user');
}
public function getUserFrom() {
return $this->_getDataOne('user_from');
}
public function getUserTo() {
return $this->_getDataOne('user_to');
}
public function getStatusFrom() {
return $this->_getDataOne('status_from');
}
public function getStatusTo() {
}
/**
* Возвращает ID пользователя, который приглашает в друзья
*
* @return int|null
*/
public function getUserFrom() {
return $this->_getDataOne('user_from');
}
/**
* Возвращает ID пользователя, которого пришлашаем в друзья
*
* @return int|null
*/
public function getUserTo() {
return $this->_getDataOne('user_to');
}
/**
* Возвращает статус заявки на добавления в друзья у отправителя
*
* @return int|null
*/
public function getStatusFrom() {
return $this->_getDataOne('status_from');
}
/**
* Возвращает статус заявки на добавления в друзья у получателя
*
* @return int|null
*/
public function getStatusTo() {
return $this->_getDataOne('status_to') ? $this->_getDataOne('status_to') : ModuleUser::USER_FRIEND_NULL;
}
public function getFriendStatus() {
return $this->getStatusFrom()+$this->getStatusTo();
}
public function getStatusByUserId($sUserId) {
if($sUserId==$this->getUserFrom()) {
return $this->getStatusFrom();
}
if($sUserId==$this->getUserTo()) {
return $this->getStatusTo();
}
return false;
}
public function setUserFrom($data) {
$this->_aData['user_from']=$data;
}
public function setUserTo($data) {
$this->_aData['user_to']=$data;
}
public function setStatusFrom($data) {
$this->_aData['status_from']=$data;
}
public function setStatusTo($data) {
$this->_aData['status_to']=$data;
}
public function setUserId($data) {
$this->_aData['user']=$data;
}
public function setStatusByUserId($data,$sUserId) {
if($sUserId==$this->getUserFrom()) {
$this->setStatusFrom($data);
return true;
}
if($sUserId==$this->getUserTo()) {
$this->setStatusTo($data);
return true;
}
return false;
}
}
/**
* Возвращает статус дружбы
*
* @return int|null
*/
public function getFriendStatus() {
return $this->getStatusFrom()+$this->getStatusTo();
}
/**
* Возвращает статус дружбы для конкретного пользователя
*
* @param int $sUserId ID пользователя
* @return bool|int
*/
public function getStatusByUserId($sUserId) {
if($sUserId==$this->getUserFrom()) {
return $this->getStatusFrom();
}
if($sUserId==$this->getUserTo()) {
return $this->getStatusTo();
}
return false;
}
/**
* Устанавливает ID пользователя, который приглашает в друзья
*
* @param int $data
*/
public function setUserFrom($data) {
$this->_aData['user_from']=$data;
}
/**
* Устанавливает ID пользователя, которого пришлашаем в друзья
*
* @param int $data
*/
public function setUserTo($data) {
$this->_aData['user_to']=$data;
}
/**
* Устанавливает статус заявки на добавления в друзья у отправителя
*
* @param int $data
*/
public function setStatusFrom($data) {
$this->_aData['status_from']=$data;
}
/**
* Возвращает статус заявки на добавления в друзья у получателя
*
* @param int $data
*/
public function setStatusTo($data) {
$this->_aData['status_to']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user']=$data;
}
/**
* Возвращает статус дружбы для конкретного пользователя
*
* @param int $data Статус
* @param int $sUserId ID пользователя
* @return bool
*/
public function setStatusByUserId($data,$sUserId) {
if($sUserId==$this->getUserFrom()) {
$this->setStatusFrom($data);
return true;
}
if($sUserId==$this->getUserTo()) {
$this->setStatusTo($data);
return true;
}
return false;
}
}
?>

View file

@ -15,53 +15,126 @@
---------------------------------------------------------
*/
class ModuleUser_EntityInvite extends Entity
{
public function getId() {
return $this->_getDataOne('invite_id');
}
public function getCode() {
return $this->_getDataOne('invite_code');
}
public function getUserFromId() {
return $this->_getDataOne('user_from_id');
}
public function getUserToId() {
return $this->_getDataOne('user_to_id');
}
public function getDateAdd() {
return $this->_getDataOne('invite_date_add');
}
public function getDateUsed() {
return $this->_getDataOne('invite_date_used');
}
public function getUsed() {
return $this->_getDataOne('invite_used');
}
/**
* Сущность инвайта(приглашения)
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityInvite extends Entity {
/**
* Возвращает ID инвайта
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('invite_id');
}
/**
* Возвращает код инвайта
*
* @return string|null
*/
public function getCode() {
return $this->_getDataOne('invite_code');
}
/**
* Возвращает ID пользователя, который отправляет инвайт
*
* @return int|null
*/
public function getUserFromId() {
return $this->_getDataOne('user_from_id');
}
/**
* Возвращает ID пользователя, которому отправляем инвайт
*
* @return int|null
*/
public function getUserToId() {
return $this->_getDataOne('user_to_id');
}
/**
* Возвращает дату выдачи инвайта
*
* @return string|null
*/
public function getDateAdd() {
return $this->_getDataOne('invite_date_add');
}
/**
* Возвращает дату использования инвайта
*
* @return string|null
*/
public function getDateUsed() {
return $this->_getDataOne('invite_date_used');
}
/**
* Возвращает статус использованости инвайта
*
* @return int|null
*/
public function getUsed() {
return $this->_getDataOne('invite_used');
}
/**
* Устанавливает ID инвайта
*
* @param int $data
*/
public function setId($data) {
$this->_aData['invite_id']=$data;
}
public function setCode($data) {
$this->_aData['invite_code']=$data;
}
public function setUserFromId($data) {
$this->_aData['user_from_id']=$data;
}
public function setUserToId($data) {
$this->_aData['user_to_id']=$data;
}
public function setDateAdd($data) {
$this->_aData['invite_date_add']=$data;
}
public function setDateUsed($data) {
$this->_aData['invite_date_used']=$data;
}
public function setUsed($data) {
$this->_aData['invite_used']=$data;
}
$this->_aData['invite_id']=$data;
}
/**
* Устанавливает код инвайта
*
* @param string $data
*/
public function setCode($data) {
$this->_aData['invite_code']=$data;
}
/**
* Устанавливает ID пользователя, который отправляет инвайт
*
* @param int $data
*/
public function setUserFromId($data) {
$this->_aData['user_from_id']=$data;
}
/**
* Устанавливает ID пользователя, которому отправляем инвайт
*
* @param int $data
*/
public function setUserToId($data) {
$this->_aData['user_to_id']=$data;
}
/**
* Устанавливает дату выдачи инвайта
*
* @param string $data
*/
public function setDateAdd($data) {
$this->_aData['invite_date_add']=$data;
}
/**
* Устанавливает дату использования инвайта
*
* @param string $data
*/
public function setDateUsed($data) {
$this->_aData['invite_date_used']=$data;
}
/**
* Устанавливает статус использованости инвайта
*
* @param int $data
*/
public function setUsed($data) {
$this->_aData['invite_used']=$data;
}
}
?>

View file

@ -15,25 +15,34 @@
---------------------------------------------------------
*/
/**
* Сущность заметки о пользователе
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityNote extends Entity {
/**
* Определяем правила валидации
*
* @var array
*/
protected $aValidateRules=array(
array('target_user_id','target'),
);
/**
* Инициализация
*/
public function Init() {
parent::Init();
$this->aValidateRules[]=array('text','string','max'=>Config::Get('module.user.usernote_text_max'),'min'=>1,'allowEmpty'=>false);
}
/**
* Валидация пользователя
*
* @param $sValue
* @param $aParams
* @param string $sValue Значение
* @param array $aParams Параметры
* @return bool
*/
public function ValidateTarget($sValue,$aParams) {

View file

@ -15,45 +15,109 @@
---------------------------------------------------------
*/
class ModuleUser_EntityReminder extends Entity
{
public function getCode() {
return $this->_getDataOne('reminder_code');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getDateAdd() {
return $this->_getDataOne('reminder_date_add');
}
public function getDateUsed() {
return $this->_getDataOne('reminder_date_used');
}
public function getDateExpire() {
return $this->_getDataOne('reminder_date_expire');
}
public function getIsUsed() {
return $this->_getDataOne('reminde_is_used');
}
/**
* Сущность восстановления пароля
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityReminder extends Entity {
/**
* Возвращает код восстановления
*
* @return string|null
*/
public function getCode() {
return $this->_getDataOne('reminder_code');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает дату создания
*
* @return string|null
*/
public function getDateAdd() {
return $this->_getDataOne('reminder_date_add');
}
/**
* Возвращает дату использования
*
* @return string|null
*/
public function getDateUsed() {
return $this->_getDataOne('reminder_date_used');
}
/**
* Возвращает дату завершения срока действия кода
*
* @return string|null
*/
public function getDateExpire() {
return $this->_getDataOne('reminder_date_expire');
}
/**
* Возвращает статус использованости кода
*
* @return int|null
*/
public function getIsUsed() {
return $this->_getDataOne('reminde_is_used');
}
/**
* Устанавливает код восстановления
*
* @param string $data
*/
public function setCode($data) {
$this->_aData['reminder_code']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setDateAdd($data) {
$this->_aData['reminder_date_add']=$data;
}
public function setDateUsed($data) {
$this->_aData['reminder_date_used']=$data;
}
public function setDateExpire($data) {
$this->_aData['reminder_date_expire']=$data;
}
public function setIsUsed($data) {
$this->_aData['reminde_is_used']=$data;
}
$this->_aData['reminder_code']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает дату создания
*
* @param string $data
*/
public function setDateAdd($data) {
$this->_aData['reminder_date_add']=$data;
}
/**
* Устанавливает дату использования
*
* @param string $data
*/
public function setDateUsed($data) {
$this->_aData['reminder_date_used']=$data;
}
/**
* Устанавливает дату завершения срока действия кода
*
* @param string $data
*/
public function setDateExpire($data) {
$this->_aData['reminder_date_expire']=$data;
}
/**
* Устанавливает статус использованости кода
*
* @param int $data
*/
public function setIsUsed($data) {
$this->_aData['reminde_is_used']=$data;
}
}
?>

View file

@ -15,45 +15,110 @@
---------------------------------------------------------
*/
class ModuleUser_EntitySession extends Entity
{
public function getKey() {
return $this->_getDataOne('session_key');
}
public function getUserId() {
return $this->_getDataOne('user_id');
}
public function getIpCreate() {
return $this->_getDataOne('session_ip_create');
}
public function getIpLast() {
return $this->_getDataOne('session_ip_last');
}
public function getDateCreate() {
return $this->_getDataOne('session_date_create');
}
public function getDateLast() {
return $this->_getDataOne('session_date_last');
}
/**
* Сущность сессии
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntitySession extends Entity {
/**
* Возвращает ключ сессии
*
* @return string|null
*/
public function getKey() {
return $this->_getDataOne('session_key');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getUserId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает IP создания сессии
*
* @return string|null
*/
public function getIpCreate() {
return $this->_getDataOne('session_ip_create');
}
/**
* Возвращает последний IP сессии
*
* @return string|null
*/
public function getIpLast() {
return $this->_getDataOne('session_ip_last');
}
/**
* Возвращает дату создания сессии
*
* @return string|null
*/
public function getDateCreate() {
return $this->_getDataOne('session_date_create');
}
/**
* Возвращает последную дату сессии
*
* @return string|null
*/
public function getDateLast() {
return $this->_getDataOne('session_date_last');
}
/**
* Устанавливает ключ сессии
*
* @param string $data
*/
public function setKey($data) {
$this->_aData['session_key']=$data;
}
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
public function setIpCreate($data) {
$this->_aData['session_ip_create']=$data;
}
public function setIpLast($data) {
$this->_aData['session_ip_last']=$data;
}
public function setDateCreate($data) {
$this->_aData['session_date_create']=$data;
}
public function setDateLast($data) {
$this->_aData['session_date_last']=$data;
}
$this->_aData['session_key']=$data;
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setUserId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает IP создания сессии
*
* @param string $data
*/
public function setIpCreate($data) {
$this->_aData['session_ip_create']=$data;
}
/**
* Устанавливает последний IP сессии
*
* @param string $data
*/
public function setIpLast($data) {
$this->_aData['session_ip_last']=$data;
}
/**
* Устанавливает дату создания сессии
*
* @param string $data
*/
public function setDateCreate($data) {
$this->_aData['session_date_create']=$data;
}
/**
* Устанавливает последную дату сессии
*
* @param string $data
*/
public function setDateLast($data) {
$this->_aData['session_date_last']=$data;
}
}
?>

View file

@ -15,10 +15,17 @@
---------------------------------------------------------
*/
/**
* Сущность пользователя
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_EntityUser extends Entity {
/**
* Определяем правила валидации
*
* @var array
*/
protected $aValidateRules=array(
array('login','login','on'=>array('registration','')), // '' - означает дефолтный сценарий
@ -33,8 +40,8 @@ class ModuleUser_EntityUser extends Entity {
/**
* Валидация пользователя
*
* @param $sValue
* @param $aParams
* @param string $sValue Валидируемое значение
* @param array $aParams Параметры
* @return bool
*/
public function ValidateLogin($sValue,$aParams) {
@ -46,8 +53,8 @@ class ModuleUser_EntityUser extends Entity {
/**
* Проверка логина на существование
*
* @param $sValue
* @param $aParams
* @param string $sValue Валидируемое значение
* @param array $aParams Параметры
* @return bool
*/
public function ValidateLoginExists($sValue,$aParams) {
@ -59,8 +66,8 @@ class ModuleUser_EntityUser extends Entity {
/**
* Проверка емайла на существование
*
* @param $sValue
* @param $aParams
* @param string $sValue Валидируемое значение
* @param array $aParams Параметры
* @return bool
*/
public function ValidateMailExists($sValue,$aParams) {
@ -70,106 +77,265 @@ class ModuleUser_EntityUser extends Entity {
return $this->Lang_Get('registration_mail_error_used');
}
/**
* Возвращает ID пользователя
*
* @return int|null
*/
public function getId() {
return $this->_getDataOne('user_id');
}
/**
* Возвращает логин
*
* @return string|null
*/
public function getLogin() {
return $this->_getDataOne('user_login');
}
/**
* Возвращает пароль (ввиде хеша)
*
* @return string|null
*/
public function getPassword() {
return $this->_getDataOne('user_password');
}
/**
* Возвращает емайл
*
* @return string|null
*/
public function getMail() {
return $this->_getDataOne('user_mail');
}
/**
* Возвращает силу
*
* @return string
*/
public function getSkill() {
return number_format(round($this->_getDataOne('user_skill'),2), 2, '.', '');
}
/**
* Возвращает дату регистрации
*
* @return string|null
*/
public function getDateRegister() {
return $this->_getDataOne('user_date_register');
}
/**
* Возвращает дату активации
*
* @return string|null
*/
public function getDateActivate() {
return $this->_getDataOne('user_date_activate');
}
/**
* Возвращает дату последнего комментирования
*
* @return mixed|null
*/
public function getDateCommentLast() {
return $this->_getDataOne('user_date_comment_last');
}
/**
* Возвращает IP регистрации
*
* @return string|null
*/
public function getIpRegister() {
return $this->_getDataOne('user_ip_register');
}
/**
* Возвращает рейтинг
*
* @return string
*/
public function getRating() {
return number_format(round($this->_getDataOne('user_rating'),2), 2, '.', '');
}
/**
* Вовзращает количество проголосовавших
*
* @return int|null
*/
public function getCountVote() {
return $this->_getDataOne('user_count_vote');
}
/**
* Возвращает статус активированности
*
* @return int|null
*/
public function getActivate() {
return $this->_getDataOne('user_activate');
}
/**
* Возвращает ключ активации
*
* @return string|null
*/
public function getActivateKey() {
return $this->_getDataOne('user_activate_key');
}
/**
* Возвращает имя
*
* @return string|null
*/
public function getProfileName() {
return $this->_getDataOne('user_profile_name');
}
/**
* Возвращает пол
*
* @return string|null
*/
public function getProfileSex() {
return $this->_getDataOne('user_profile_sex');
}
/**
* Возвращает название страны
*
* @return string|null
*/
public function getProfileCountry() {
return $this->_getDataOne('user_profile_country');
}
/**
* Возвращает название региона
*
* @return string|null
*/
public function getProfileRegion() {
return $this->_getDataOne('user_profile_region');
}
/**
* Возвращает название города
*
* @return string|null
*/
public function getProfileCity() {
return $this->_getDataOne('user_profile_city');
}
/**
* Возвращает дату рождения
*
* @return string|null
*/
public function getProfileBirthday() {
return $this->_getDataOne('user_profile_birthday');
}
/**
* Возвращает информацию о себе
*
* @return string|null
*/
public function getProfileAbout() {
return $this->_getDataOne('user_profile_about');
}
/**
* Возвращает дату редактирования профиля
*
* @return string|null
*/
public function getProfileDate() {
return $this->_getDataOne('user_profile_date');
}
/**
* Возвращает полный веб путь до аватра
*
* @return string|null
*/
public function getProfileAvatar() {
return $this->_getDataOne('user_profile_avatar');
}
/**
* Возвращает расширение автара
*
* @return string|null
*/
public function getProfileAvatarType() {
return ($sPath=$this->getProfileAvatarPath()) ? pathinfo($sPath,PATHINFO_EXTENSION) : null;
}
/**
* Возвращает полный веб путь до фото
*
* @return string|null
*/
public function getProfileFoto() {
return $this->_getDataOne('user_profile_foto');
}
/**
* Возвращает статус уведомления о новых топиках
*
* @return int|null
*/
public function getSettingsNoticeNewTopic() {
return $this->_getDataOne('user_settings_notice_new_topic');
}
/**
* Возвращает статус уведомления о новых комментариях
*
* @return int|null
*/
public function getSettingsNoticeNewComment() {
return $this->_getDataOne('user_settings_notice_new_comment');
}
/**
* Возвращает статус уведомления о новых письмах
*
* @return int|null
*/
public function getSettingsNoticeNewTalk() {
return $this->_getDataOne('user_settings_notice_new_talk');
}
/**
* Возвращает статус уведомления о новых ответах в комментариях
*
* @return int|null
*/
public function getSettingsNoticeReplyComment() {
return $this->_getDataOne('user_settings_notice_reply_comment');
}
/**
* Возвращает статус уведомления о новых друзьях
*
* @return int|null
*/
public function getSettingsNoticeNewFriend() {
return $this->_getDataOne('user_settings_notice_new_friend');
}
/**
* Возвращает значения пользовательских полей
*
* @param bool $bOnlyNoEmpty Возвращать или нет только не пустые
* @param string $sType Тип полей
* @return array
*/
public function getUserFieldValues($bOnlyNoEmpty = true, $sType='') {
return $this->User_getUserFieldsValues($this->getId(), $bOnlyNoEmpty,$sType);
}
/**
* Возвращает объект сессии
*
* @return ModuleUser_EntitySession|null
*/
public function getSession() {
if (!$this->_getDataOne('session')) {
$this->_aData['session']=$this->User_GetSessionByUserId($this->getId());
}
return $this->_getDataOne('session');
}
/**
* Возвращает статус онлайн пользователь или нет
*
* @return bool
*/
public function isOnline() {
if ($oSession=$this->getSession()) {
if (time()-strtotime($oSession->getDateLast())<60*10) { // 10 минут
@ -178,38 +344,74 @@ class ModuleUser_EntityUser extends Entity {
}
return false;
}
/**
* Возвращает полный веб путь до аватара нужного размера
*
* @param int $iSize Размер
* @return string
*/
public function getProfileAvatarPath($iSize=100) {
if ($sPath=$this->getProfileAvatar()) {
return str_replace('_100x100',(($iSize==0)?"":"_{$iSize}x{$iSize}"),$sPath."?".date('His',strtotime($this->getProfileDate())));
} else {
return Config::Get('path.static.skin').'/images/avatar_'.$iSize.'x'.$iSize.'.jpg';
return Config::Get('path.static.skin').'/images/avatar_'.($this->getProfileSex()=='woman' ? 'female' : 'male').'_'.$iSize.'x'.$iSize.'.png';
}
}
/**
* Возвращает полный веб путь до фото
*
* @return null|string
*/
public function getProfileFotoPath() {
if ($this->getProfileFoto()) {
return $this->getProfileFoto();
}
return $this->getProfileFotoDefault();
}
/**
* Возвращает дефолтную фото
*
* @return string
*/
public function getProfileFotoDefault() {
return Config::Get('path.static.skin').'/images/user_foto_250.png';
return Config::Get('path.static.skin').'/images/user_photo_'.($this->getProfileSex()=='woman' ? 'female' : 'male').'.png';
}
/**
* Возвращает объект голосования за пользователя текущего пользователя
*
* @return ModuleVote_EntityVote|null
*/
public function getVote() {
return $this->_getDataOne('vote');
}
/**
* Возвращает статус дружбы
*
* @return bool|null
*/
public function getUserIsFriend() {
return $this->_getDataOne('user_is_friend');
}
/**
* Возвращает статус администратора сайта
*
* @return bool|null
*/
public function isAdministrator() {
return $this->_getDataOne('user_is_administrator');
}
/**
* Возвращает веб путь до профиля пользователя
*
* @return string
*/
public function getUserWebPath() {
return Router::GetPath('profile').$this->getLogin().'/';
}
/**
* Возвращает статус дружбы с текущим пользователем
* Возвращает объект дружбы с текущим пользователем
*
* @return int
* @return ModuleUser_EntityFriend|null
*/
public function getUserFriend() {
return $this->_getDataOne('user_friend');
@ -224,99 +426,266 @@ class ModuleUser_EntityUser extends Entity {
return $this->Stream_IsSubscribe($oUserCurrent->getId(),$this->getId());
}
}
/**
* Возвращает объект заметки о подльзователе, которую оставил текущий пользователй
*
* @return ModuleUser_EntityNote|null
*/
public function getUserNote() {
$oUserCurrent=$this->User_GetUserCurrent();
if ($this->_getDataOne('user_note')===null and $oUserCurrent) {
$this->_aData['user_note']=$this->User_GetUserNote($this->getId(),$oUserCurrent->getId());
}
return $this->_getDataOne('user_note');
}
/**
* Устанавливает ID пользователя
*
* @param int $data
*/
public function setId($data) {
$this->_aData['user_id']=$data;
}
/**
* Устанавливает логин
*
* @param string $data
*/
public function setLogin($data) {
$this->_aData['user_login']=$data;
}
/**
* Устанавливает пароль (ввиде хеша)
*
* @param string $data
*/
public function setPassword($data) {
$this->_aData['user_password']=$data;
}
/**
* Устанавливает емайл
*
* @param string $data
*/
public function setMail($data) {
$this->_aData['user_mail']=$data;
}
/**
* Устанавливает силу
*
* @param float $data
*/
public function setSkill($data) {
$this->_aData['user_skill']=$data;
}
/**
* Устанавливает дату регистрации
*
* @param string $data
*/
public function setDateRegister($data) {
$this->_aData['user_date_register']=$data;
}
/**
* Устанавливает дату активации
*
* @param string $data
*/
public function setDateActivate($data) {
$this->_aData['user_date_activate']=$data;
}
/**
* Устанавливает дату последнего комментирования
*
* @param string $data
*/
public function setDateCommentLast($data) {
$this->_aData['user_date_comment_last']=$data;
}
/**
* Устанавливает IP регистрации
*
* @param string $data
*/
public function setIpRegister($data) {
$this->_aData['user_ip_register']=$data;
}
/**
* Устанавливает рейтинг
*
* @param float $data
*/
public function setRating($data) {
$this->_aData['user_rating']=$data;
}
/**
* Устанавливает количество проголосовавших
*
* @param int $data
*/
public function setCountVote($data) {
$this->_aData['user_count_vote']=$data;
}
/**
* Устанавливает статус активированности
*
* @param int $data
*/
public function setActivate($data) {
$this->_aData['user_activate']=$data;
}
/**
* Устанавливает ключ активации
*
* @param string $data
*/
public function setActivateKey($data) {
$this->_aData['user_activate_key']=$data;
}
/**
* Устанавливает имя
*
* @param string $data
*/
public function setProfileName($data) {
$this->_aData['user_profile_name']=$data;
}
/**
* Устанавливает пол
*
* @param string $data
*/
public function setProfileSex($data) {
$this->_aData['user_profile_sex']=$data;
}
/**
* Устанавливает название страны
*
* @param string $data
*/
public function setProfileCountry($data) {
$this->_aData['user_profile_country']=$data;
}
/**
* Устанавливает название региона
*
* @param string $data
*/
public function setProfileRegion($data) {
$this->_aData['user_profile_region']=$data;
}
/**
* Устанавливает название города
*
* @param string $data
*/
public function setProfileCity($data) {
$this->_aData['user_profile_city']=$data;
}
/**
* Устанавливает дату рождения
*
* @param string $data
*/
public function setProfileBirthday($data) {
$this->_aData['user_profile_birthday']=$data;
}
/**
* Устанавливает информацию о себе
*
* @param string $data
*/
public function setProfileAbout($data) {
$this->_aData['user_profile_about']=$data;
}
/**
* Устанавливает дату редактирования профиля
*
* @param string $data
*/
public function setProfileDate($data) {
$this->_aData['user_profile_date']=$data;
}
/**
* Устанавливает полный веб путь до аватра
*
* @param string $data
*/
public function setProfileAvatar($data) {
$this->_aData['user_profile_avatar']=$data;
}
/**
* Устанавливает полный веб путь до фото
*
* @param string $data
*/
public function setProfileFoto($data) {
$this->_aData['user_profile_foto']=$data;
}
/**
* Устанавливает статус уведомления о новых топиках
*
* @param int $data
*/
public function setSettingsNoticeNewTopic($data) {
$this->_aData['user_settings_notice_new_topic']=$data;
}
/**
* Устанавливает статус уведомления о новых комментариях
*
* @param int $data
*/
public function setSettingsNoticeNewComment($data) {
$this->_aData['user_settings_notice_new_comment']=$data;
}
/**
* Устанавливает статус уведомления о новых письмах
*
* @param int $data
*/
public function setSettingsNoticeNewTalk($data) {
$this->_aData['user_settings_notice_new_talk']=$data;
}
/**
* Устанавливает статус уведомления о новых ответах в комментариях
*
* @param int $data
*/
public function setSettingsNoticeReplyComment($data) {
$this->_aData['user_settings_notice_reply_comment']=$data;
}
/**
* Устанавливает статус уведомления о новых друзьях
*
* @param int $data
*/
public function setSettingsNoticeNewFriend($data) {
$this->_aData['user_settings_notice_new_friend']=$data;
}
/**
* Устанавливает объект сессии
*
* @param ModuleUser_EntitySession $data
*/
public function setSession($data) {
$this->_aData['session']=$data;
}
/**
* Устанавливает статус дружбы
*
* @param int $data
*/
public function setUserIsFriend($data) {
$this->_aData['user_is_friend']=$data;
}
/**
* Устанавливает объект голосования за пользователя текущего пользователя
*
* @param ModuleVote_EntityVote $data
*/
public function setVote($data) {
$this->_aData['vote']=$data;
}

View file

@ -15,13 +15,19 @@
---------------------------------------------------------
*/
/**
* Маппер для работы с БД
*
* @package modules.user
* @since 1.0
*/
class ModuleUser_MapperUser extends Mapper {
protected $oUserCurrent=null;
public function SetUserCurrent($oUserCurrent) {
$this->oUserCurrent=$oUserCurrent;
}
/**
* Добавляет юзера
*
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return int|bool
*/
public function Add(ModuleUser_EntityUser $oUser) {
$sql = "INSERT INTO ".Config::Get('db.table.user')."
(user_login,
@ -39,7 +45,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Обновляет юзера
*
* @param ModuleUser_EntityUser $oUser Объект пользователя
* @return bool
*/
public function Update(ModuleUser_EntityUser $oUser) {
$sql = "UPDATE ".Config::Get('db.table.user')."
SET
@ -51,6 +62,7 @@ class ModuleUser_MapperUser extends Mapper {
user_rating = ? ,
user_count_vote = ? ,
user_activate = ? ,
user_activate_key = ? ,
user_profile_name = ? ,
user_profile_sex = ? ,
user_profile_country = ? ,
@ -65,39 +77,46 @@ class ModuleUser_MapperUser extends Mapper {
user_settings_notice_new_comment = ? ,
user_settings_notice_new_talk = ? ,
user_settings_notice_reply_comment = ? ,
user_settings_notice_new_friend = ?
user_settings_notice_new_friend = ? ,
user_settings_timezone = ?
WHERE user_id = ?
";
if ($this->oDb->query($sql,$oUser->getPassword(),
$oUser->getMail(),
$oUser->getSkill(),
$oUser->getDateActivate(),
$oUser->getDateCommentLast(),
$oUser->getRating(),
$oUser->getCountVote(),
$oUser->getActivate(),
$oUser->getProfileName(),
$oUser->getProfileSex(),
$oUser->getProfileCountry(),
$oUser->getProfileRegion(),
$oUser->getProfileCity(),
$oUser->getProfileBirthday(),
$oUser->getProfileAbout(),
$oUser->getProfileDate(),
$oUser->getProfileAvatar(),
$oUser->getProfileFoto(),
$oUser->getSettingsNoticeNewTopic(),
$oUser->getSettingsNoticeNewComment(),
$oUser->getSettingsNoticeNewTalk(),
$oUser->getSettingsNoticeReplyComment(),
$oUser->getSettingsNoticeNewFriend(),
$oUser->getId())) {
$oUser->getMail(),
$oUser->getSkill(),
$oUser->getDateActivate(),
$oUser->getDateCommentLast(),
$oUser->getRating(),
$oUser->getCountVote(),
$oUser->getActivate(),
$oUser->getActivateKey(),
$oUser->getProfileName(),
$oUser->getProfileSex(),
$oUser->getProfileCountry(),
$oUser->getProfileRegion(),
$oUser->getProfileCity(),
$oUser->getProfileBirthday(),
$oUser->getProfileAbout(),
$oUser->getProfileDate(),
$oUser->getProfileAvatar(),
$oUser->getProfileFoto(),
$oUser->getSettingsNoticeNewTopic(),
$oUser->getSettingsNoticeNewComment(),
$oUser->getSettingsNoticeNewTalk(),
$oUser->getSettingsNoticeReplyComment(),
$oUser->getSettingsNoticeNewFriend(),
$oUser->getSettingsTimezone(),
$oUser->getId())) {
return true;
}
return false;
}
/**
* Получить юзера по ключу сессии
*
* @param string $sKey Сессионный ключ
* @return int|null
*/
public function GetUserBySessionKey($sKey) {
$sql = "SELECT
s.user_id
@ -111,7 +130,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Создание пользовательской сессии
*
* @param ModuleUser_EntitySession $oSession
* @return bool
*/
public function CreateSession(ModuleUser_EntitySession $oSession) {
$sql = "REPLACE INTO ".Config::Get('db.table.session')."
SET
@ -124,7 +148,12 @@ class ModuleUser_MapperUser extends Mapper {
";
return $this->oDb->query($sql,$oSession->getKey(), $oSession->getUserId(), $oSession->getIpCreate(), $oSession->getIpLast(), $oSession->getDateCreate(), $oSession->getDateLast());
}
/**
* Обновление данных сессии
*
* @param ModuleUser_EntitySession $oSession
* @return int|bool
*/
public function UpdateSession(ModuleUser_EntitySession $oSession) {
$sql = "UPDATE ".Config::Get('db.table.session')."
SET
@ -134,7 +163,12 @@ class ModuleUser_MapperUser extends Mapper {
";
return $this->oDb->query($sql,$oSession->getIpLast(), $oSession->getDateLast(), $oSession->getUserId());
}
/**
* Список сессий юзеров по ID
*
* @param array $aArrayId Список ID пользователей
* @return array
*/
public function GetSessionsByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
@ -154,7 +188,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aRes;
}
/**
* Список юзеров по ID
*
* @param array $aArrayId Список ID пользователей
* @return array
*/
public function GetUsersByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
@ -177,7 +216,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aUsers;
}
/**
* Получить юзера по ключу активации
*
* @param string $sKey Ключ активации
* @return int|null
*/
public function GetUserByActivateKey($sKey) {
$sql = "SELECT
u.user_id
@ -189,8 +233,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Получить юзера по мылу
*
* @param string $sMail Емайл
* @return int|null
*/
public function GetUserByMail($sMail) {
$sql = "SELECT
u.user_id
@ -202,7 +250,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Получить юзера по логину
*
* @param string $sLogin Логин пользователя
* @return int|null
*/
public function GetUserByLogin($sLogin) {
$sql = "SELECT
u.user_id
@ -215,8 +268,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Получить список юзеров по дате последнего визита
*
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByDateLast($iLimit) {
$sql = "SELECT
user_id
@ -234,7 +291,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aReturn;
}
/**
* Получить список юзеров по дате регистрации
*
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByDateRegister($iLimit) {
$sql = "SELECT
user_id
@ -254,28 +316,44 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aReturn;
}
/**
* Возвращает количество пользователй
*
* @return int
*/
public function GetCountUsers() {
$sql = "SELECT count(*) as count FROM ".Config::Get('db.table.user')." WHERE user_activate = 1";
$result=$this->oDb->selectRow($sql);
return $result['count'];
}
/**
* Возвращает количество активных пользователей
*
* @param string $sDateActive Дата
* @return mixed
*/
public function GetCountUsersActive($sDateActive) {
$sql = "SELECT count(*) as count FROM ".Config::Get('db.table.session')." WHERE session_date_last >= ? ";
$result=$this->oDb->selectRow($sql,$sDateActive);
return $result['count'];
}
/**
* Возвращает количество пользователей в разрезе полов
*
* @return array
*/
public function GetCountUsersSex() {
$sql = "SELECT user_profile_sex AS ARRAY_KEY, count(*) as count FROM ".Config::Get('db.table.user')." WHERE user_activate = 1 GROUP BY user_profile_sex ";
$result=$this->oDb->select($sql);
return $result;
}
/**
* Получить список юзеров по первым буквам логина
*
* @param string $sUserLogin Логин
* @param int $iLimit Количество
* @return array
*/
public function GetUsersByLoginLike($sUserLogin,$iLimit) {
$sql = "SELECT
user_id
@ -295,11 +373,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aReturn;
}
/**
* Добавляет друга
*
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function AddFriend(ModuleUser_EntityFriend $oFriend) {
$sql = "INSERT INTO ".Config::Get('db.table.friend')."
(user_from,
@ -322,7 +401,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Удаляет информацию о дружбе из базы данных
*
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function EraseFriend(ModuleUser_EntityFriend $oFriend) {
$sql = "DELETE FROM ".Config::Get('db.table.friend')."
WHERE
@ -336,7 +420,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Обновляет информацию о друге
*
* @param ModuleUser_EntityFriend $oFriend Объект дружбы(связи пользователей)
* @return bool
*/
public function UpdateFriend(ModuleUser_EntityFriend $oFriend) {
$sql = "
UPDATE ".Config::Get('db.table.friend')."
@ -361,13 +450,11 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Получить отношей дружбы по массиву идентификаторов
* Получить список отношений друзей
*
* @param array $aArrayId
* @param string $sUserId
* @param int $iStatus
* @param array $aArrayId Список ID пользователей проверяемых на дружбу
* @param int $sUserId ID пользователя у которого проверяем друзей
* @return array
*/
public function GetFriendsByArrayId($aArrayId,$sUserId) {
@ -398,12 +485,13 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aRes;
}
/**
* Получить список друзей указанного пользователя
* Получает список друзей
*
* @param string $sUserId
* @param int $iStatus
* @param int $sUserId ID пользователя
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetUsersFriend($sUserId,&$iCount,$iCurrPage,$iPerPage) {
@ -424,26 +512,31 @@ class ModuleUser_MapperUser extends Mapper {
LIMIT ?d, ?d ;";
$aUsers=array();
if ($aRows=$this->oDb->selectPage(
$iCount,
$sql,
$sUserId,
$sUserId,
ModuleUser::USER_FRIEND_ACCEPT+ModuleUser::USER_FRIEND_OFFER,
ModuleUser::USER_FRIEND_ACCEPT,
ModuleUser::USER_FRIEND_ACCEPT,
($iCurrPage-1)*$iPerPage, $iPerPage
)
$iCount,
$sql,
$sUserId,
$sUserId,
ModuleUser::USER_FRIEND_ACCEPT+ModuleUser::USER_FRIEND_OFFER,
ModuleUser::USER_FRIEND_ACCEPT,
ModuleUser::USER_FRIEND_ACCEPT,
($iCurrPage-1)*$iPerPage, $iPerPage
)
) {
foreach ($aRows as $aUser) {
$aUsers[]=($aUser['user_from']==$sUserId)
? $aUser['user_to']
: $aUser['user_from'];
? $aUser['user_to']
: $aUser['user_from'];
}
}
rsort($aUsers,SORT_NUMERIC);
return array_unique($aUsers);
}
/**
* Получает количество друзей
*
* @param int $sUserId ID пользователя
* @return int
*/
public function GetCountUsersFriend($sUserId) {
$sql = "SELECT
count(*) as c
@ -471,7 +564,6 @@ class ModuleUser_MapperUser extends Mapper {
}
return 0;
}
/**
* Получить список заявок на добавление в друзья от указанного пользователя
*
@ -493,11 +585,11 @@ class ModuleUser_MapperUser extends Mapper {
;";
$aUsers=array();
if ($aRows=$this->oDb->select(
$sql,
$sUserId,
ModuleUser::USER_FRIEND_OFFER,
$iStatus
)
$sql,
$sUserId,
ModuleUser::USER_FRIEND_OFFER,
$iStatus
)
) {
foreach ($aRows as $aUser) {
$aUsers[]=$aUser['user_to'];
@ -505,7 +597,6 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aUsers;
}
/**
* Получить список заявок на добавление в друзья от указанного пользователя
*
@ -527,11 +618,11 @@ class ModuleUser_MapperUser extends Mapper {
;";
$aUsers=array();
if ($aRows=$this->oDb->select(
$sql,
$sUserId,
ModuleUser::USER_FRIEND_OFFER,
$iStatus
)
$sql,
$sUserId,
ModuleUser::USER_FRIEND_OFFER,
$iStatus
)
) {
foreach ($aRows as $aUser) {
$aUsers[]=$aUser['user_from'];
@ -539,12 +630,13 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aUsers;
}
/**
* Получает инвайт по его коду
*
* @param string $sCode Код инвайта
* @param int $iUsed Флаг испольщования инвайта
* @return ModuleUser_EntityInvite|null
*/
public function GetInviteByCode($sCode,$iUsed=0) {
$sql = "SELECT * FROM ".Config::Get('db.table.invite')." WHERE invite_code = ? and invite_used = ?d ";
if ($aRow=$this->oDb->selectRow($sql,$sCode,$iUsed)) {
@ -552,7 +644,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Добавляет новый инвайт
*
* @param ModuleUser_EntityInvite $oInvite Объект инвайта
* @return int|bool
*/
public function AddInvite(ModuleUser_EntityInvite $oInvite) {
$sql = "INSERT INTO ".Config::Get('db.table.invite')."
(invite_code,
@ -566,7 +663,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Обновляет инвайт
*
* @param ModuleUser_EntityInvite $oInvite бъект инвайта
* @return bool
*/
public function UpdateInvite(ModuleUser_EntityInvite $oInvite) {
$sql = "UPDATE ".Config::Get('db.table.invite')."
SET
@ -580,7 +682,13 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Получает число использованых приглашений юзером за определенную дату
*
* @param int $sUserIdFrom ID пользователя
* @param string $sDate Дата
* @return int
*/
public function GetCountInviteUsedByDate($sUserIdFrom,$sDate) {
$sql = "SELECT count(invite_id) as count FROM ".Config::Get('db.table.invite')." WHERE user_from_id = ?d and invite_date_add >= ? ";
if ($aRow=$this->oDb->selectRow($sql,$sUserIdFrom,$sDate)) {
@ -588,7 +696,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return 0;
}
/**
* Получает полное число использованных приглашений юзера
*
* @param int $sUserIdFrom ID пользователя
* @return int
*/
public function GetCountInviteUsed($sUserIdFrom) {
$sql = "SELECT count(invite_id) as count FROM ".Config::Get('db.table.invite')." WHERE user_from_id = ?d";
if ($aRow=$this->oDb->selectRow($sql,$sUserIdFrom)) {
@ -596,7 +709,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return 0;
}
/**
* Получает список приглашенных юзеров
*
* @param int $sUserId ID пользователя
* @return array
*/
public function GetUsersInvite($sUserId) {
$sql = "SELECT
i.user_to_id
@ -612,7 +730,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aUsers;
}
/**
* Получает юзера который пригласил
*
* @param int $sUserIdTo ID пользователя
* @return int|null
*/
public function GetUserInviteFrom($sUserIdTo) {
$sql = "SELECT
i.user_from_id
@ -627,7 +750,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Добавляем воспоминание(восстановление) пароля
*
* @param ModuleUser_EntityReminder $oReminder Объект восстановления пароля
* @return bool
*/
public function AddReminder(ModuleUser_EntityReminder $oReminder) {
$sql = "REPLACE ".Config::Get('db.table.reminder')."
SET
@ -640,11 +768,21 @@ class ModuleUser_MapperUser extends Mapper {
";
return $this->oDb->query($sql,$oReminder->getCode(),$oReminder->getUserId(),$oReminder->getDateAdd(),$oReminder->getDateUsed(),$oReminder->getDateExpire(),$oReminder->getIsUsed());
}
/**
* Сохраняем воспомнинание(восстановление) пароля
*
* @param ModuleUser_EntityReminder $oReminder Объект восстановления пароля
* @return bool
*/
public function UpdateReminder(ModuleUser_EntityReminder $oReminder) {
return $this->AddReminder($oReminder);
}
/**
* Получаем запись восстановления пароля по коду
*
* @param string $sCode Код восстановления пароля
* @return ModuleUser_EntityReminder|null
*/
public function GetReminderByCode($sCode) {
$sql = "SELECT
*
@ -657,7 +795,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Получить дополнительные поля профиля пользователя
*
* @param array|null $aType Типы полей, null - все типы
* @return array
*/
public function getUserFields($aType) {
if (!is_null($aType) and !is_array($aType)) {
$aType=array($aType);
@ -673,16 +816,29 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aResult;
}
/**
* Получить по имени поля его значение дял определённого пользователя
*
* @param int $iUserId ID пользователя
* @param string $sName Имя поля
* @return string
*/
public function getUserFieldValueByName($iUserId, $sName) {
$sql = 'SELECT value FROM '.Config::Get('db.table.user_field_value').' WHERE
user_id = ?d
AND
user_id = ?d
AND
field_id = (SELECT id FROM '.Config::Get('db.table.user_field').' WHERE name =?)';
$ret = $this->oDb->selectCol($sql, $iUserId, $sName);
return $ret[0];
}
/**
* Получить значения дополнительных полей профиля пользователя
*
* @param int $iUserId ID пользователя
* @param bool $bOnlyNoEmpty Загружать только непустые поля
* @param array $aType Типы полей, null - все типы
* @return array
*/
public function getUserFieldsValues($iUserId, $bOnlyNoEmpty, $aType) {
if (!is_null($aType) and !is_array($aType)) {
$aType=array($aType);
@ -710,7 +866,14 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aResult;
}
/**
* Установить значения дополнительных полей профиля пользователя
*
* @param int $iUserId ID пользователя
* @param array $aFields Ассоциативный массив полей id => value
* @param int $iCountMax Максимальное количество одинаковых полей
* @return bool
*/
public function setUserFieldsValues($iUserId, $aFields, $iCountMax) {
if (!count($aFields)) return;
foreach ($aFields as $iId =>$sValue) {
@ -727,38 +890,72 @@ class ModuleUser_MapperUser extends Mapper {
$this->oDb->query($sql, $sValue, $iUserId, $iId);
}
}
/**
* Добавить поле
*
* @param ModuleUser_EntityField $oField Объект пользовательского поля
* @return bool
*/
public function addUserField($oField) {
$sql = 'INSERT INTO '.Config::Get('db.table.user_field').' SET
name = ?, title = ?, pattern = ?, type = ?';
return $this->oDb->query($sql, $oField->getName(), $oField->getTitle(), $oField->getPattern(), $oField->getType());
}
/**
* Удалить поле
*
* @param int $iId ID пользовательского поля
* @return bool
*/
public function deleteUserField($iId) {
$sql = 'DELETE FROM '.Config::Get('db.table.user_field_value').' WHERE field_id = ?d';
$this->oDb->query($sql, $iId);
$sql = 'DELETE FROM '.Config::Get('db.table.user_field').' WHERE
id = ?d';
$this->oDb->query($sql, $iId);
return true;
}
/**
* Изменить поле
*
* @param ModuleUser_EntityField $oField Объект пользовательского поля
* @return bool
*/
public function updateUserField($oField) {
$sql = 'UPDATE '.Config::Get('db.table.user_field').' SET
name = ?, title = ?, pattern = ?, type = ?
WHERE id = ?d';
$this->oDb->query($sql, $oField->getName(), $oField->getTitle(), $oField->getPattern(), $oField->getType(), $oField->getId());
return true;
}
/**
* Проверяет существует ли поле с таким именем
*
* @param string $sName Имя поля
* @param int|null $iId ID поля
* @return bool
*/
public function userFieldExistsByName($sName, $iId) {
$sql = 'SELECT id FROM '.Config::Get('db.table.user_field').' WHERE name = ? {AND id != ?d}';
return $this->oDb->select($sql, $sName, $iId ? $iId : DBSIMPLE_SKIP);
}
/**
* Проверяет существует ли поле с таким ID
*
* @param int $iId ID поля
* @return bool
*/
public function userFieldExistsById($iId) {
$sql = 'SELECT id FROM '.Config::Get('db.table.user_field').' WHERE id = ?d';
return $this->oDb->select($sql, $iId);
}
/**
* Удаляет у пользователя значения полей
*
* @param int $iUserId ID пользователя
* @param array|null $aType Список типов для удаления
* @return bool
*/
public function DeleteUserFieldValues($iUserId,$aType) {
if (!is_null($aType) and !is_array($aType)) {
$aType=array($aType);
@ -769,8 +966,15 @@ class ModuleUser_MapperUser extends Mapper {
)';
return $this->oDb->query($sql,$iUserId,(is_null($aType) or !count($aType)) ? DBSIMPLE_SKIP : $aType);
}
/**
* Возвращает список заметок пользователя
*
* @param int $iUserId ID пользователя
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetUserNotesByUserId($iUserId,&$iCount,$iCurrPage,$iPerPage) {
$sql = "
SELECT *
@ -788,7 +992,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aReturn;
}
/**
* Возвращает количество заметок у пользователя
*
* @param int $iUserId ID пользователя
* @return int
*/
public function GetCountUserNotesByUserId($iUserId) {
$sql = "
SELECT count(*) as c
@ -802,7 +1011,13 @@ class ModuleUser_MapperUser extends Mapper {
}
return 0;
}
/**
* Возвращет заметку по автору и пользователю
*
* @param int $iTargetUserId ID пользователя о ком заметка
* @param int $iUserId ID пользователя автора заметки
* @return ModuleUser_EntityNote|null
*/
public function GetUserNote($iTargetUserId,$iUserId) {
$sql = "SELECT * FROM ".Config::Get('db.table.user_note')." WHERE target_user_id = ?d and user_id = ?d ";
if ($aRow=$this->oDb->selectRow($sql,$iTargetUserId,$iUserId)) {
@ -810,7 +1025,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Возвращает заметку по ID
*
* @param int $iId ID заметки
* @return ModuleUser_EntityNote|null
*/
public function GetUserNoteById($iId) {
$sql = "SELECT * FROM ".Config::Get('db.table.user_note')." WHERE id = ?d ";
if ($aRow=$this->oDb->selectRow($sql,$iId)) {
@ -818,12 +1038,49 @@ class ModuleUser_MapperUser extends Mapper {
}
return null;
}
/**
* Возвращает список заметок пользователя по ID целевых юзеров
*
* @param array $aArrayId Список ID целевых пользователей
* @param int $sUserId ID пользователя, кто оставлял заметки
* @return array
*/
public function GetUserNotesByArrayUserId($aArrayId,$sUserId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
$sql = "SELECT
*
FROM
".Config::Get('db.table.user_note')."
WHERE target_user_id IN (?a) and user_id = ?d
";
$aRows=$this->oDb->select($sql,$aArrayId,$sUserId);
$aRes=array();
if ($aRows) {
foreach ($aRows as $aRow) {
$aRes[]=Engine::GetEntity('ModuleUser_EntityNote',$aRow);
}
}
return $aRes;
}
/**
* Удаляет заметку по ID
*
* @param int $iId ID заметки
* @return bool
*/
public function DeleteUserNoteById($iId) {
$sql = "DELETE FROM ".Config::Get('db.table.user_note')." WHERE id = ?d ";
return $this->oDb->query($sql,$iId);
}
/**
* Добавляет заметку
*
* @param ModuleUser_EntityNote $oNote Объект заметки
* @return int|null
*/
public function AddUserNote($oNote) {
$sql = "INSERT INTO ".Config::Get('db.table.user_note')." SET ?a ";
if ($iId=$this->oDb->query($sql,$oNote->_getData())) {
@ -831,8 +1088,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return false;
}
/**
* Обновляет заметку
*
* @param ModuleUser_EntityNote $oNote Объект заметки
* @return int
*/
public function UpdateUserNote($oNote) {
$sql = "UPDATE ".Config::Get('db.table.user_note')."
SET
@ -842,7 +1103,71 @@ class ModuleUser_MapperUser extends Mapper {
return $this->oDb->query($sql,$oNote->getText(),
$oNote->getId());
}
/**
* Добавляет запись о смене емайла
*
* @param ModuleUser_EntityChangemail $oChangemail Объект смены емайла
* @return int|null
*/
public function AddUserChangemail($oChangemail) {
$sql = "INSERT INTO ".Config::Get('db.table.user_changemail')." SET ?a ";
if ($iId=$this->oDb->query($sql,$oChangemail->_getData())) {
return $iId;
}
return false;
}
/**
* Обновляет запись о смене емайла
*
* @param ModuleUser_EntityChangemail $oChangemail Объект смены емайла
* @return int
*/
public function UpdateUserChangemail($oChangemail) {
$sql = "UPDATE ".Config::Get('db.table.user_changemail')."
SET
date_used = ?,
confirm_from = ?d,
confirm_to = ?d
WHERE id = ?d
";
return $this->oDb->query($sql,$oChangemail->getDateUsed(),$oChangemail->getConfirmFrom(),$oChangemail->getConfirmTo(),$oChangemail->getId());
}
/**
* Возвращает объект смены емайла по коду подтверждения
*
* @param string $sCode Код подтверждения
* @return ModuleUser_EntityChangemail|null
*/
public function GetUserChangemailByCodeFrom($sCode) {
$sql = "SELECT * FROM ".Config::Get('db.table.user_changemail')." WHERE code_from = ? ";
if ($aRow=$this->oDb->selectRow($sql,$sCode)) {
return Engine::GetEntity('ModuleUser_EntityChangemail',$aRow);
}
return null;
}
/**
* Возвращает объект смены емайла по коду подтверждения
*
* @param string $sCode Код подтверждения
* @return ModuleUser_EntityChangemail|null
*/
public function GetUserChangemailByCodeTo($sCode) {
$sql = "SELECT * FROM ".Config::Get('db.table.user_changemail')." WHERE code_to = ? ";
if ($aRow=$this->oDb->selectRow($sql,$sCode)) {
return Engine::GetEntity('ModuleUser_EntityChangemail',$aRow);
}
return null;
}
/**
* Возвращает список пользователей по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элментов на страницу
* @return array
*/
public function GetUsersByFilter($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('user_id','user_login','user_date_register','user_rating','user_skill','user_profile_name');
$sOrder='';
@ -895,8 +1220,12 @@ class ModuleUser_MapperUser extends Mapper {
}
return $aResult;
}
/**
* Возвращает список префиксов логинов пользователей (для алфавитного указателя)
*
* @param int $iPrefixLength Длина префикса
* @return array
*/
public function GetGroupPrefixUser($iPrefixLength=1) {
$sql = "
SELECT SUBSTRING(`user_login` FROM 1 FOR ?d ) as prefix

View file

@ -16,59 +16,75 @@
*/
/**
* Модуль пользовательских лент контента
* Модуль пользовательских лент контента (топиков)
*
* @package modules.userfeed
* @since 1.0
*/
class ModuleUserfeed extends Module
{
const SUBSCRIBE_TYPE_BLOG = 1; // Подписки на топики по блогу
const SUBSCRIBE_TYPE_USER = 2;// Подписки на топики по юзеру
class ModuleUserfeed extends Module {
/**
* Подписки на топики по блогу
*/
const SUBSCRIBE_TYPE_BLOG = 1;
/**
* Подписки на топики по юзеру
*/
const SUBSCRIBE_TYPE_USER = 2;
/**
* Объект маппера
*
* @var ModuleUserfeed_MapperUserfeed|null
*/
protected $oMapper = null;
/**
* Инициализация модуля
*/
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
}
/**
* Подписать пользователя
* @param type $iUserId Id подписываемого пользователя
* @param type $iSubscribeType Тип подписки (см. константы класса)
* @param type $iTargetId Id цели подписки
*/
* Подписать пользователя
*
* @param int $iUserId ID подписываемого пользователя
* @param int $iSubscribeType Тип подписки (см. константы класса)
* @param int $iTargetId ID цели подписки
* @return bool
*/
public function subscribeUser($iUserId, $iSubscribeType, $iTargetId) {
return $this->oMapper->subscribeUser($iUserId, $iSubscribeType, $iTargetId);
}
/**
* Отписать пользователя
* @param type $iUserId Id подписываемого пользователя
* @param type $iSubscribeType Тип подписки (см. константы класса)
* @param type $iTargetId Id цели подписки
*/
* Отписать пользователя
*
* @param int $iUserId ID подписываемого пользователя
* @param int $iSubscribeType Тип подписки (см. константы класса)
* @param int $iTargetId ID цели подписки
* @return bool
*/
public function unsubscribeUser($iUserId, $iSubscribeType, $iTargetId) {
return $this->oMapper->unsubscribeUser($iUserId, $iSubscribeType, $iTargetId);
}
/**
* Получить ленту топиков по подписке
* @param type $iUserId Id пользователя, для которого получаем ленту
* @param type $iCount Число получаемых записей (если null, из конфига)
* @param type $iFromId Получить записи, начиная с указанной
* @return type
*/
* Получить ленту топиков по подписке
*
* @param int $iUserId ID пользователя, для которого получаем ленту
* @param int $iCount Число получаемых записей (если null, из конфига)
* @param int $iFromId Получить записи, начиная с указанной
* @return array
*/
public function read($iUserId, $iCount = null, $iFromId = null) {
if (!$iCount) $iCount = Config::Get('module.userfeed.count_default');
$aUserSubscribes = $this->oMapper->getUserSubscribes($iUserId);
$aTopicsIds = $this->oMapper->readFeed($aUserSubscribes, $iCount, $iFromId);
return $this->Topic_getTopicsAdditionalData($aTopicsIds);
}
/**
* Получить список подписок пользователя
* @param type $iUserId Id пользователя, для которого загружаются подписки
* @return type
*/
* Получить список подписок пользователя
*
* @param int $iUserId ID пользователя, для которого загружаются подписки
* @return array
*/
public function getUserSubscribes($iUserId) {
$aUserSubscribes = $this->oMapper->getUserSubscribes($iUserId);
$aResult = array('blogs' => array(), 'users' => array());

View file

@ -15,47 +15,78 @@
---------------------------------------------------------
*/
class ModuleUserfeed_MapperUserfeed extends Mapper
{
public function subscribeUser($iUserId, $iSubscribeType, $iTargetId)
{
$sql = 'SELECT * FROM ' . Config::Get('db.table.userfeed_subscribe') . ' WHERE
/**
* Маппер для работы с БД
*
* @package modules.userfeed
* @since 1.0
*/
class ModuleUserfeed_MapperUserfeed extends Mapper {
/**
* Подписать пользователя
*
* @param int $iUserId ID подписываемого пользователя
* @param int $iSubscribeType Тип подписки (см. константы класса)
* @param int $iTargetId ID цели подписки
* @return bool
*/
public function subscribeUser($iUserId, $iSubscribeType, $iTargetId) {
$sql = 'SELECT * FROM ' . Config::Get('db.table.userfeed_subscribe') . ' WHERE
user_id = ?d AND subscribe_type = ?d AND target_id = ?d';
if (!$this->oDb->select($sql, $iUserId, $iSubscribeType, $iTargetId)) {
$sql = 'INSERT INTO ' . Config::Get('db.table.userfeed_subscribe') . ' SET
if (!$this->oDb->select($sql, $iUserId, $iSubscribeType, $iTargetId)) {
$sql = 'INSERT INTO ' . Config::Get('db.table.userfeed_subscribe') . ' SET
user_id = ?d, subscribe_type = ?d, target_id = ?d';
$this->oDb->query($sql, $iUserId, $iSubscribeType, $iTargetId);
}
}
public function unsubscribeUser($iUserId, $iSubscribeType, $iTargetId)
{
$sql = 'DELETE FROM ' . Config::Get('db.table.userfeed_subscribe') . ' WHERE
$this->oDb->query($sql, $iUserId, $iSubscribeType, $iTargetId);
return true;
}
return false;
}
/**
* Отписать пользователя
*
* @param int $iUserId ID подписываемого пользователя
* @param int $iSubscribeType Тип подписки (см. константы класса)
* @param int $iTargetId ID цели подписки
* @return bool
*/
public function unsubscribeUser($iUserId, $iSubscribeType, $iTargetId) {
$sql = 'DELETE FROM ' . Config::Get('db.table.userfeed_subscribe') . ' WHERE
user_id = ?d AND subscribe_type = ?d AND target_id = ?d';
$this->oDb->query($sql, $iUserId, $iSubscribeType, $iTargetId);
}
$this->oDb->query($sql, $iUserId, $iSubscribeType, $iTargetId);
return true;
}
/**
* Получить список подписок пользователя
*
* @param int $iUserId ID пользователя, для которого загружаются подписки
* @return array
*/
public function getUserSubscribes($iUserId) {
$sql = 'SELECT subscribe_type, target_id FROM ' . Config::Get('db.table.userfeed_subscribe') . ' WHERE user_id = ?d';
$aSubscribes = $this->oDb->select($sql, $iUserId);
$aResult = array('blogs' => array(), 'users' => array());
public function getUserSubscribes($iUserId)
{
$sql = 'SELECT subscribe_type, target_id FROM ' . Config::Get('db.table.userfeed_subscribe') . ' WHERE user_id = ?d';
$aSubscribes = $this->oDb->select($sql, $iUserId);
$aResult = array('blogs' => array(), 'users' => array());
if (!count($aSubscribes)) return $aResult;
if (!count($aSubscribes)) return $aResult;
foreach ($aSubscribes as $aSubscribe) {
if($aSubscribe['subscribe_type'] == ModuleUserfeed::SUBSCRIBE_TYPE_BLOG) {
$aResult['blogs'][] = $aSubscribe['target_id'];
} elseif ($aSubscribe['subscribe_type'] == ModuleUserfeed::SUBSCRIBE_TYPE_USER) {
$aResult['users'][] = $aSubscribe['target_id'];
}
}
return $aResult;
}
public function readFeed($aUserSubscribes, $iCount, $iFromId) {
$sql = "
foreach ($aSubscribes as $aSubscribe) {
if($aSubscribe['subscribe_type'] == ModuleUserfeed::SUBSCRIBE_TYPE_BLOG) {
$aResult['blogs'][] = $aSubscribe['target_id'];
} elseif ($aSubscribe['subscribe_type'] == ModuleUserfeed::SUBSCRIBE_TYPE_USER) {
$aResult['users'][] = $aSubscribe['target_id'];
}
}
return $aResult;
}
/**
* Получить ленту топиков по подписке
*
* @param array $aUserSubscribes Список подписок пользователя
* @param int $iCount Число получаемых записей (если null, из конфига)
* @param int $iFromId Получить записи, начиная с указанной
* @return array
*/
public function readFeed($aUserSubscribes, $iCount, $iFromId) {
$sql = "
SELECT
t.topic_id
FROM
@ -70,12 +101,12 @@ class ModuleUserfeed_MapperUserfeed extends Mapper
ORDER BY t.topic_id DESC
{ LIMIT 0, ?d }";
$aTopics=$aTopics=$this->oDb->selectCol($sql,
$iFromId ? $iFromId : DBSIMPLE_SKIP,
count($aUserSubscribes['blogs']) ? $aUserSubscribes['blogs'] : DBSIMPLE_SKIP,
count($aUserSubscribes['users']) ? $aUserSubscribes['users'] : DBSIMPLE_SKIP,
$iCount ? $iCount : DBSIMPLE_SKIP
);
return $aTopics;
}
$aTopics=$aTopics=$this->oDb->selectCol($sql,
$iFromId ? $iFromId : DBSIMPLE_SKIP,
count($aUserSubscribes['blogs']) ? $aUserSubscribes['blogs'] : DBSIMPLE_SKIP,
count($aUserSubscribes['users']) ? $aUserSubscribes['users'] : DBSIMPLE_SKIP,
$iCount ? $iCount : DBSIMPLE_SKIP
);
return $aTopics;
}
}

View file

@ -18,23 +18,29 @@
/**
* Модуль для работы с голосованиями
*
* @package modules.vote
* @since 1.0
*/
class ModuleVote extends Module {
protected $oMapper;
class ModuleVote extends Module {
/**
* Объект маппера
*
* @var ModuleVote_MapperVote
*/
protected $oMapper;
/**
* Инициализация
*
*/
public function Init() {
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
}
/**
* Добавляет голосование
*
* @param ModuleVote_EntityVote $oVote
* @return unknown
* @param ModuleVote_EntityVote $oVote Объект голосования
* @return bool
*/
public function AddVote(ModuleVote_EntityVote $oVote) {
if (!$oVote->getIp()) {
@ -47,14 +53,13 @@ class ModuleVote extends Module {
}
return false;
}
/**
* Получает голосование
*
* @param unknown_type $sTargetId
* @param unknown_type $sTargetType
* @param unknown_type $sUserId
* @return unknown
* @param int $sTargetId ID владельца
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return ModuleVote_EntityVote|null
*/
public function GetVote($sTargetId,$sTargetType,$sUserId) {
$data=$this->GetVoteByArray($sTargetId,$sTargetType,$sUserId);
@ -63,12 +68,13 @@ class ModuleVote extends Module {
}
return null;
}
/**
* Получить список голосований по списку айдишников
*
* @param unknown_type $sTargetId
* @param unknown_type $sTargetType
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetVoteByArray($aTargetId,$sTargetType,$sUserId) {
if (!$aTargetId) {
@ -87,25 +93,25 @@ class ModuleVote extends Module {
* Делаем мульти-запрос к кешу
*/
$aCacheKeys=func_build_cache_keys($aTargetId,"vote_{$sTargetType}_",'_'.$sUserId);
if (false !== ($data = $this->Cache_Get($aCacheKeys))) {
if (false !== ($data = $this->Cache_Get($aCacheKeys))) {
/**
* проверяем что досталось из кеша
*/
foreach ($aCacheKeys as $sValue => $sKey ) {
if (array_key_exists($sKey,$data)) {
if (array_key_exists($sKey,$data)) {
if ($data[$sKey]) {
$aVote[$data[$sKey]->getTargetId()]=$data[$sKey];
} else {
$aIdNotNeedQuery[]=$sValue;
}
}
}
}
}
/**
* Смотрим каких топиков не было в кеше и делаем запрос в БД
*/
$aIdNeedQuery=array_diff($aTargetId,array_keys($aVote));
$aIdNeedQuery=array_diff($aIdNeedQuery,$aIdNotNeedQuery);
*/
$aIdNeedQuery=array_diff($aTargetId,array_keys($aVote));
$aIdNeedQuery=array_diff($aIdNeedQuery,$aIdNotNeedQuery);
$aIdNeedStore=$aIdNeedQuery;
if ($data = $this->oMapper->GetVoteByArray($aIdNeedQuery,$sTargetType,$sUserId)) {
foreach ($data as $oVote) {
@ -122,59 +128,57 @@ class ModuleVote extends Module {
*/
foreach ($aIdNeedStore as $sId) {
$this->Cache_Set(null, "vote_{$sTargetType}_{$sId}_{$sUserId}", array(), 60*60*24*7);
}
}
/**
* Сортируем результат согласно входящему массиву
*/
$aVote=func_array_sort_by_keys($aVote,$aTargetId);
return $aVote;
return $aVote;
}
/**
* Получить список голосований по списку айдишников, но используя единый кеш
*
* @param unknown_type $aTargetId
* @param unknown_type $sTargetType
* @param unknown_type $sUserId
* @return unknown
* @param array $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetVoteByArraySolid($aTargetId,$sTargetType,$sUserId) {
if (!is_array($aTargetId)) {
$aTargetId=array($aTargetId);
}
$aTargetId=array_unique($aTargetId);
$aVote=array();
$aTargetId=array_unique($aTargetId);
$aVote=array();
$s=join(',',$aTargetId);
if (false === ($data = $this->Cache_Get("vote_{$sTargetType}_{$sUserId}_id_{$s}"))) {
if (false === ($data = $this->Cache_Get("vote_{$sTargetType}_{$sUserId}_id_{$s}"))) {
$data = $this->oMapper->GetVoteByArray($aTargetId,$sTargetType,$sUserId);
foreach ($data as $oVote) {
$aVote[$oVote->getTargetId()]=$oVote;
}
$this->Cache_Set(
$aVote, "vote_{$sTargetType}_{$sUserId}_id_{$s}",
array("vote_update_{$sTargetType}_{$sUserId}","vote_update_{$sTargetType}"),
$aVote, "vote_{$sTargetType}_{$sUserId}_id_{$s}",
array("vote_update_{$sTargetType}_{$sUserId}","vote_update_{$sTargetType}"),
60*60*24*1
);
return $aVote;
}
}
return $data;
}
/**
* Удаляет голосование из базы по списку идентификаторов таргета
*
* @param array|int $aTargetId
* @param string $sTargetType
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteVoteByTarget($aTargetId, $sTargetType) {
if (!is_array($aTargetId)) $aTargetId=array($aTargetId);
$aTargetId=array_unique($aTargetId);
/**
* Чистим зависимые кеши
*/
$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array("vote_update_{$sTargetType}"));
return $this->oMapper->DeleteVoteByTarget($aTargetId,$sTargetType);
return $this->oMapper->DeleteVoteByTarget($aTargetId,$sTargetType);
}
}
?>

View file

@ -15,50 +15,124 @@
---------------------------------------------------------
*/
class ModuleVote_EntityVote extends Entity
{
public function getTargetId() {
return $this->_getDataOne('target_id');
}
public function getTargetType() {
return $this->_getDataOne('target_type');
}
public function getVoterId() {
return $this->_getDataOne('user_voter_id');
}
public function getDirection() {
return $this->_getDataOne('vote_direction');
}
public function getValue() {
return $this->_getDataOne('vote_value');
}
public function getDate() {
/**
* Сущность голосования
*
* @package modules.vote
* @since 1.0
*/
class ModuleVote_EntityVote extends Entity {
/**
* Возвращает ID владельца
*
* @return int|null
*/
public function getTargetId() {
return $this->_getDataOne('target_id');
}
/**
* Возвращает тип владельца
*
* @return string|null
*/
public function getTargetType() {
return $this->_getDataOne('target_type');
}
/**
* Возвращает ID проголосовавшего пользователя
*
* @return int|null
*/
public function getVoterId() {
return $this->_getDataOne('user_voter_id');
}
/**
* Возвращает направление голоса: 0, 1, -1
*
* @return int|null
*/
public function getDirection() {
return $this->_getDataOne('vote_direction');
}
/**
* Возвращает значение при голосовании
*
* @return float|null
*/
public function getValue() {
return $this->_getDataOne('vote_value');
}
/**
* Возвращает дату голосования
*
* @return string|null
*/
public function getDate() {
return $this->_getDataOne('vote_date');
}
}
/**
* Возвращает IP голосовавшего
*
* @return string|null
*/
public function getIp() {
return $this->_getDataOne('vote_ip');
}
/**
* Устанавливает ID владельца
*
* @param int $data
*/
public function setTargetId($data) {
$this->_aData['target_id']=$data;
}
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
public function setVoterId($data) {
$this->_aData['user_voter_id']=$data;
}
public function setDirection($data) {
$this->_aData['vote_direction']=$data;
}
public function setValue($data) {
$this->_aData['vote_value']=$data;
}
public function setDate($data) {
$this->_aData['vote_date']=$data;
}
$this->_aData['target_id']=$data;
}
/**
* Устанавливает тип владельца
*
* @param string $data
*/
public function setTargetType($data) {
$this->_aData['target_type']=$data;
}
/**
* Устанавливает ID проголосовавшего пользователя
*
* @param int $data
*/
public function setVoterId($data) {
$this->_aData['user_voter_id']=$data;
}
/**
* Устанавливает направление голоса: 0, 1, -1
*
* @param int $data
*/
public function setDirection($data) {
$this->_aData['vote_direction']=$data;
}
/**
* Устанавливает значение при голосовании
*
* @param float $data
*/
public function setValue($data) {
$this->_aData['vote_value']=$data;
}
/**
* Устанавливает дату голосования
*
* @param string $data
*/
public function setDate($data) {
$this->_aData['vote_date']=$data;
}
/**
* Устанавливает IP голосовавшего
*
* @param string $data
*/
public function setIp($data) {
$this->_aData['vote_ip']=$data;
}

View file

@ -15,9 +15,19 @@
---------------------------------------------------------
*/
class ModuleVote_MapperVote extends Mapper {
/**
* Маппер для работы с БД
*
* @package modules.vote
* @since 1.0
*/
class ModuleVote_MapperVote extends Mapper {
/**
* Добавляет голосование
*
* @param ModuleVote_EntityVote $oVote Объект голосования
* @return bool
*/
public function AddVote(ModuleVote_EntityVote $oVote) {
$sql = "INSERT INTO ".Config::Get('db.table.vote')."
(target_id,
@ -29,19 +39,25 @@ class ModuleVote_MapperVote extends Mapper {
vote_ip
)
VALUES(?d, ?, ?d, ?d, ?f, ?, ?)
";
";
if ($this->oDb->query($sql,$oVote->getTargetId(),$oVote->getTargetType(),$oVote->getVoterId(),$oVote->getDirection(),$oVote->getValue(),$oVote->getDate(),$oVote->getIp())===0)
{
return true;
}
}
return false;
}
/**
* Получить список голосований по списку айдишников
*
* @param array $aArrayId Список ID владельцев
* @param string $sTargetType Тип владельца
* @param int $sUserId ID пользователя
* @return array
*/
public function GetVoteByArray($aArrayId,$sTargetType,$sUserId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();
}
}
$sql = "SELECT
*
FROM
@ -57,10 +73,16 @@ class ModuleVote_MapperVote extends Mapper {
foreach ($aRows as $aRow) {
$aVotes[]=Engine::GetEntity('Vote',$aRow);
}
}
}
return $aVotes;
}
}
/**
* Удаляет голосование из базы по списку идентификаторов таргета
*
* @param array|int $aTargetId Список ID владельцев
* @param string $sTargetType Тип владельца
* @return bool
*/
public function DeleteVoteByTarget($aTargetId,$sTargetType) {
$sql = "
DELETE FROM ".Config::Get('db.table.vote')."
@ -68,7 +90,7 @@ class ModuleVote_MapperVote extends Mapper {
target_id IN(?a)
AND
target_type = ?
";
";
if ($this->oDb->query($sql,$aTargetId,$sTargetType)) {
return true;
}

View file

@ -18,28 +18,36 @@
/**
* Модуль Wall - записи на стене профиля пользователя
*
* @package modules.wall
* @since 1.0
*/
class ModuleWall extends Module {
/**
* Объект маппера
*
* @var ModuleWall_MapperWall
*/
protected $oMapper;
/**
* Объект текущего пользователя
*
* @var ModuleUser_EntityUser|null
*/
protected $oUserCurrent;
/**
* Инициализация
*
*/
public function Init() {
public function Init() {
$this->oMapper=Engine::GetMapper(__CLASS__);
$this->oUserCurrent=$this->User_GetUserCurrent();
}
/**
* Добавление записи на стену
*
* @param ModuleWall_EntityWall $oWall
*
* @return bool | ModuleWall_EntityWall
* @param ModuleWall_EntityWall $oWall Объект записи на стене
* @return bool|ModuleWall_EntityWall
*/
public function AddWall($oWall) {
if (!$oWall->getDateAdd()) {
@ -60,27 +68,23 @@ class ModuleWall extends Module {
}
return false;
}
/**
* Обновление записи
*
* @param ModuleWall_EntityWall $oWall
*
* @param ModuleWall_EntityWall $oWall Объект записи на стене
* @return bool
*/
public function UpdateWall($oWall) {
return $this->oMapper->UpdateWall($oWall);
}
/**
* Получение списка записей по фильтру
*
* @param $aFilter
* @param $aOrder
* @param int $iCurrPage
* @param int $iPerPage
* @param array $aAllowData
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @param array $aAllowData Список типов дополнительных данных для подгрузки в сообщения стены
* @return array('collection'=>array,'count'=>int)
*/
public function GetWall($aFilter,$aOrder,$iCurrPage=1,$iPerPage=10,$aAllowData=null) {
@ -94,19 +98,16 @@ class ModuleWall extends Module {
/**
* Возвращает число сообщений на стене по фильтру
*
* @param $aFilter
*
* @param array $aFilter Фильтр
* @return int
*/
public function GetCountWall($aFilter) {
return $this->oMapper->GetCountWall($aFilter);
}
/**
* Получение записей по ID, без дополнительных данных
*
* @param array $aWallId
*
* @param array $aWallId Список ID сообщений
* @return array
*/
public function GetWallsByArrayId($aWallId) {
@ -121,13 +122,11 @@ class ModuleWall extends Module {
}
return $aWalls;
}
/**
* Получение записей по ID с дополнительные связаными данными
*
* @param $aWallId
* @param array $aAllowData
*
* @param array $aWallId Список ID сообщений
* @param array $aAllowData Список типов дополнительных данных для подгрузки в сообщения стены
* @return array
*/
public function GetWallAdditionalData($aWallId,$aAllowData=null) {
@ -197,27 +196,26 @@ class ModuleWall extends Module {
}
return $aWalls;
}
/**
* Получение записи по ID
*
* @param int $iId
*
* @param int $iId ID сообщения/записи
* @return ModuleWall_EntityWall
*/
public function GetWallById($iId) {
if (!is_numeric($iId)) {
return null;
}
$aResult=$this->GetWallAdditionalData($iId);
if (isset($aResult[$iId])) {
return $aResult[$iId];
}
return null;
}
/**
* Обновляет родительские данные у записи - количество ответов и ID последних ответов
*
* @param ModuleWall_EntityWall $oWall
*
* @param ModuleWall_EntityWall $oWall Объект записи на стене
* @param null|int $iLimit
*/
public function UpdatePidWall($oWall,$iLimit=null) {
@ -237,11 +235,10 @@ class ModuleWall extends Module {
}
$this->UpdateWall($oWall);
}
/**
* Удаление сообщения
*
* @param $oWall
* @param ModuleWall_EntityWall $oWall Объект записи на стене
*/
public function DeleteWall($oWall) {
$this->oMapper->DeleteWallsByPid($oWall->getId());
@ -250,6 +247,5 @@ class ModuleWall extends Module {
$this->UpdatePidWall($oWallParent);
}
}
}
?>

View file

@ -15,16 +15,26 @@
---------------------------------------------------------
*/
/**
* Сущность записи на стене
*
* @package modules.wall
* @since 1.0
*/
class ModuleWall_EntityWall extends Entity {
/**
* Определяем правила валидации
*
* @var array
*/
protected $aValidateRules=array(
array('pid','pid','on'=>array('','add')),
array('user_id','time_limit','on'=>array('add')),
);
/**
* Инициализация
*/
public function Init() {
parent::Init();
$this->aValidateRules[]=array('text','string','max'=>Config::Get('module.wall.text_max'),'min'=>Config::Get('module.wall.text_min'),'allowEmpty'=>false,'on'=>array('','add'));
@ -32,10 +42,9 @@ class ModuleWall_EntityWall extends Entity {
/**
* Проверка на ограничение по времени
*
* @param $sValue
* @param $aParams
*
* @return bool
* @param string $sValue Проверяемое значение
* @param array $aParams Параметры
* @return bool|string
*/
public function ValidateTimeLimit($sValue,$aParams) {
if ($oUser=$this->User_GetUserById($this->getUserId())) {
@ -48,10 +57,9 @@ class ModuleWall_EntityWall extends Entity {
/**
* Валидация родительского сообщения
*
* @param $sValue
* @param $aParams
*
* @return bool
* @param string $sValue Проверяемое значение
* @param array $aParams Параметры
* @return bool|string
*/
public function ValidatePid($sValue,$aParams) {
if (!$sValue) {
@ -67,11 +75,10 @@ class ModuleWall_EntityWall extends Entity {
}
return $this->Lang_Get('wall_add_pid_error');
}
/**
* Возвращает родительскую запись
*
* @return ModuleWall_EntityWall
* @return ModuleWall_EntityWall|null
*/
public function GetPidWall() {
if ($this->getPid()) {
@ -79,7 +86,6 @@ class ModuleWall_EntityWall extends Entity {
}
return null;
}
/**
* Проверка на возможность удаления сообщения
*
@ -93,11 +99,10 @@ class ModuleWall_EntityWall extends Entity {
}
return false;
}
/**
* Возвращает пользователя, которому принадлежит стена
*
* @return mixed
* @return ModuleUser_EntityUser|null
*/
public function getWallUser() {
if (!$this->_getDataOne('wall_user')) {
@ -105,7 +110,6 @@ class ModuleWall_EntityWall extends Entity {
}
return $this->_getDataOne('wall_user');
}
/**
* Возвращает URL стены
*

View file

@ -15,39 +15,71 @@
---------------------------------------------------------
*/
/**
* Маппер для работы с БД
*
* @package modules.wall
* @since 1.0
*/
class ModuleWall_MapperWall extends Mapper {
/**
* Добавление записи на стену
*
* @param ModuleWall_EntityWall $oWall Объект записи на стене
* @return bool|int
*/
public function AddWall($oWall) {
$sql = "INSERT INTO ".Config::Get('db.table.wall')." SET ?a ";
if ($iId=$this->oDb->query($sql,$oWall->_getData())) {
return $iId;
}
}
return false;
}
/**
* Обновление записи
*
* @param ModuleWall_EntityWall $oWall Объект записи на стене
* @return bool
*/
public function UpdateWall($oWall) {
$sql = "UPDATE ".Config::Get('db.table.wall')."
SET
count_reply = ?d,
last_reply = ?
WHERE id = ?d
";
";
return $this->oDb->query($sql,$oWall->getCountReply(),
$oWall->getLastReply(),
$oWall->getId());
}
/**
* Удаление записи
*
* @param int $iId ID записи
* @return bool
*/
public function DeleteWallById($iId) {
$sql = "DELETE FROM ".Config::Get('db.table.wall')." WHERE id = ?d ";
return $this->oDb->query($sql,$iId);
}
/**
* @param int $iPid ID родительской записи
* @return bool
*/
public function DeleteWallsByPid($iPid) {
$sql = "DELETE FROM ".Config::Get('db.table.wall')." WHERE pid = ?d ";
return $this->oDb->query($sql,$iPid);
}
/**
* Получение списка записей по фильтру
*
* @param array $aFilter Фильтр
* @param array $aOrder Сортировка
* @param int $iCount Возвращает общее количество элементов
* @param int $iCurrPage Номер страницы
* @param int $iPerPage Количество элементов на страницу
* @return array
*/
public function GetWall($aFilter,$aOrder,&$iCount,$iCurrPage,$iPerPage) {
$aOrderAllow=array('id','date_add');
$sOrder='';
@ -99,8 +131,12 @@ class ModuleWall_MapperWall extends Mapper {
}
return $aResult;
}
/**
* Возвращает число сообщений на стене по фильтру
*
* @param array $aFilter Фильтр
* @return int
*/
public function GetCountWall($aFilter) {
$sql = "SELECT
count(*) as c
@ -117,19 +153,24 @@ class ModuleWall_MapperWall extends Mapper {
{ AND id > ?d };
";
if ($aRow=$this->oDb->selectRow($sql,
(isset($aFilter['pid']) and !is_null($aFilter['pid'])) ? $aFilter['pid'] : DBSIMPLE_SKIP,
(array_key_exists('pid',$aFilter) and is_null($aFilter['pid'])) ? 1 : DBSIMPLE_SKIP,
isset($aFilter['wall_user_id']) ? $aFilter['wall_user_id'] : DBSIMPLE_SKIP,
isset($aFilter['ip']) ? $aFilter['ip'] : DBSIMPLE_SKIP,
isset($aFilter['id']) ? $aFilter['id'] : DBSIMPLE_SKIP,
isset($aFilter['id_less']) ? $aFilter['id_less'] : DBSIMPLE_SKIP,
isset($aFilter['id_more']) ? $aFilter['id_more'] : DBSIMPLE_SKIP
(isset($aFilter['pid']) and !is_null($aFilter['pid'])) ? $aFilter['pid'] : DBSIMPLE_SKIP,
(array_key_exists('pid',$aFilter) and is_null($aFilter['pid'])) ? 1 : DBSIMPLE_SKIP,
isset($aFilter['wall_user_id']) ? $aFilter['wall_user_id'] : DBSIMPLE_SKIP,
isset($aFilter['ip']) ? $aFilter['ip'] : DBSIMPLE_SKIP,
isset($aFilter['id']) ? $aFilter['id'] : DBSIMPLE_SKIP,
isset($aFilter['id_less']) ? $aFilter['id_less'] : DBSIMPLE_SKIP,
isset($aFilter['id_more']) ? $aFilter['id_more'] : DBSIMPLE_SKIP
)) {
return $aRow['c'];
}
return 0;
}
/**
* Получение записей по ID, без дополнительных данных
*
* @param array $aArrayId Список ID сообщений
* @return array
*/
public function GetWallsByArrayId($aArrayId) {
if (!is_array($aArrayId) or count($aArrayId)==0) {
return array();

View file

@ -18,10 +18,10 @@
/**
* Настройки HTML вида
*/
$config['view']['skin'] = 'developer'; // шаблон(скин)
$config['view']['name'] = 'LiveStreet'; // название сайта
$config['view']['description'] = 'LiveStreet - официальный сайт бесплатного движка социальной сети'; // seo description
$config['view']['keywords'] = 'движок, livestreet, блоги, социальная сеть, бесплатный, php'; // seo keywords
$config['view']['skin'] = 'synio'; // шаблон(скин)
$config['view']['name'] = 'Your Site'; // название сайта
$config['view']['description'] = 'Description your site'; // seo description
$config['view']['keywords'] = 'site, google, internet'; // seo keywords
$config['view']['tinymce'] = false; // использовать или нет визуальный редактор TinyMCE
$config['view']['noindex'] = true; // "прятать" или нет ссылки от поисковиков, оборачивая их в тег <noindex> и добавляя rel="nofollow"
$config['view']['img_resize_width'] = 570; // до какого размера в пикселях ужимать картинку по щирине при загрузки её в топики и комменты
@ -39,6 +39,7 @@ $config['seo']['description_words_count'] = 20; // количес
* Настройка основных блоков
*/
$config['block']['stream']['row'] = 20; // сколько записей выводить в блоке "Прямой эфир"
$config['block']['stream']['show_tip'] = true; // выводить или нет всплывающие сообщения в блоке "Прямой эфир"
$config['block']['blogs']['row'] = 10; // сколько записей выводить в блоке "Блоги"
$config['block']['tags']['tags_count'] = 70; // сколько тегов выводить в блоке "теги"
$config['block']['tags']['personal_tags_count'] = 70; // сколько тегов пользователя выводить в блоке "теги"
@ -100,7 +101,7 @@ $config['sys']['session']['path'] = '___sys.cookie.path___'; // путь с
*/
$config['sys']['mail']['type'] = 'mail'; // Какой тип отправки использовать
$config['sys']['mail']['from_email'] = 'admin@admin.adm'; // Мыло с которого отправляются все уведомления
$config['sys']['mail']['from_name'] = 'Почтовик LiveStreet'; // Имя с которого отправляются все уведомления
$config['sys']['mail']['from_name'] = 'Почтовик Your Site'; // Имя с которого отправляются все уведомления
$config['sys']['mail']['charset'] = 'UTF-8'; // Какую кодировку использовать в письмах
$config['sys']['mail']['smtp']['host'] = 'localhost'; // Настройки SMTP - хост
$config['sys']['mail']['smtp']['port'] = 25; // Настройки SMTP - порт
@ -355,6 +356,7 @@ $config['db']['table']['geo_country'] = '___db.table.prefix___geo_countr
$config['db']['table']['geo_region'] = '___db.table.prefix___geo_region';
$config['db']['table']['geo_city'] = '___db.table.prefix___geo_city';
$config['db']['table']['geo_target'] = '___db.table.prefix___geo_target';
$config['db']['table']['user_changemail'] = '___db.table.prefix___user_changemail';
$config['db']['tables']['engine'] = 'InnoDB'; // InnoDB или MyISAM
/**
@ -473,20 +475,6 @@ $config['block']['rule_blog_info'] = array(
);
/**
* Настройки вывода js и css файлов
*/
$config['head']['rules']['page'] =array(
'path'=>$config['path']['root']['web'].'/page/',
'js' => array(
'exclude' => array(
"___path.static.skin___/js/vote.js",
"___path.static.skin___/js/favourites.js",
"___path.static.skin___/js/questions.js",
)
),
);
$config['head']['default']['js'] = array(
"___path.root.engine_lib___/external/html5shiv.js" => array('browser'=>'lt IE 9'),
"___path.root.engine_lib___/external/jquery/jquery.js",

View file

@ -18,7 +18,7 @@
/**
* Основные константы
*/
define('LS_VERSION','1.0-dev');
define('LS_VERSION','1.0.1');
/**
* Operations with Config object
@ -68,7 +68,7 @@ if ($hDirInclude = opendir($sDirInclude)) {
$sFileIncludePathFull=$sDirInclude.$sFileInclude;
if ($sFileInclude !='.' and $sFileInclude !='..' and is_file($sFileIncludePathFull)) {
$aPathInfo=pathinfo($sFileIncludePathFull);
if (strtolower($aPathInfo['extension'])=='php') {
if (isset($aPathInfo['extension']) and strtolower($aPathInfo['extension'])=='php') {
require_once($sDirInclude.$sFileInclude);
}
}
@ -85,7 +85,7 @@ if ($hDirInclude = opendir($sDirInclude)) {
$sFileIncludePathFull=$sDirInclude.$sFileInclude;
if ($sFileInclude !='.' and $sFileInclude !='..' and is_file($sFileIncludePathFull)) {
$aPathInfo=pathinfo($sFileIncludePathFull);
if (strtolower($aPathInfo['extension'])=='php') {
if (isset($aPathInfo['extension']) and strtolower($aPathInfo['extension'])=='php') {
require_once($sDirInclude.$sFileInclude);
}
}

View file

@ -18,7 +18,7 @@
set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
require_once(Config::Get('path.root.engine').'/lib/internal/ProfilerSimple/Profiler.class.php');
require_once("Object.class.php");
require_once("LsObject.class.php");
require_once("Plugin.class.php");
require_once("Block.class.php");
require_once("Hook.class.php");
@ -612,6 +612,25 @@ class Engine extends LsObject {
return array($oModule,$sModuleName,$sMethod);
}
/**
* Возвращает объект модуля
*
* @param string $sName Имя модуля
*/
public function GetModuleObject($sName) {
if(self::GetPluginPrefix($sName)){
if(substr_count($sName,'_')<2) {
$sName.='_x';
}
} else {
if(substr_count($sName,'_')<1) {
$sName.='_x';
}
}
$aCallArray=$this->GetModule($sName);
return $aCallArray[0];
}
/**
* Возвращает статистику выполнения
*

View file

@ -258,6 +258,19 @@ abstract class Plugin extends LsObject {
return Config::Get('path.root.server').'/plugins/'.$sName.'/';
}
/**
* Возвращает полный web-адрес до плагина
*
* @param string $sName
* @return string
*/
static public function GetWebPath($sName) {
$sName = preg_match('/^Plugin([\w]+)(_[\w]+)?$/Ui',$sName,$aMatches)
? strtolower($aMatches[1])
: strtolower($sName);
return Config::Get('path.root.web').'/plugins/'.$sName.'/';
}
/**
* Возвращает правильный серверный путь к директории шаблонов с учетом текущего шаблона
* Если пользователь использует шаблон которого нет в плагине, то возвращает путь до шабона плагина 'default'

View file

@ -234,11 +234,9 @@ class Router extends LsObject {
public function ExecAction() {
$this->DefineActionClass();
/**
* Сначала запускаем инициализирующий экшен
* Сначала запускаем инициализирующий евент
*/
require_once(Config::Get('path.root.server').'/classes/actions/Init.class.php');
$oActionInit=new InitAction($this->oEngine);
$oActionInit->InitAction();
$this->Hook_Run('init_action');
$sActionClass=$this->DefineActionClass();
/**

View file

@ -1,4 +1,4 @@
Перейдите в данную папку с помощью консольной команды cd livestreet/engile/console/ и вызовите php ls.
Перейдите в данную папку с помощью консольной команды cd livestreet/engine/console/ и вызовите php ls.
Вы получите краткую справку и существующих командах, например:
php ls plugin new test
Так мы создадим новый плагин с именем Test

View file

@ -441,4 +441,20 @@ function func_list_plugins($bAll = false){
return $aPlugin;
}
function func_convert_entity_to_array(Entity $oEntity, $aMethods = null, $sPrefix = '') {
if(!is_array($aMethods)) {
$aMethods=get_class_methods($oEntity);
}
$aEntity=array();
foreach($aMethods as $sMethod) {
if(!preg_match('#^get([a-z][a-z\d]*)$#i', $sMethod, $aMatch)) {
continue;
}
$sProp=strtolower(preg_replace('#([a-z])([A-Z])#', '$1_$2', $aMatch[1]));
$mValue=call_user_func(array($oEntity,$sMethod));
$aEntity[$sPrefix.$sProp]=$mValue;
}
return $aEntity;
}
?>

View file

@ -1,478 +0,0 @@
<?php
/**
* CSSTidy - CSS Optimiser Interface
* This file produces an XHTML interface for optimising CSS code
*
* Copyright 2005, 2006, 2007 Florian Schmitz
*
* This file is part of CSSTidy.
*
* CSSTidy is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* CSSTidy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @license http://opensource.org/licenses/lgpl-license.php GNU Lesser General Public License
* @package csstidy
* @author Florian Schmitz (floele at gmail dot com) 2005-2007
* @author Brett Zamir (brettz9 at yahoo dot com) 2007
*/
require('class.csstidy.php');
require('lang.inc.php');
if (get_magic_quotes_gpc()) {
if (isset($_REQUEST['css_text'])) {
$_REQUEST['css_text'] = stripslashes($_REQUEST['css_text']);
}
if (isset($_REQUEST['custom'])) {
$_REQUEST['custom'] = stripslashes($_REQUEST['custom']);
}
if (isset($_COOKIE['custom_template'])) {
$_COOKIE['custom_template'] = stripslashes($_COOKIE['custom_template']);
}
}
function rmdirr($dirname,$oc=0)
{
// Sanity check
if (!file_exists($dirname)) {
return false;
}
// Simple delete for a file
if (is_file($dirname) && (time()-fileatime($dirname))>3600) {
return unlink($dirname);
}
// Loop through the folder
if(is_dir($dirname))
{
$dir = dir($dirname);
while (false !== $entry = $dir->read()) {
// Skip pointers
if ($entry === '.' || $entry === '..') {
continue;
}
// Recurse
rmdirr($dirname.'/'.$entry,$oc);
}
$dir->close();
}
// Clean up
if ($oc==1)
{
return rmdir($dirname);
}
}
function options($options, $selected = null, $labelIsValue = false)
{
$html = '';
settype($selected, 'array');
settype($options, 'array');
foreach ($options as $value=>$label)
{
if (is_array($label)) {
$value = $label[0];
$label = $label[1];
}
$label = htmlspecialchars($label, ENT_QUOTES, 'utf-8');
$value = $labelIsValue ? $label
: htmlspecialchars($value, ENT_QUOTES, 'utf-8');
$html .= '<option value="'.$value.'"';
if (in_array($value, $selected)) {
$html .= ' selected="selected"';
}
$html .= '>'.$label.'</option>';
}
if (!$html) {
$html .= '<option value="0">---</option>';
}
return $html;
}
$css = new csstidy();
$is_custom = isset($_REQUEST['custom']) && !empty($_REQUEST['custom']) && isset($_REQUEST['template']) && ($_REQUEST['template'] === '4');
if($is_custom)
{
setcookie ('custom_template', $_REQUEST['custom'], time()+360000);
}
rmdirr('temp');
if(isset($_REQUEST['case_properties'])) $css->set_cfg('case_properties',$_REQUEST['case_properties']);
if(isset($_REQUEST['lowercase'])) $css->set_cfg('lowercase_s',true);
if(!isset($_REQUEST['compress_c']) && isset($_REQUEST['post'])) $css->set_cfg('compress_colors',false);
if(!isset($_REQUEST['compress_fw']) && isset($_REQUEST['post'])) $css->set_cfg('compress_font-weight',false);
if(isset($_REQUEST['merge_selectors'])) $css->set_cfg('merge_selectors', $_REQUEST['merge_selectors']);
if(isset($_REQUEST['optimise_shorthands'])) $css->set_cfg('optimise_shorthands',$_REQUEST['optimise_shorthands']);
if(!isset($_REQUEST['rbs']) && isset($_REQUEST['post'])) $css->set_cfg('remove_bslash',false);
if(isset($_REQUEST['preserve_css'])) $css->set_cfg('preserve_css',true);
if(isset($_REQUEST['sort_sel'])) $css->set_cfg('sort_selectors',true);
if(isset($_REQUEST['sort_de'])) $css->set_cfg('sort_properties',true);
if(isset($_REQUEST['remove_last_sem'])) $css->set_cfg('remove_last_;',true);
if(isset($_REQUEST['discard'])) $css->set_cfg('discard_invalid_properties',true);
if(isset($_REQUEST['css_level'])) $css->set_cfg('css_level',$_REQUEST['css_level']);
if(isset($_REQUEST['timestamp'])) $css->set_cfg('timestamp',true);
// This by itself is enough since our scripts don't use DOM to create elements (in which case the namespace aware ones
// should be used when serving as application/xhtml+xml but not when served as text/html ;
// also, case will be different when retrieving element names, as HTML DOM returns in upper case,
// genuine XHTML DOM (when XHTML served as such) as lower
if (stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml')) {
$http_accept = 'application/xhtml+xml';
}
elseif (stristr($_SERVER['HTTP_ACCEPT'], 'application/xml')) {
$http_accept = 'application/xml';
}
elseif (stristr($_SERVER['HTTP_ACCEPT'], 'text/xml')) {
$http_accept = 'text/xml';
}
elseif (stristr($_SERVER['HTTP_USER_AGENT'], 'Opera ') || stristr($_SERVER['HTTP_USER_AGENT'], 'Opera/')) {
preg_match('@Opera/(\d)@', $_SERVER['HTTP_USER_AGENT'], $matches);
if (isset($matches[1]) && $matches[1] >= 7) {
$http_accept = 'application/xhtml+xml';
}
else {
$http_accept = 'text/html';
}
}
else {
$http_accept = 'text/html';
}
header('Content-Type: '.$http_accept.'; charset=utf-8');
if ($http_accept === 'text/html') {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?php
}
else {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<?php
}
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $l; ?>">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<title>
<?php echo $lang[$l][0]; echo $css->version; ?>)
</title>
<link rel="stylesheet" href="cssparse.css" type="text/css" />
<script type="text/javascript"><!--/*--><![CDATA[/*><!--*/
function enable_disable_preserve()
{
var inputs = new Array('sort_sel', 'sort_de', 'optimise_shorthands', 'merge_selectors', 'none');
var inputs_v = new Array( true, true, true, true, false);
for(var i = 0; i < inputs.length; i++)
{
if(document.getElementById('preserve_css').checked) {
document.getElementById(inputs[i]).disabled = inputs_v[i];
} else {
document.getElementById(inputs[i]).disabled = !inputs_v[i];
}
}
}
function ClipBoard()
{
if (window.clipboardData) { // Feature testing
window.clipboardData.setData('Text',document.getElementById("copytext").innerText);
}
else if (navigator.userAgent.indexOf('Gecko') != -1
&& navigator.userAgent.indexOf('Apple') == -1
) {
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
getService(Components.interfaces.nsIClipboardHelper);
gClipboardHelper.copyString(document.getElementById("copytext").innerHTML);
}
catch (e) {
alert(e+"\n\n"+"<?php echo $lang[$l][66] ?>");
}
}
else {
alert("<?php echo $lang[$l][60]; ?>");
}
}
/*]]>*/-->
</script>
</head>
<body onload="enable_disable_preserve()">
<div><h1 style="display:inline">
<?php echo $lang[$l][1]; ?>
</h1>
<?php echo $lang[$l][2]; ?> <a
href="http://csstidy.sourceforge.net/">csstidy</a> <?php echo $css->version; ?>)
</div><p>
<?php echo $lang[$l][39]; ?>: <a hreflang="en" href="?lang=en">English</a> <a hreflang="de" href="?lang=de">Deutsch</a> <a hreflang="fr" href="?lang=fr">French</a> <a hreflang="zh" href="?lang=zh">Chinese</a></p>
<p><?php echo $lang[$l][4]; ?>
<?php echo $lang[$l][6]; ?>
</p>
<form method="post" action="">
<div>
<fieldset id="field_input">
<legend><?php echo $lang[$l][8]; ?></legend> <label for="css_text"
class="block"><?php echo $lang[$l][9]; ?></label><textarea id="css_text" name="css_text" rows="20" cols="35"><?php if(isset($_REQUEST['css_text'])) echo htmlspecialchars($_REQUEST['css_text'], ENT_QUOTES, "utf-8"); ?></textarea>
<label for="url"><?php echo $lang[$l][10]; ?></label> <input type="text"
name="url" id="url" <?php if(isset($_REQUEST['url']) &&
!empty($_REQUEST['url'])) echo 'value="',htmlspecialchars($_REQUEST['url'], ENT_QUOTES, 'utf-8'),'"'; ?>
size="35" /><br />
<input type="submit" value="<?php echo $lang[$l][35]; ?>" id="submit" />
</fieldset>
<div id="rightcol">
<fieldset id="code_layout">
<legend><?php echo $lang[$l][11]; ?></legend> <label for="template"
class="block"><?php echo $lang[$l][12]; ?></label> <select
id="template" name="template" style="margin-bottom:1em;">
<?php
$num = (isset($_REQUEST['template'])) ? intval($_REQUEST['template']) : 1;
echo options(array(3 => $lang[$l][13], 2 => $lang[$l][14], 1 => $lang[$l][15], 0 => $lang[$l][16], 4 => $lang[$l][17]), $num);
?>
</select><br />
<label for="custom" class="block">
<?php echo $lang[$l][18]; ?> </label> <textarea id="custom"
name="custom" cols="33" rows="4"><?php
if($is_custom) echo
htmlspecialchars($_REQUEST['custom'], ENT_QUOTES, 'utf-8');
elseif(isset($_COOKIE['custom_template']) &&
!empty($_COOKIE['custom_template'])) echo
htmlspecialchars($_COOKIE['custom_template'], ENT_QUOTES, 'utf-8');
?></textarea>
</fieldset>
<fieldset id="options">
<legend><?php echo $lang[$l][19]; ?></legend>
<input onchange="enable_disable_preserve()" type="checkbox" name="preserve_css" id="preserve_css"
<?php if($css->get_cfg('preserve_css')) echo 'checked="checked"'; ?> />
<label for="preserve_css" title="<?php echo $lang[$l][52]; ?>" class="help"><?php echo $lang[$l][51]; ?></label><br />
<input type="checkbox" name="sort_sel" id="sort_sel"
<?php if($css->get_cfg('sort_selectors')) echo 'checked="checked"'; ?> />
<label for="sort_sel" title="<?php echo $lang[$l][41]; ?>" class="help"><?php echo $lang[$l][20]; ?></label><br />
<input type="checkbox" name="sort_de" id="sort_de"
<?php if($css->get_cfg('sort_properties')) echo 'checked="checked"'; ?> />
<label for="sort_de"><?php echo $lang[$l][21]; ?></label><br />
<label for="merge_selectors"><?php echo $lang[$l][22]; ?></label>
<select style="width:15em;" name="merge_selectors" id="merge_selectors">
<?php echo options(array('0' => $lang[$l][47], '1' => $lang[$l][48], '2' => $lang[$l][49]), $css->get_cfg('merge_selectors')); ?>
</select><br />
<label for="optimise_shorthands"><?php echo $lang[$l][23]; ?></label>
<select name="optimise_shorthands" id="optimise_shorthands">
<?php echo options(array($lang[$l][54], $lang[$l][55], $lang[$l][56]), $css->get_cfg('optimise_shorthands')); ?>
</select><br />
<input type="checkbox" name="compress_c" id="compress_c"
<?php if($css->get_cfg('compress_colors')) echo 'checked="checked"';?> />
<label for="compress_c"><?php echo $lang[$l][24]; ?></label><br />
<input type="checkbox" name="compress_fw" id="compress_fw"
<?php if($css->get_cfg('compress_font-weight')) echo 'checked="checked"';?> />
<label for="compress_fw"><?php echo $lang[$l][45]; ?></label><br />
<input type="checkbox" name="lowercase" id="lowercase" value="lowercase"
<?php if($css->get_cfg('lowercase_s')) echo 'checked="checked"'; ?> />
<label title="<?php echo $lang[$l][30]; ?>" class="help" for="lowercase"><?php echo $lang[$l][25]; ?></label><br />
<?php echo $lang[$l][26]; ?><br />
<input type="radio" name="case_properties" id="none" value="0"
<?php if($css->get_cfg('case_properties') === 0) echo 'checked="checked"'; ?> />
<label for="none"><?php echo $lang[$l][53]; ?></label>
<input type="radio" name="case_properties" id="lower_yes" value="1"
<?php if($css->get_cfg('case_properties') === 1) echo 'checked="checked"'; ?> />
<label for="lower_yes"><?php echo $lang[$l][27]; ?></label>
<input type="radio" name="case_properties" id="upper_yes" value="2"
<?php if($css->get_cfg('case_properties') === 2) echo 'checked="checked"'; ?> />
<label for="upper_yes"><?php echo $lang[$l][29]; ?></label><br />
<input type="checkbox" name="rbs" id="rbs"
<?php if($css->get_cfg('remove_bslash')) echo 'checked="checked"'; ?> />
<label for="rbs"><?php echo $lang[$l][31]; ?></label><br />
<input type="checkbox" id="remove_last_sem" name="remove_last_sem"
<?php if($css->get_cfg('remove_last_;')) echo 'checked="checked"'; ?> />
<label for="remove_last_sem"><?php echo $lang[$l][42]; ?></label><br />
<input type="checkbox" id="discard" name="discard"
<?php if($css->get_cfg('discard_invalid_properties')) echo 'checked="checked"'; ?> />
<label for="discard"><?php echo $lang[$l][43]; ?></label>
<select name="css_level"><?php echo options(array('CSS2.1','CSS2.0','CSS1.0'),$css->get_cfg('css_level'), true); ?></select><br />
<input type="checkbox" id="timestamp" name="timestamp"
<?php if($css->get_cfg('timestamp')) echo 'checked="checked"'; ?> />
<label for="timestamp"><?php echo $lang[$l][57]; ?></label><br />
<input type="checkbox" id="whole_file" name="whole_file"
<?php if(isset($_REQUEST['whole_file'])) echo 'checked="checked"'; ?> />
<label for="whole_file"><?php echo $lang[$l][63]; ?></label><br />
<input type="checkbox" name="file_output" id="file_output" value="file_output"
<?php if(isset($_REQUEST['file_output'])) echo 'checked="checked"'; ?> />
<label class="help" title="<?php echo $lang[$l][34]; ?>" for="file_output">
<strong><?php echo $lang[$l][33]; ?></strong>
</label><br />
</fieldset>
<input type="hidden" name="post" />
</div>
</div>
</form>
<?php
$file_ok = false;
$result = false;
$url = (isset($_REQUEST['url']) && !empty($_REQUEST['url'])) ? $_REQUEST['url'] : false;
if(isset($_REQUEST['template']))
{
switch($_REQUEST['template'])
{
case 4:
if($is_custom)
{
$css->load_template($_REQUEST['custom'],false);
}
break;
case 3:
$css->load_template('highest_compression');
break;
case 2:
$css->load_template('high_compression');
break;
case 0:
$css->load_template('low_compression');
break;
}
}
if($url)
{
if(substr($_REQUEST['url'],0,7) !== 'http://')
{
$_REQUEST['url'] = 'http://'.$_REQUEST['url'];
}
$result = $css->parse_from_url($_REQUEST['url'],0);
}
elseif(isset($_REQUEST['css_text']) && strlen($_REQUEST['css_text'])>5)
{
$result = $css->parse($_REQUEST['css_text']);
}
if($result)
{
$ratio = $css->print->get_ratio();
$diff = $css->print->get_diff();
if(isset($_REQUEST['file_output']))
{
$filename = md5(mt_rand().time().mt_rand());
if (!is_dir('temp')) {
$madedir = mkdir('temp');
if (!$madedir) {
print 'Could not make directory "temp" in '.dirname(__FILE__);
exit;
}
}
$handle = fopen('temp/'.$filename.'.css','w');
if($handle) {
if(fwrite($handle,$css->print->plain()))
{
$file_ok = true;
}
}
fclose($handle);
}
if($ratio>0) $ratio = '<span style="color:green;">'.$ratio.'%</span>
('.$diff.' Bytes)'; else $ratio = '<span
style="color:red;">'.$ratio.'%</span> ('.$diff.' Bytes)';
if(count($css->log) > 0): ?>
<fieldset id="messages"><legend>Messages</legend>
<div><dl><?php
foreach($css->log as $line => $array)
{
echo '<dt>',$line,'</dt>';
$array_size = count($array);
for($i = 0; $i < $array_size; ++$i)
{
echo '<dd class="',$array[$i]['t'],'">',$array[$i]['m'],'</dd>';
}
}
?></dl></div>
</fieldset>
<?php endif;
echo '<fieldset><legend>',$lang[$l][37],': ',$css->print->size('input'),'KB, ',$lang[$l][38],':',$css->print->size('output'),'KB, ',$lang[$l][36],': ',$ratio;
if($file_ok)
{
echo ' - <a href="temp/',$filename,'.css">Download</a>';
}
echo ' - <a href="javascript:ClipBoard()">',$lang[$l][58],'</a>';
echo '</legend>';
echo '<code id="copytext">';
echo $css->print->formatted();
echo '</code></fieldset><div><br /></div>';
echo '<fieldset class="code_output"><legend>',$lang[$l][64],'</legend>';
echo '<textarea rows="10" cols="80">';
if(isset($_REQUEST['whole_file'])) {
echo htmlspecialchars($css->print->formatted_page('xhtml1.1', false, '', 'en'), ENT_QUOTES, 'utf-8');
}
else {
echo htmlspecialchars('<code id="copytext">', ENT_QUOTES, 'utf-8'),"\n";
echo htmlspecialchars($css->print->formatted()."\n".'</code>', ENT_QUOTES, 'utf-8');
}
echo '</textarea></fieldset>';
echo '<fieldset class="code_output"><legend>',$lang[$l][65],'</legend>';
echo '<textarea rows="10" cols="30">';
echo file_get_contents('cssparsed.css');
echo '</textarea>';
echo '</fieldset><p><a href="javascript:scrollTo(0,0)">&#8593; ',$lang[$l][59],'</a></p>';
}
elseif(isset($_REQUEST['css_text']) || isset($_REQUEST['url'])) {
echo '<p class="important">',$lang[$l][28],'</p>';
}
?>
<p style="text-align:center;font-size:.8em;clear:both;">
<?php echo $lang[$l][61] ?> <a
href="http://csstidy.sourceforge.net/contact.php"><?php echo $lang[$l][62] ?></a>.
</p>
</body>
</html>

View file

@ -23,7 +23,7 @@
this.$elm = $(elm);
this.opts = $.extend({}, $.fn.poshytip.defaults, options);
this.$tip = $(['<div class="infobox ',this.opts.className,'">',
'<div class="tip-inner tip-bg-image"></div>',
'<div class="tip-inner tip-bg-image word-wrap"></div>',
'<div class="tip-arrow tip-arrow-top tip-arrow-right tip-arrow-bottom tip-arrow-left"></div>',
'</div>'].join('')).appendTo(document.body);
this.$arrow = this.$tip.find('div.tip-arrow');

View file

@ -1,19 +0,0 @@
<?php
session_start();
?>
<form action="" method="post">
<p>Enter text shown below:</p>
<p><img src="./?<?php echo session_name()?>=<?php echo session_id()?>"></p>
<p><input type="text" name="keystring"></p>
<p><input type="submit" value="Check"></p>
</form>
<?php
if(count($_POST)>0){
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){
echo "Correct";
}else{
echo "Wrong";
}
}
unset($_SESSION['captcha_keystring']);
?>

View file

@ -33,7 +33,7 @@ if(isset($_REQUEST[session_name()])){
}
foreach ($_REQUEST as $key => $value) {
if (preg_match("/^[\w\d]{5,40}$/",$value)) {
if (preg_match("/^[\w\d]{5,40}$/",(string)$value)) {
session_name($key);
session_start();
break;

View file

@ -1,20 +0,0 @@
<body style="margin: 10px;">
<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;">
<div align="center"><img src="images/phpmailer.gif" style="height: 90px; width: 340px"></div><br>
<br>
&nbsp;This is a test of PHPMailer.<br>
<br>
This particular example uses <strong>HTML</strong>, with a &lt;div&gt; tag and inline<br>
styles.<br>
<br>
Also note the use of the PHPMailer logo above with no specific code to handle
including it.<br />
Included are two attachments:<br />
phpmailer.gif is an attachment and used inline as a graphic (above)<br />
phpmailer_mini.gif is an attachment<br />
<br />
PHPMailer:<br />
Author: Andy Prevost (codeworxtech@users.sourceforge.net)<br />
Author: Marcus Bointon (coolbru@users.sourceforge.net)<br />
</div>
</body>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

View file

@ -1,49 +0,0 @@
This release of PHPMailer (v5.0.0) sets a new milestone in the development
cycle of PHPMailer. First, class.phpmailer.php has a small footprint (65.7 Kb),
while class.smtp.php is even smaller than before (at only 25.0 Kb).<br />
<br />
We have maintained all functionality and added Exception handling unique to
PHP 5/6.<br />
<br />
There is only one function that has been removed: that is getFile(). The reason
for this is that getFile() became a wrapper for the PHP function 'file_get_contents()'
and nothing more. Rather than burden the class with a function already available
in PHP, we decided to remove it.<br />
<br />
Our new Exception handling provides your own scripts far more power than ever.<br />
<br />
We have also enhanced the "packaging" of PHPMailer with an entirely new set of
examples. Included are both basic and advanced examples showing how you can take
advantage of PHP Exception handling to improve your own scripts.<br />
<br />
A few things to note about PHPMailer:
<ul>
<li>the use of $mail-&gt;AltBody is completely optional. If not used, PHPMailer
will use the HTML text with htmlentities().<br />
We also highly recommend using HTML2Text authored by Jon Abernathy. The class description
and download can be viewed at: http://www.chuggnutt.com/html2text.php.
</li>
<li>there is no specific code to define image or attachment types ... that is handled
automatically by PHPMailer when it parses the images</li>
</ul>
A note to users that want to use SMTP with PHPMailer. The most common problems are:
<ul>
<li>wrong port ... most ISP (Internet Service Providers) will not allow relaying through
their servers. If that's the case with your ISP, try using port 26.
</li>
<li>wrong authentication information (username and/or password) ... don't forget that
many servers require the account name to be in the format of the full email address.
</li>
<li>... if these tips do not get your SMTP settings working, we have a debug mode
for helping you determine the problem. Insert this after $mail->IsSMTP();<br />
$mail->SMTPDebug = 2; // enables SMTP debug information (for testing)<br />
note that a setting of 2 will display all errors and messages generated by the SMTP
server<br />
</li>
</ul>
Our examples all use an HTML file in the /examples folder. To see what the email SHOULD
look like in your HTML compatible email viewer: <a href="contents.html">click here</a><br>
<br />
From the PHPMailer team:<br />
Author: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net (and Project Administrator)<br />
Author: Marcus Bointon (coolbru) coolbru@users.sourceforge.net<br />

View file

@ -1,58 +0,0 @@
<html>
<head>
<title>PHPMailer - MySQL Database - SMTP basic test with authentication</title>
</head>
<body>
<?php
//error_reporting(E_ALL);
error_reporting(E_STRICT);
date_default_timezone_set('America/Toronto');
require_once('../class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
$mail = new PHPMailer();
$body = file_get_contents('contents.html');
$body = eregi_replace("[\]",'',$body);
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = "smtp1.site.com;smtp2.site.com";
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent
$mail->Host = "mail.yourdomain.com"; // sets the SMTP server
$mail->Port = 26; // set the SMTP port for the GMAIL server
$mail->Username = "yourname@yourdomain"; // SMTP account username
$mail->Password = "yourpassword"; // SMTP account password
$mail->SetFrom('list@mydomain.com', 'List manager');
$mail->AddReplyTo('list@mydomain.com', 'List manager');
$mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication";
@MYSQL_CONNECT("localhost","root","password");
@mysql_select_db("my_company");
$query = "SELECT full_name, email, photo FROM employee WHERE id=$id";
$result = @MYSQL_QUERY($query);
while ($row = mysql_fetch_array ($result)) {
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$mail->AddAddress($row["email"], $row["full_name"]);
$mail->AddStringAttachment($row["photo"], "YourPhoto.jpg");
if(!$mail->Send()) {
echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />';
} else {
echo "Message sent to :" . $row["full_name"] . ' (' . str_replace("@", "&#64;", $row["email"]) . ')<br />';
}
// Clear all addresses and attachments for next loop
$mail->ClearAddresses();
$mail->ClearAttachments();
}
?>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show more