1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-21 18:28:17 +03:00

Оптимизация блогов

This commit is contained in:
Denis Shakhov 2014-01-25 19:39:19 +07:00
parent 845f83a983
commit 211a492dcd
34 changed files with 1123 additions and 869 deletions

View file

@ -683,14 +683,14 @@ class ActionAjax extends Action {
* Голосует за свой блог?
*/
if ($oBlog->getOwnerId()==$this->oUserCurrent->getId()) {
$this->Message_AddErrorSingle($this->Lang_Get('blog_vote_error_self'),$this->Lang_Get('attention'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.vote.notices.error_self'),$this->Lang_Get('attention'));
return;
}
/**
* Уже голосовал?
*/
if ($oBlogVote=$this->Vote_GetVote($oBlog->getId(),'blog',$this->oUserCurrent->getId())) {
$this->Message_AddErrorSingle($this->Lang_Get('blog_vote_error_already'),$this->Lang_Get('attention'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.vote.notices.error_already'),$this->Lang_Get('attention'));
return;
}
/**
@ -712,7 +712,7 @@ class ActionAjax extends Action {
if ($this->Vote_AddVote($oBlogVote) and $this->Blog_UpdateBlog($oBlog)) {
$this->Viewer_AssignAjax('iCountVote',$oBlog->getCountVote());
$this->Viewer_AssignAjax('iRating',$oBlog->getRating());
$this->Message_AddNoticeSingle($this->Lang_Get('blog_vote_ok'),$this->Lang_Get('attention'));
$this->Message_AddNoticeSingle($this->Lang_Get('vote.notices.success'),$this->Lang_Get('attention'));
/**
* Добавляем событие в ленту
*/
@ -727,13 +727,13 @@ class ActionAjax extends Action {
}
break;
case ModuleACL::CAN_VOTE_BLOG_ERROR_CLOSE:
$this->Message_AddErrorSingle($this->Lang_Get('blog_vote_error_close'),$this->Lang_Get('attention'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.vote.notices.error_close'),$this->Lang_Get('attention'));
return;
break;
default:
case ModuleACL::CAN_VOTE_BLOG_FALSE:
$this->Message_AddErrorSingle($this->Lang_Get('blog_vote_error_acl'),$this->Lang_Get('attention'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.vote.notices.error_acl'),$this->Lang_Get('attention'));
return;
break;
}
@ -1292,7 +1292,7 @@ class ActionAjax extends Action {
}
$this->Viewer_AssignAjax('aBlogs',$aResult);
} else {
$this->Message_AddErrorSingle($this->Lang_Get('blog_by_category_empty'),$this->Lang_Get('attention'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.categories.empty'),$this->Lang_Get('attention'));
return;
}
}

View file

@ -122,7 +122,7 @@ class ActionBlog extends Action {
* Загружаем в шаблон JS текстовки
*/
$this->Lang_AddLangJs(array(
'blog_join','blog_leave'
'blog.join.join','blog.join.leave'
));
}
/**
@ -179,7 +179,7 @@ class ActionBlog extends Action {
/**
* Устанавливаем title страницы
*/
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_create'));
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog.add.title'));
/**
* Меню
*/
@ -196,7 +196,7 @@ class ActionBlog extends Action {
* Проверяем хватает ли рейтинга юзеру чтоб создать блог
*/
if (!$this->ACL_CanCreateBlog($this->oUserCurrent) and !$this->oUserCurrent->isAdministrator()) {
$this->Message_AddErrorSingle($this->Lang_Get('blog_create_acl'),$this->Lang_Get('error'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.add.alerts.acl'),$this->Lang_Get('error'));
return Router::Action('error');
}
$this->Hook_Run('blog_add_show');
@ -235,7 +235,7 @@ class ActionBlog extends Action {
if ($sPath=$this->Blog_UploadBlogAvatar($_FILES['avatar'],$oBlog)) {
$oBlog->setAvatar($sPath);
} else {
$this->Message_AddError($this->Lang_Get('blog_create_avatar_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.avatar.error'),$this->Lang_Get('error'));
return false;
}
}
@ -322,7 +322,7 @@ class ActionBlog extends Action {
* Устанавливаем title страницы
*/
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_edit'));
$this->Viewer_AddHtmlTitle($this->Lang_Get('common.edit'));
$this->Viewer_Assign('oBlogEdit',$oBlog);
/**
@ -375,7 +375,7 @@ class ActionBlog extends Action {
if ($sPath=$this->Blog_UploadBlogAvatar($_FILES['avatar'],$oBlog)) {
$oBlog->setAvatar($sPath);
} else {
$this->Message_AddError($this->Lang_Get('blog_create_avatar_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.avatar.error'),$this->Lang_Get('error'));
return false;
}
}
@ -494,7 +494,7 @@ class ActionBlog extends Action {
$oBlogUser->setUserRole(ModuleBlog::BLOG_USER_ROLE_GUEST);
}
$this->Blog_UpdateRelationBlogUser($oBlogUser);
$this->Message_AddNoticeSingle($this->Lang_Get('blog_admin_users_submit_ok'));
$this->Message_AddNoticeSingle($this->Lang_Get('blog.admin.alerts.submit_success'));
}
$this->Blog_UpdateBlog($oBlog);
}
@ -524,7 +524,7 @@ class ActionBlog extends Action {
* Устанавливаем title страницы
*/
$this->Viewer_AddHtmlTitle($oBlog->getTitle());
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog_admin'));
$this->Viewer_AddHtmlTitle($this->Lang_Get('blog.admin.title'));
$this->Viewer_Assign('oBlogEdit',$oBlog);
$this->Viewer_Assign('aBlogUsers',$aBlogUsers);
@ -563,7 +563,7 @@ class ActionBlog extends Action {
* Проверяем есть ли название блога
*/
if (!func_check(getRequestStr('blog_title'),'text',2,200)) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.title.error'),$this->Lang_Get('error'));
$bOk=false;
} else {
/**
@ -571,7 +571,7 @@ class ActionBlog extends Action {
*/
if ($oBlogExists=$this->Blog_GetBlogByTitle(getRequestStr('blog_title'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_title_error_unique'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.title.error_unique'),$this->Lang_Get('error'));
$bOk=false;
}
}
@ -584,7 +584,7 @@ class ActionBlog extends Action {
$blogUrl=preg_replace("/\s+/",'_',getRequestStr('blog_url'));
$_REQUEST['blog_url']=$blogUrl;
if (!func_check(getRequestStr('blog_url'),'login',2,50)) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.url.error'),$this->Lang_Get('error'));
$bOk=false;
}
}
@ -592,7 +592,7 @@ class ActionBlog extends Action {
* Проверяем на счет плохих УРЛов
*/
if (in_array(getRequestStr('blog_url'),$this->aBadBlogUrl)) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error_badword').' '.join(',',$this->aBadBlogUrl),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.url.error_badword').' '.join(',',$this->aBadBlogUrl),$this->Lang_Get('error'));
$bOk=false;
}
/**
@ -600,7 +600,7 @@ class ActionBlog extends Action {
*/
if ($oBlogExists=$this->Blog_GetBlogByUrl(getRequestStr('blog_url'))) {
if (!$oBlog or $oBlog->getId()!=$oBlogExists->getId()) {
$this->Message_AddError($this->Lang_Get('blog_create_url_error_unique'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.url.error_unique'),$this->Lang_Get('error'));
$bOk=false;
}
}
@ -608,21 +608,21 @@ class ActionBlog extends Action {
* Проверяем есть ли описание блога
*/
if (!func_check(getRequestStr('blog_description'),'text',10,3000)) {
$this->Message_AddError($this->Lang_Get('blog_create_description_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.description.error'),$this->Lang_Get('error'));
$bOk=false;
}
/**
* Проверяем доступные типы блога для создания
*/
if (!$this->Blog_IsAllowBlogType(getRequestStr('blog_type'))) {
$this->Message_AddError($this->Lang_Get('blog_create_type_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.type.error'),$this->Lang_Get('error'));
$bOk=false;
}
/**
* Преобразуем ограничение по рейтингу в число
*/
if (!func_check(getRequestStr('blog_limit_rating_topic'),'float')) {
$this->Message_AddError($this->Lang_Get('blog_create_rating_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.rating.error'),$this->Lang_Get('error'));
$bOk=false;
}
/**
@ -634,13 +634,13 @@ class ActionBlog extends Action {
* Проверяем есть ли у этой категории дочернии
*/
if (Config::Get('module.blog.category_only_children') and $this->Blog_GetCategoriesByPid($oCategory->getId())) {
$this->Message_AddError($this->Lang_Get('blog_create_category_error_only_children'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.category.error_only_children'),$this->Lang_Get('error'));
$bOk=false;
}
} else {
$_REQUEST['blog_category']=null;
if (!Config::Get('module.blog.category_allow_empty')) {
$this->Message_AddError($this->Lang_Get('blog_create_category_error'),$this->Lang_Get('error'));
$this->Message_AddError($this->Lang_Get('blog.add.fields.category.error'),$this->Lang_Get('error'));
$bOk=false;
}
}
@ -922,9 +922,9 @@ class ActionBlog extends Action {
)
)
) {
$bCloseBlog=true;
$bPrivateBlog=true;
} else {
$bCloseBlog=false;
$bPrivateBlog=false;
}
/**
* Меню
@ -939,7 +939,7 @@ class ActionBlog extends Action {
$this->Viewer_SetHtmlCanonical($oBlog->getUrlFull().$sShowType.'/');
}
if (!$bCloseBlog) {
if (!$bPrivateBlog) {
/**
* Получаем список топиков
*/
@ -1007,7 +1007,7 @@ class ActionBlog extends Action {
$this->Viewer_Assign('iCountBlogModerators',$aBlogModeratorsResult['count']);
$this->Viewer_Assign('iCountBlogAdministrators',$aBlogAdministratorsResult['count']+1);
$this->Viewer_Assign('oBlog',$oBlog);
$this->Viewer_Assign('bCloseBlog',$bCloseBlog);
$this->Viewer_Assign('bPrivateBlog',$bPrivateBlog);
/**
* Устанавливаем title страницы
*/
@ -1415,7 +1415,7 @@ class ActionBlog extends Action {
$aResult[]=array(
'bStateError'=>true,
'sMsgTitle'=>$this->Lang_Get('error'),
'sMsg'=>$this->Lang_Get('blog_user_invite_add_self')
'sMsg'=>$this->Lang_Get('blog.invite.notices.add_self')
);
continue;
}
@ -1446,10 +1446,11 @@ class ActionBlog extends Action {
$aResult[]=array(
'bStateError'=>false,
'sMsgTitle'=>$this->Lang_Get('attention'),
'sMsg'=>$this->Lang_Get('blog_user_invite_add_ok',array('login'=>htmlspecialchars($sUser))),
'sMsg'=>$this->Lang_Get('blog.invite.notices.add',array('login'=>htmlspecialchars($sUser))),
'sUserLogin'=>htmlspecialchars($sUser),
'sUserWebPath'=>$oUser->getUserWebPath(),
'sUserAvatar48'=>$oUser->getProfileAvatarPath(48)
'sUserAvatar48'=>$oUser->getProfileAvatarPath(48),
'iUserId'=>$oUser->getId()
);
$this->SendBlogInvite($oBlog,$oUser);
} else {
@ -1467,13 +1468,13 @@ class ActionBlog extends Action {
*/
switch (true) {
case ($aBlogUsers[$oUser->getId()]->getUserRole()==ModuleBlog::BLOG_USER_ROLE_INVITE):
$sErrorMessage=$this->Lang_Get('blog_user_already_invited',array('login'=>htmlspecialchars($sUser)));
$sErrorMessage=$this->Lang_Get('blog.invite.notices.already_invited',array('login'=>htmlspecialchars($sUser)));
break;
case ($aBlogUsers[$oUser->getId()]->getUserRole()>ModuleBlog::BLOG_USER_ROLE_GUEST):
$sErrorMessage=$this->Lang_Get('blog_user_already_exists',array('login'=>htmlspecialchars($sUser)));
$sErrorMessage=$this->Lang_Get('blog.invite.notices.already_joined',array('login'=>htmlspecialchars($sUser)));
break;
case ($aBlogUsers[$oUser->getId()]->getUserRole()==ModuleBlog::BLOG_USER_ROLE_REJECT):
$sErrorMessage=$this->Lang_Get('blog_user_already_reject',array('login'=>htmlspecialchars($sUser)));
$sErrorMessage=$this->Lang_Get('blog.invite.notices.reject',array('login'=>htmlspecialchars($sUser)));
break;
default:
$sErrorMessage=$this->Lang_Get('system_error');
@ -1538,7 +1539,7 @@ class ActionBlog extends Action {
$oBlogUser=$this->Blog_GetBlogUserByBlogIdAndUserId($oBlog->getId(),$oUser->getId());
if ($oBlogUser->getUserRole()==ModuleBlog::BLOG_USER_ROLE_INVITE) {
$this->SendBlogInvite($oBlog,$oUser);
$this->Message_AddNoticeSingle($this->Lang_Get('blog_user_invite_add_ok',array('login'=>$oUser->getLogin())),$this->Lang_Get('attention'));
$this->Message_AddNoticeSingle($this->Lang_Get('blog.invite.notices.add',array('login'=>$oUser->getLogin())),$this->Lang_Get('attention'));
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
@ -1591,7 +1592,7 @@ class ActionBlog extends Action {
* Удаляем связь/приглашение
*/
$this->Blog_DeleteRelationBlogUser($oBlogUser);
$this->Message_AddNoticeSingle($this->Lang_Get('blog_user_invite_remove_ok',array('login'=>$oUser->getLogin())),$this->Lang_Get('attention'));
$this->Message_AddNoticeSingle($this->Lang_Get('blog.invite.notices.remove',array('login'=>$oUser->getLogin())),$this->Lang_Get('attention'));
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
@ -1605,7 +1606,7 @@ class ActionBlog extends Action {
*/
protected function SendBlogInvite($oBlog,$oUser) {
$sTitle=$this->Lang_Get(
'blog_user_invite_title',
'blog.invite.email.title',
array(
'blog_title'=>$oBlog->getTitle()
)
@ -1624,7 +1625,7 @@ class ActionBlog extends Action {
);
$sText=$this->Lang_Get(
'blog_user_invite_text',
'blog.invite.email.text',
array(
'login'=>$this->oUserCurrent->getLogin(),
'accept_path'=>$aPath['accept'],
@ -1687,7 +1688,7 @@ class ActionBlog extends Action {
return $this->EventNotFound();
}
if($oBlogUser->getUserRole()>ModuleBlog::BLOG_USER_ROLE_GUEST) {
$sMessage=$this->Lang_Get('blog_user_invite_already_done');
$sMessage=$this->Lang_Get('blog.invite.alerts.already_joined');
$this->Message_AddError($sMessage,$this->Lang_Get('error'),true);
Router::Location(Router::GetPath('talk'));
return ;
@ -1712,13 +1713,13 @@ class ActionBlog extends Action {
*/
$oBlog->setCountUser($oBlog->getCountUser()+1);
$this->Blog_UpdateBlog($oBlog);
$sMessage=$this->Lang_Get('blog_user_invite_accept');
$sMessage=$this->Lang_Get('blog.invite.alerts.accepted');
/**
* Добавляем событие в ленту
*/
$this->Stream_write($oBlogUser->getUserId(), 'join_blog', $oBlog->getId());
} else {
$sMessage=$this->Lang_Get('blog_user_invite_reject');
$sMessage=$this->Lang_Get('blog.invite.alerts.rejected');
}
$this->Message_AddNotice($sMessage,$this->Lang_Get('attention'),true);
/**
@ -1756,7 +1757,7 @@ class ActionBlog extends Action {
switch ($bAccess) {
case ModuleACL::CAN_DELETE_BLOG_EMPTY_ONLY :
if(is_array($aTopics) and count($aTopics)) {
$this->Message_AddErrorSingle($this->Lang_Get('blog_admin_delete_not_empty'),$this->Lang_Get('error'),true);
$this->Message_AddErrorSingle($this->Lang_Get('blog.remove.alerts.not_empty'),$this->Lang_Get('error'),true);
Router::Location($oBlog->getUrlFull());
}
break;
@ -1769,14 +1770,14 @@ class ActionBlog extends Action {
*/
if($sBlogIdNew=getRequestStr('topic_move_to') and ($sBlogIdNew!=-1) and is_array($aTopics) and count($aTopics)) {
if(!$oBlogNew = $this->Blog_GetBlogById($sBlogIdNew)){
$this->Message_AddErrorSingle($this->Lang_Get('blog_admin_delete_move_error'),$this->Lang_Get('error'),true);
$this->Message_AddErrorSingle($this->Lang_Get('blog.remove.alerts.move_error'),$this->Lang_Get('error'),true);
Router::Location($oBlog->getUrlFull());
}
/**
* Если выбранный блог является персональным, возвращаем ошибку
*/
if($oBlogNew->getType()=='personal') {
$this->Message_AddErrorSingle($this->Lang_Get('blog_admin_delete_move_personal'),$this->Lang_Get('error'),true);
$this->Message_AddErrorSingle($this->Lang_Get('blog.remove.alerts.move_personal_error'),$this->Lang_Get('error'),true);
Router::Location($oBlog->getUrlFull());
}
/**
@ -1794,7 +1795,7 @@ class ActionBlog extends Action {
$this->Hook_Run('blog_delete_before', array('sBlogId'=>$sBlogId));
if($this->Blog_DeleteBlog($sBlogId)) {
$this->Hook_Run('blog_delete_after', array('sBlogId'=>$sBlogId));
$this->Message_AddNoticeSingle($this->Lang_Get('blog_admin_delete_success'),$this->Lang_Get('attention'),true);
$this->Message_AddNoticeSingle($this->Lang_Get('blog.remove.alerts.success'),$this->Lang_Get('attention'),true);
Router::Location(Router::GetPath('blogs'));
} else {
Router::Location($oBlog->getUrlFull());
@ -1830,7 +1831,7 @@ class ActionBlog extends Action {
* если блог персональный возвращаем текущий языковой эквивалент
*/
if ($sBlogId==0) {
$sText = $this->Lang_Get('blogs_personal_description');
$sText = $this->Lang_Get('blog.personal_description');
}
$this->Viewer_AssignAjax('sText',$sText);
}
@ -1863,7 +1864,7 @@ class ActionBlog extends Action {
* Проверяем тип блога
*/
if (!in_array($oBlog->getType(),array('open','close'))) {
$this->Message_AddErrorSingle($this->Lang_Get('blog_join_error_invite'),$this->Lang_Get('error'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.join.notices.error_invite'),$this->Lang_Get('error'));
return;
}
/**
@ -1887,7 +1888,7 @@ class ActionBlog extends Action {
$bResult = $this->Blog_AddRelationBlogUser($oBlogUserNew);
}
if ($bResult) {
$this->Message_AddNoticeSingle($this->Lang_Get('blog_join_ok'),$this->Lang_Get('attention'));
$this->Message_AddNoticeSingle($this->Lang_Get('blog.join.notices.join_success'),$this->Lang_Get('attention'));
$this->Viewer_AssignAjax('bState',true);
/**
* Увеличиваем число читателей блога
@ -1905,13 +1906,13 @@ class ActionBlog extends Action {
$this->Userfeed_subscribeUser($this->oUserCurrent->getId(), ModuleUserfeed::SUBSCRIBE_TYPE_BLOG, $oBlog->getId());
} else {
$sMsg=($oBlog->getType()=='close')
? $this->Lang_Get('blog_join_error_invite')
? $this->Lang_Get('blog.join.notices.error_invite')
: $this->Lang_Get('system_error');
$this->Message_AddErrorSingle($sMsg,$this->Lang_Get('error'));
return;
}
} else {
$this->Message_AddErrorSingle($this->Lang_Get('blog_join_error_self'),$this->Lang_Get('attention'));
$this->Message_AddErrorSingle($this->Lang_Get('blog.join.notices.error_self'),$this->Lang_Get('attention'));
return;
}
}
@ -1920,7 +1921,7 @@ class ActionBlog extends Action {
* Покидаем блог
*/
if ($this->Blog_DeleteRelationBlogUser($oBlogUser)) {
$this->Message_AddNoticeSingle($this->Lang_Get('blog_leave_ok'),$this->Lang_Get('attention'));
$this->Message_AddNoticeSingle($this->Lang_Get('blog.join.notices.leave_success'),$this->Lang_Get('attention'));
$this->Viewer_AssignAjax('bState',false);
/**
* Уменьшаем число читателей блога

View file

@ -34,7 +34,7 @@ class ActionBlogs extends Action {
* Загружаем в шаблон JS текстовки
*/
$this->Lang_AddLangJs(array(
'blog_join','blog_leave'
'blog.join.join','blog.join.leave'
));
$this->sPageRoot=Router::GetPath('blogs');
/**

View file

@ -325,9 +325,9 @@ class ModuleBlog extends Module {
public function CreatePersonalBlog(ModuleUser_EntityUser $oUser) {
$oBlog=Engine::GetEntity('Blog');
$oBlog->setOwnerId($oUser->getId());
$oBlog->setTitle($this->Lang_Get('blogs_personal_title').' '.$oUser->getLogin());
$oBlog->setTitle($this->Lang_Get('blog.personal_title').' '.$oUser->getLogin());
$oBlog->setType('personal');
$oBlog->setDescription($this->Lang_Get('blogs_personal_description'));
$oBlog->setDescription($this->Lang_Get('blog.personal_description'));
$oBlog->setDateAdd(date("Y-m-d H:i:s"));
$oBlog->setLimitRatingTopic(-1000);
$oBlog->setUrl(null);

View file

@ -414,7 +414,17 @@ $config['block']['rule_profile'] = array(
)
)
);
$config['block']['rule_blog'] = array(
'action' => array('blog' => array('{blog}')),
'blocks' => array(
'right' => array(
'blocks/block.blogActions.tpl' => array('priority'=>300),
'blocks/block.blogUsers.tpl' => array('priority'=>300),
'blocks/block.blogAdmins.tpl' => array('priority'=>300)
)
),
'clear' => true
);
$config['head']['default']['js'] = array(

View file

@ -16,18 +16,62 @@ ls.blog = (function ($) {
/**
* Дефолтные опции
*
* @member {Object}
* @private
*/
var _defaults = {
// Роутеры
oRouters: {
routers: {
join: aRouter['blog'] + 'ajaxblogjoin/',
categories: aRouter['ajax'] + 'blogs/get-by-category/',
info: aRouter['blog'] + 'ajaxbloginfo/',
search: aRouter['blogs'] + 'ajax-search/',
invite: {
add: aRouter['blog'] + 'ajaxaddbloginvite/',
remove: aRouter['blog'] + 'ajaxremovebloginvite/',
repeat: aRouter['blog'] + 'ajaxrebloginvite/',
}
},
// Селекторы
selectors: {
addBlogSelectType: '.js-blog-add-type'
addBlogSelectType: '.js-blog-add-type',
toggle_join: '.js-blog-join',
users_number: '.js-blog-users-number',
info: '.js-blog-info',
blog_add_type_note: '#blog_type_note',
invite: {
form: {
self: '.js-blog-invite-form',
users: '.js-blog-invite-form-users',
submit: '.js-blog-invite-form-submit',
},
container: '.js-blog-invite-container',
user_list: '.js-blog-invite-users',
user: '.js-blog-invite-user',
user_remove: '.js-blog-invite-user-remove',
user_repeat: '.js-blog-invite-user-repeat',
},
nav: {
categories: '.js-blog-nav-categories',
blogs: '.js-blog-nav-blogs',
submit: '.js-blog-nav-submit',
}
},
// HTML
html: {
invite_item: function(iBlogId, aUser) {
return '<li class="user-list-small-item js-blog-invite-user" data-blog-id="' + iBlogId + '" data-user-id="' + aUser.iUserId + '">' +
'<div class="user-item">' +
'<a href="' + aUser.sUserWebPath + '" class="user-item-avatar-link"><img src="' + aUser.sUserAvatar48 + '" class="user-item-avatar" width="24" /></a> ' +
'<a href="' + aUser.sUserWebPath + '" class="user-item-name">' + aUser.sUserLogin + '</a> ' +
'</div>' +
'<div class="user-list-small-item-actions">' +
'<a href="#" class="icon-repeat js-blog-invite-user-repeat" title=""></a> ' +
'<a href="#" class="icon-remove js-blog-invite-user-remove" title=""></a>' +
'</div>' +
'</li>';
}
}
};
@ -37,219 +81,201 @@ ls.blog = (function ($) {
* @param {Object} options Опции
*/
this.init = function(options) {
var self = this;
var _this = this;
this.options = $.extend({}, _defaults, options);
this.elements = {
invite: {
form: {
self: $(this.options.selectors.invite.form.self),
users: $(this.options.selectors.invite.form.users),
submit: $(this.options.selectors.invite.form.submit),
},
container: $(this.options.selectors.invite.container),
user_list: $(this.options.selectors.invite.user_list),
user: $(this.options.selectors.invite.user),
},
nav: {
categories: $(this.options.selectors.nav.categories),
blogs: $(this.options.selectors.nav.blogs),
submit: $(this.options.selectors.nav.submit),
},
info: $(this.options.selectors.info),
toggle_join: $(this.options.selectors.toggle_join),
blog_add_type_note: $(this.options.selectors.blog_add_type_note),
};
// Подгрузка информации о выбранном типе блога при создании блога
$(this.options.selectors.addBlogSelectType).on('change', function (e) {
ls.blog.loadInfoType($(this).val());
_this.loadInfoType($(this).val());
});
// Вступить/покинуть блог
this.elements.toggle_join.on('click', function (e) {
_this.toggleJoin($(this), $(this).data('blog-id'));
e.preventDefault();
});
/**
* Инвайты
*/
// Добавить инвайт
this.elements.invite.form.self.on('submit', function (e) {
_this.invite.add($(this).data('blog-id'), _this.elements.invite.form.users.val());
e.preventDefault();
});
// Удалить инвайт
$(document).on('click', this.options.selectors.invite.user_remove, function (e) {
var oElement = $(this).closest(_this.options.selectors.invite.user);
_this.invite.remove(oElement.data('user-id'), oElement.data('blog-id'));
e.preventDefault();
});
// Повторно отправить инвайт
$(document).on('click', this.options.selectors.invite.user_repeat, function (e) {
var oElement = $(this).closest(_this.options.selectors.invite.user);
_this.invite.repeat(oElement.data('user-id'), oElement.data('blog-id'));
e.preventDefault();
});
/**
* Блок навигации по категориям и блогам
*/
// Подгрузка блогов из выбранной категории
this.elements.nav.categories.on('change', function (e) {
_this.loadBlogsByCategory($(this).val());
});
// Переход на страницу выбранного блога
this.elements.nav.submit.on('click', function (e) {
_this.navigatorGoSelectBlog();
});
};
/**
* Вступить или покинуть блог
*/
this.toggleJoin = function(obj, idBlog){
var url = aRouter['blog']+'ajaxblogjoin/';
var params = {idBlog: idBlog};
* Вступить или покинуть блог
*/
this.toggleJoin = function(oToggle, iIdBlog) {
var sUrl = this.options.routers.join,
oParams = { idBlog: iIdBlog };
oToggle.addClass(ls.options.classes.states.loading);
ls.hook.marker('toggleJoinBefore');
ls.ajax.load(url,params,function(result) {
ls.ajax.load(sUrl, oParams, function(result) {
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
obj = $(obj);
ls.msg.notice(null, result.sMsg);
var text = result.bState
? ls.lang.get('blog_leave')
: ls.lang.get('blog_join')
;
oToggle.empty().text( result.bState ? ls.lang.get('blog.join.leave') : ls.lang.get('blog.join.join') ).toggleClass('button-primary');
$(this.options.selectors.users_number + '[data-blog-id=' + iIdBlog + ']').text(result.iCountUser);
obj.empty().text(text);
obj.toggleClass('active');
$('#blog_user_count_'+idBlog).text(result.iCountUser);
ls.hook.run('ls_blog_toggle_join_after',[idBlog,result],obj);
ls.hook.run('ls_blog_toggle_join_after', [iIdBlog, result], oToggle);
}
});
oToggle.removeClass(ls.options.classes.states.loading);
}.bind(this));
};
/**
* Отправляет приглашение вступить в блог
*/
this.addInvite = function(idBlog) {
var sUsers = $('#blog_admin_user_add').val();
if(!sUsers) return false;
$('#blog_admin_user_add').val('');
* Отображение информации о блоге
*/
this.loadInfo = function(iBlogId) {
var url = this.options.routers.info,
params = { idBlog: iBlogId };
var url = aRouter['blog']+'ajaxaddbloginvite/';
var params = {users: sUsers, idBlog: idBlog};
this.elements.info.empty().addClass(ls.options.classes.states.loading);
ls.hook.marker('loadInfoBefore');
ls.hook.marker('addInviteBefore');
ls.ajax.load(url, params, function(result) {
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
$.each(result.aUsers, function(index, item) {
if(item.bStateError){
ls.msg.error(null, item.sMsg);
} else {
if($('#invited_list').length == 0) {
$('#invited_list_block').append($('<ul class="list" id="invited_list"></ul>'));
}
var listItem = $('<li><a href="'+item.sUserWebPath+'" class="user">'+item.sUserLogin+'</a></li>');
$('#invited_list').append(listItem);
$('#blog-invite-empty').hide();
ls.hook.run('ls_blog_add_invite_user_after',[idBlog,item],listItem);
}
});
ls.hook.run('ls_blog_add_invite_after',[idBlog,sUsers,result]);
}
});
this.elements.info.removeClass(ls.options.classes.states.loading).html(result.sText);
return false;
ls.hook.run('ls_blog_load_info_after', [iBlogId, result], this.elements.info);
}
}.bind(this));
};
/**
* Повторно отправляет приглашение
*/
this.repeatInvite = function(idUser,idBlog) {
var url = aRouter['blog']+'ajaxrebloginvite/';
var params = {idUser: idUser, idBlog: idBlog};
ls.hook.marker('repeatInviteBefore');
ls.ajax.load(url, params, function(result){
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
ls.msg.notice(null, result.sMsg);
ls.hook.run('ls_blog_repeat_invite_after',[idUser,idBlog,result]);
}
});
return false;
};
/**
* Удаляет приглашение в блог
* Отображение информации о типе блога
*/
this.removeInvite = function(idUser,idBlog) {
var url = aRouter['blog']+'ajaxremovebloginvite/';
var params = {idUser: idUser, idBlog: idBlog};
ls.hook.marker('removeInviteBefore');
ls.ajax.load(url, params, function(result){
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
$('#blog-invite-remove-item-'+idBlog+'-'+idUser).remove();
ls.msg.notice(null, result.sMsg);
if ($('#invited_list li').length == 0) $('#blog-invite-empty').show();
ls.hook.run('ls_blog_remove_invite_after',[idUser,idBlog,result]);
}
});
return false;
};
/**
* Отображение информации о блоге
*/
this.loadInfo = function(idBlog) {
var url = aRouter['blog']+'ajaxbloginfo/';
var params = {idBlog: idBlog};
var block = $('#block_blog_info');
block.empty().addClass('loading');
ls.hook.marker('loadInfoBefore');
ls.ajax.load(url, params, function(result){
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
block.removeClass('loading').html(result.sText);
ls.hook.run('ls_blog_load_info_after',[idBlog,result],block);
}
});
};
/**
* Отображение информации о типе блога
*/
this.loadInfoType = function(type) {
$('#blog_type_note').text(ls.lang.get('blog_create_type_' + type + '_notice'));
this.elements.blog_add_type_note.text(ls.lang.get('blog.add.fields.type.note_' + type));
};
/**
* Поиск блогов
*/
this.searchBlogs = function(form) {
var url = aRouter['blogs']+'ajax-search/';
var inputSearch=$('#'+form).find('input');
inputSearch.addClass('loader');
this.searchBlogs = function(sFormSelector) {
var url = ls.blog.options.routers.search,
oInputSearch = $(sFormSelector).find('input'),
oOriginalContainer = $('#blogs-list-original'),
oSearchContainer = $('#blogs-list-search');
oInputSearch.addClass(ls.options.classes.states.loading);
ls.hook.marker('searchBlogsBefore');
ls.ajax.submit(url, form, function(result){
inputSearch.removeClass('loader');
ls.ajax.submit(url, sFormSelector, function(result) {
oInputSearch.removeClass(ls.options.classes.states.loading);
if (result.bStateError) {
$('#blogs-list-search').hide();
$('#blogs-list-original').show();
oSearchContainer.hide();
oOriginalContainer.show();
} else {
$('#blogs-list-original').hide();
$('#blogs-list-search').html(result.sText).show();
ls.hook.run('ls_blog_search_blogs_after',[form, result]);
oOriginalContainer.hide();
oSearchContainer.html(result.sText).show();
ls.hook.run('ls_blog_search_blogs_after', [sFormSelector, result]);
}
});
};
/**
* Показать подробную информацию о блоге
*/
this.toggleInfo = function() {
$('#blog-more-content').slideToggle();
var more = $('#blog-more');
more.toggleClass('expanded');
if(more.hasClass('expanded')) {
more.html(ls.lang.get('blog_fold_info'));
} else {
more.html(ls.lang.get('blog_expand_info'));
}
return false;
};
/**
* Подгружает блоги из категории
*
* @param {String} id ID категории
*/
this.loadBlogsByCategory = function(id) {
var url = aRouter['ajax'] + 'blogs/get-by-category/',
params = {id: id},
$blogs = $('#blog-navigator-blog').empty().prop('disabled', true),
$button = $('#blog-navigator-button').prop('disabled', true);
this.loadBlogsByCategory = function(iId) {
var url = this.options.routers.categories,
params = { id: iId };
this.elements.nav.blogs.empty().prop('disabled', true),
this.elements.nav.submit.prop('disabled', true).addClass(ls.options.classes.states.loading);
ls.hook.marker('loadBlogsByCategoryBefore');
if (id !== '0') {
ls.ajax.load(url, params, function(result){
if (iId !== '0') {
ls.ajax.load(url, params, function(result) {
if (result.bStateError) {
$blogs.append('<option>' + result.sMsg + '</option>');
this.elements.nav.blogs.append('<option>' + result.sMsg + '</option>');
} else {
$(result.aBlogs).each(function(k,v){
$('<option value="' + v.id + '" data-url="' + v.url_full + '">' + v.title+'</option>').appendTo($blogs);
});
$($.map(result.aBlogs, function(value, index) {
return '<option value="' + value.id + '" data-url="' + value.url_full + '">' + value.title + '</option>';
}).join('')).appendTo(this.elements.nav.blogs);
$blogs.prop('disabled', false);
$button.prop('disabled', false);
this.elements.nav.blogs.prop('disabled', false);
this.elements.nav.submit.prop('disabled', false).removeClass(ls.options.classes.states.loading);
ls.hook.run('ls_blog_load_blogs_by_category_after', [id, result]);
ls.hook.run('ls_blog_load_blogs_by_category_after', [iId, result]);
}
});
this.elements.nav.submit.removeClass(ls.options.classes.states.loading);
}.bind(this));
} else {
$blogs.append('<option>' + ls.lang.get('blog') + '</option>');
this.elements.nav.submit.removeClass(ls.options.classes.states.loading);
this.elements.nav.blogs.html('<option>' + ls.lang.get('blog.blog') + '</option>');
}
};
@ -257,12 +283,108 @@ ls.blog = (function ($) {
* Переход на страницу выбранного блога
*/
this.navigatorGoSelectBlog = function() {
var $sel = $('#blog-navigator-blog').find('option:selected');
if ($sel.length) {
window.location.href = $sel.data('url');
}
window.location.href = this.elements.nav.blogs.find('option:selected').data('url') || '';
};
/**
* Приглашения
*/
this.invite = function(_this) {
/**
* Отправляет приглашение вступить в блог
*/
this.add = function(iBlogId, sUsers) {
if( ! sUsers ) return false;
var sUrl = _this.options.routers.invite.add,
oParams = { users: sUsers, idBlog: iBlogId };
_this.elements.invite.form.submit.prop('disabled', true).addClass(ls.options.classes.states.loading);
_this.elements.invite.form.users.autocomplete('disable');
ls.hook.marker('addInviteBefore');
ls.ajax.load(sUrl, oParams, function(result) {
_this.elements.invite.form.submit.prop('disabled', false).removeClass(ls.options.classes.states.loading);
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
_this.elements.invite.form.users.val('');
$($.map(result.aUsers, function(value, index) {
if (value.bStateError) {
ls.msg.error(null, value.sMsg);
} else {
ls.msg.notice(null, value.sMsg);
_this.elements.invite.container.show();
var oItem = _this.options.html.invite_item(iBlogId, value);
ls.hook.run('ls_blog_add_invite_user_after', [iBlogId, value], oItem);
return oItem;
}
}).join('')).appendTo(_this.elements.invite.user_list);
ls.hook.run('ls_blog_add_invite_after', [iBlogId, sUsers, result]);
}
});
return false;
};
/**
* Удаляет приглашение в блог
*/
this.remove = function(iUserId, iBlogId) {
var sUrl = _this.options.routers.invite.remove,
oParams = { idUser: iUserId, idBlog: iBlogId };
ls.hook.marker('removeInviteBefore');
ls.ajax.load(sUrl, oParams, function(result) {
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
ls.msg.notice(null, result.sMsg);
$(this.options.selectors.invite.user + '[data-user-id=' + iUserId + ']').fadeOut('slow', function() {
$(this).remove();
if ($(_this.options.selectors.invite.user).length === 0) _this.elements.invite.container.hide();
ls.hook.run('ls_blog_remove_invite_after', [iUserId, iBlogId, result]);
});
}
}.bind(_this));
return false;
};
/**
* Повторно отправляет приглашение
*/
this.repeat = function(iUserId,iBlogId) {
var sUrl = _this.options.routers.invite.repeat,
oParams = { idUser: iUserId, idBlog: iBlogId };
ls.hook.marker('repeatInviteBefore');
ls.ajax.load(sUrl, oParams, function(result) {
if (result.bStateError) {
ls.msg.error(null, result.sMsg);
} else {
ls.msg.notice(null, result.sMsg);
ls.hook.run('ls_blog_repeat_invite_after', [iUserId, iBlogId, result]);
}
});
return false;
};
return this;
}.call({}, this);
return this;
}).call(ls.blog || {},jQuery);

View file

@ -66,6 +66,8 @@ ls.topic = (function ($) {
$(this.options.selectors.addTopicTitle).on('change', function (e) {
ls.blog.loadInfo($(this).val());
});
ls.blog.loadInfo($(this.options.selectors.addTopicTitle).val());
};
/**

View file

@ -21,76 +21,312 @@
* Содержит все текстовки движка.
*/
return array(
'common' => array(
'add' => 'Добавить',
'remove' => 'Удалить',
'edit' => 'Редактировать',
'save' => 'Сохранить',
'create' => 'Создать',
),
/**
* Голосование
*/
'vote' => array(
'up' => 'Нравится',
'down' => 'Не нравится',
'count' => 'Всего проголосовало',
'rating' => 'Рейтинг',
// Всплывающие сообщения
'notices' => array(
'success' => 'Ваш голос учтен',
),
),
/**
* Избранное
*/
'favourite' => array(
'add' => 'Добавить в избранное',
'remove' => 'Удалить из избранного',
// Всплывающие сообщения
'notices' => array(
),
),
/**
* Поиск
*/
'search' => array(
'search' => 'Поиск',
'find' => 'Найти',
// Сообщения
'alerts' => array(
'empty' => 'Поиск не дал результатов',
),
),
/**
* Сортировка
*/
'sort' => array(
'label' => 'Сортировать',
'by_name' => 'по имени',
'by_date' => 'по дате',
'by_rating' => 'по рейтингу',
),
/**
* Блог
*/
'blog' => array(
'blog' => 'Блог',
'blogs' => 'Блоги',
'readers_declension' => 'читатель;читателя;читателей',
'administrators' => 'Администраторы',
'moderators' => 'Модераторы',
'owner' => 'Создатель',
'create_blog' => 'Создать блог',
'can_add' => 'Вы можете создать свой блог!',
'cant_add' => 'Для возможности создавать блоги, ваш рейтинг должен быть больше %%rating%%.',
'private' => 'Закрытый блог',
'personal_prefix' => 'Блог им.',
'personal_description' => 'Это ваш персональный блог.',
'topics_total' => 'Топиков',
'date_created' => 'Дата создания',
'rating_limit' => 'Ограничение на постинг',
// Сообщения
'alerts' => array(
'private' => 'Это закрытый блог, у вас нет прав на просмотр контента',
'banned' => 'Вы забанены в этом блоге',
'empty' => 'Список блогов пуст',
),
/**
* Поиск
*/
'search' => array(
'placeholder' => 'Поиск по названию',
),
/**
* Приглашения
*/
'invite' => array(
'invite_users' => 'Пригласить пользователей',
'users_title' => 'Список приглашенных',
'repeat' => 'Повторить',
'empty' => 'Нет приглашенных пользователей',
// Форма добавления
'form' => array(
'users_label' => 'Список пользователей',
),
// Письмо с приглашением
'email' => array(
'title' => "Приглашение стать читателем блога '%%blog_title%%'",
'text' => "Пользователь %%login%% приглашает вас стать читателем закрытого блога '%%blog_title%%'.<br/><br/><a href='%%accept_path%%'>Принять</a> - <a href='%%reject_path%%'>Отклонить</a>"
),
// Всплывающие сообщения
'notices' => array(
'add' => 'Пользователю %%login%% отправлено приглашение',
'add_self' => 'Нельзя отправить инвайт самому себе',
'already_invited' => 'Пользователю %%login%% уже отправлен инвайт',
'already_joined' => 'Пользователь %%login%% уже состоит в блоге',
'remove' => 'Приглашение для пользователя %%login%% удалено',
'reject' => 'Пользователь %%login%% отклонил инвайт',
),
// Сообщения
'alerts' => array(
'already_joined' => 'Вы уже являетесь пользователем этого блога',
'accepted' => 'Приглашение принято',
'rejected' => 'Приглашение отклонено',
)
),
/**
* Страница добавления/редактирования блога
*/
'add' => array(
'title' => 'Создание нового блога',
// Поля
'fields' => array(
'title' => array(
'label' => 'Название блога',
'note' => 'Название блога должно быть наполнено смыслом, чтобы можно было понять, о чем будет блог.',
'error' => 'Название блога должно быть от 2 до 200 символов',
'error_unique' => 'Блог с таким названием уже существует',
),
'url' => array(
'label' => 'URL блога',
'note' => 'URL блога, по которому он будет доступен. Может содержать только буквы латинского алфавита, цифры, дефис; пробелы будут заменены на "_". По смыслу URL должен совпадать с названием блога, после его создания редактирование этого параметра будет недоступно',
'error' => 'URL блога должен быть от 2 до 50 символов и только на латинице + цифры и знаки "-", "_"',
'error_badword' => 'URL блога должен отличаться от:',
'error_unique' => 'Блог с таким URL уже существует',
),
'category' => array(
'label' => 'Категория блога',
'note' => 'Блогу можно назначить категорию, что позволяет более глубоко структурировать сайт',
'error' => 'Не удалось найти категорию блога',
'error_only_children' => 'Можно выбрать только конечную категорию (без дочерних)',
),
'type' => array(
'label' => 'Тип блога',
'note_open' => 'Открытый — к этому блогу может присоединиться любой желающий, топики видны всем',
'note_close' => 'Закрытый — присоединиться можно только по приглашению администрации блога, топики видят только подписчики',
'value_open' => 'Открытый',
'value_close' => 'Закрытый',
'error' => 'Неизвестный тип блога',
),
'description' => array(
'label' => 'Описание блога',
'error' => 'Текст описания блога должен быть от 10 до 3000 символов',
),
'rating' => array(
'label' => 'Ограничение по рейтингу',
'note' => 'Рейтинг, который необходим пользователю, чтобы написать в этот блог',
'error' => 'Значение ограничения рейтинга должно быть числом',
),
'avatar' => array(
'label' => 'Аватар',
'error' => 'Не удалось загрузить аватар',
),
),
// Сообщения
'alerts' => array(
'acl' => 'Вы еще не достаточно окрепли, чтобы создавать свой блог', // TODO: Remove?
)
),
/**
* Страница удаления блога
*/
'remove' => array(
'title' => 'Удаление блога',
'remove_topics' => 'Удалить топики',
'move_to' => 'Переместить топики в блог',
'confirm' => 'Вы уверены, что хотите удалить блог?',
// Сообщения
'alerts' => array(
'success' => 'Блог успешно удален',
'not_empty' => 'Вы не можете удалить блок с записями. Предварительно удалите из блога все записи.',
'move_error' => 'Не удалось переместить топики из удаляемого блога',
'move_personal_error' => 'Нельзя перемещать топики в персональный блог', // TODO: Remove?
)
),
/**
* Управление блогом
*/
'admin' => array(
'title' => 'Редактирование блога',
'role_administrator' => 'Администратор',
'role_moderator' => 'Модератор',
'role_reader' => 'Читатель',
'role_banned' => 'Забаненный',
// Навигация
'nav' => array(
'profile' => 'Профиль',
'users' => 'Пользователи',
),
// Сообщения
'alerts' => array(
'empty' => 'В блоге никто не состоит', // TODO: Remove?
'submit_success' => 'Права сохранены', // TODO: Remove?
)
),
/**
* Голосование
*/
'vote' => array(
// Всплывающие сообщения
'notices' => array(
'error_already' => 'Вы уже голосовали за этот блог!',
'error_self' => 'Вы не можете голосовать за свой блог!',
'error_acl' => 'У вас не хватает рейтинга для голосования!',
'error_close' => 'Вы не можете голосовать за закрытый блог',
),
),
/**
* Вступить / покинуть блог
*/
'join' => array(
'join' => 'Вступить',
'leave' => 'Покинуть',
// Всплывающие сообщения
'notices' => array(
'join_success' => 'Вы вступили в блог',
'leave_success' => 'Вы покинули блог',
'error_invite' => 'Присоединиться к этому блогу можно только по приглашению!', // Remove?
'error_self' => 'Зачем вы хотите вступить в этот блог? Вы и так его хозяин!', // Remove?
),
),
/**
* Категории
*/
'categories' => array(
'category' => 'Категория',
'categories' => 'Категории',
'empty' => 'В данной категории нет блогов',
),
/**
* Список пользователей
*/
'users' => array(
'readers' => 'Читатели',
'readers_all' => 'Все читатели блога',
'readers_total' => 'Читателей',
'empty' => 'Нет читателей',
),
/**
* Сортировка
*/
'sort' => array(
'by_users' => 'по кол-ву читателей',
),
),
/**
* Блоги
*/
'blog' => 'Блог',
'blogs' => 'Блоги',
'blog_category' => 'Категория',
'blog_categories' => 'Категории',
'blogs_search_title_hint' => 'Поиск по названию',
'blogs_search_empty' => 'Поиск не дал результатов',
'blogs_title' => 'Название',
'blogs_readers' => 'Читателей',
'blogs_rating' => 'Рейтинг',
'blogs_owner' => 'Смотритель',
'blogs_personal_title' => 'Блог им.',
'blogs_personal_description' => 'Это ваш персональный блог.',
'blog_closed' => 'Закрытый блог',
'blog_no_topic' => 'Сюда еще никто не успел написать',
'blog_rss' => 'RSS лента',
'blog_rating' => 'Рейтинг',
'blog_vote_count' => 'голосов',
'blog_about' => 'О блоге',
'blog_expand_info' => 'Подробнее &darr;',
'blog_fold_info' => 'Свернуть &uarr;',
'blog_by_category_empty' => 'В данной категории нет блогов',
'blog_add' => 'Создать блог',
'blog_can_add' => 'Вы можете создать свой блог!',
'blog_cant_add' => 'Для возможности создавать блоги, ваш рейтинг должен быть больше %%rating%%.',
/**
* Поиск
*/
'search_submit' => 'Найти',
'search_results' => 'Результаты поиска',
'search_results_empty' => 'Удивительно, но поиск не дал результатов',
'search_results_count_topics' => 'топиков',
'search_results_count_comments' => 'комментариев',
/**
* Declensions
*/
'reader_declension' => 'читатель;читателя;читателей',
'topic_declension' => 'топик;топика;топиков',
'draft_declension' => 'черновик;черновика;черновиков',
/**
* Популярные блоги
*/
'blog_popular' => 'Популярные блоги',
'blog_popular_rating' => 'Рейтинг',
'blog_popular_all' => 'все блоги',
/**
* Пользователи блога
*/
'blog_user_count' => 'подписчиков',
'blog_user_administrators' => 'Администраторы',
'blog_user_moderators' => 'Модераторы',
'blog_user_moderators_empty' => 'Модераторов здесь не замечено',
'blog_user_readers' => 'Читатели',
'blog_user_readers_all' => 'Все читатели блога',
'blog_user_readers_empty' => 'Читателей здесь не замечено',
/**
* Голосование за блог
*/
'blog_vote_up' => 'нравится',
'blog_vote_down' => 'не нравится',
'blog_vote_count_text' => 'всего проголосовавших:',
'blog_vote_error_already' => 'Вы уже голосовали за этот блог!',
'blog_vote_error_self' => 'Вы не можете голосовать за свой блог!',
'blog_vote_error_acl' => 'У вас не хватает рейтинга и силы для голосования!',
'blog_vote_error_close' => 'Вы не можете голосовать за закрытый блог',
'blog_vote_ok' => 'Ваш голос учтен',
/**
* Вступление и выход из блога
*/
'blog_join' => 'вступить в блог',
'blog_join_ok' => 'Вы вступили в блог',
'blog_join_error_invite' => 'Присоединиться к этому блогу можно только по приглашению!',
'blog_join_error_self' => 'Зачем вы хотите вступить в этот блог? Вы и так его хозяин!',
'blog_leave' => 'покинуть блог',
'blog_leave_ok' => 'Вы покинули блог',
'blog_join_leave' => 'Вступить/Покинуть',
/**
* Меню блогов
*/
@ -115,87 +351,8 @@ return array(
'blog_menu_top_period_30d' => 'За 30 дней',
'blog_menu_top_period_all' => 'За все время',
'blog_menu_create' => 'Блог',
/**
* Создание/редактирование блога
*/
'blog_edit' => 'Редактировать',
'blog_delete' => 'Удалить',
'blog_create' => 'Создание нового блога',
'blog_create_acl' => 'Вы еще не достаточно окрепли, чтобы создавать свой блог',
'blog_create_category' => 'Категория блога',
'blog_create_category_notice' => 'Блогу можно назначить категорию, что позволяет более глубоко структурировать сайт',
'blog_create_category_error' => 'Не удалось найти категорию блога',
'blog_create_category_error_only_children' => 'Можно выбрать только конечную категорию (без дочерних)',
'blog_create_title' => 'Название блога',
'blog_create_title_notice' => 'Название блога должно быть наполнено смыслом, чтобы можно было понять, о чем будет блог.',
'blog_create_title_error' => 'Название блога должно быть от 2 до 200 символов',
'blog_create_title_error_unique' => 'Блог с таким названием уже существует',
'blog_create_url' => 'URL блога',
'blog_create_url_notice' => 'URL блога, по которому он будет доступен. Может содержать только буквы латинского алфавита, цифры, дефис; пробелы будут заменены на "_". По смыслу URL должен совпадать с названием блога, после его создания редактирование этого параметра будет недоступно',
'blog_create_url_error' => 'URL блога должен быть от 2 до 50 символов и только на латинице + цифры и знаки "-", "_"',
'blog_create_url_error_badword' => 'URL блога должен отличаться от:',
'blog_create_url_error_unique' => 'Блог с таким URL уже существует',
'blog_create_description' => 'Описание блога',
'blog_create_description_notice' => 'Между прочим, можно использовать html-теги',
'blog_create_description_error' => 'Текст описания блога должен быть от 10 до 3000 символов',
'blog_create_type' => 'Тип блога',
'blog_create_type_open' => 'Открытый',
'blog_create_type_close' => 'Закрытый',
'blog_create_type_open_notice' => 'Открытый — к этому блогу может присоединиться любой желающий, топики видны всем',
'blog_create_type_close_notice' => 'Закрытый — присоединиться можно только по приглашению администрации блога, топики видят только подписчики',
'blog_create_type_error' => 'Неизвестный тип блога',
'blog_create_rating' => 'Ограничение по рейтингу',
'blog_create_rating_notice' => 'Рейтинг, который необходим пользователю, чтобы написать в этот блог',
'blog_create_rating_error' => 'Значение ограничения рейтинга должно быть числом',
'blog_create_avatar' => 'Аватар',
'blog_create_avatar_error' => 'Не удалось загрузить аватар',
'blog_create_avatar_delete' => 'удалить',
'blog_create_submit' => 'Создать',
'blog_create_update' => 'Сохранить изменения',
'blog_create_submit_notice' => 'После нажатия на кнопку «Сохранить» блог будет создан',
/**
* Управление блогом
*/
'blog_admin' => 'Управление блогом',
'blog_admin_not_authorization' => 'Для того, чтобы изменить блог, сначала нужно войти под своим аккаунтом.',
'blog_admin_profile' => 'Профиль',
'blog_admin_users' => 'Пользователи',
'blog_admin_users_administrator' => 'администратор',
'blog_admin_users_moderator' => 'модератор',
'blog_admin_users_reader' => 'читатель',
'blog_admin_users_bun' => 'забаненный',
'blog_admin_users_current_administrator' => 'это вы &mdash; настоящий администратор!',
'blog_admin_users_empty' => 'в блоге никто не состоит',
'blog_admin_users_submit' => 'сохранить',
'blog_admin_users_submit_notice' => 'После нажатия на кнопку «Сохранить» права пользователей будут сохранены',
'blog_admin_users_submit_ok' => 'Права сохранены',
'blog_admin_users_submit_error' => 'Что-то не так',
'blog_admin_delete_title' => 'Удаление блога',
'blog_admin_delete_confirm' => 'Вы уверены, что хотите удалить блог?',
'blog_admin_delete_move' => 'Переместить топики в блог',
'blog_delete_clear' => 'Удалить топики',
'blog_admin_delete_success' => 'Блог успешно удален',
'blog_admin_delete_not_empty' => 'Вы не можете удалить блок с записями. Предварительно удалите из блога все записи.',
'blog_admin_delete_move_error' => 'Не удалось переместить топики из удаляемого блога',
'blog_admin_delete_move_personal' => 'Нельзя перемещать топики в персональный блог',
'blog_admin_user_add_label' => 'Добавить пользователей',
'blog_admin_user_invited' => 'Список приглашенных',
'blog_admin_user_add_header' => 'Пригласить пользователей',
'blog_admin_user_add_empty' => 'Нет приглашенных пользователей',
'blog_close_show' => 'Это закрытый блог, у вас нет прав на просмотр контента',
'blog_user_invite_add_self' => 'Нельзя отправить инвайт самому себе',
'blog_user_invite_add_ok' => 'Пользователю %%login%% отправлено приглашение',
'blog_user_invite_remove_ok' => 'Приглашение для пользователя %%login%% удалено',
'blog_user_already_invited' => 'Пользователю %%login%% уже отправлен инвайт',
'blog_user_already_exists' => 'Пользователь %%login%% уже состоит в блоге',
'blog_user_already_reject' => 'Пользователь %%login%% отклонил инвайт',
'blog_user_invite_title' => "Приглашение стать читателем блога '%%blog_title%%'",
'blog_user_invite_text' => "Пользователь %%login%% приглашает вас стать читателем закрытого блога '%%blog_title%%'.<br/><br/><a href='%%accept_path%%'>Принять</a> - <a href='%%reject_path%%'>Отклонить</a>",
'blog_user_invite_already_done' => 'Вы уже являетесь пользователем этого блога',
'blog_user_invite_accept' => 'Приглашение принято',
'blog_user_invite_reject' => 'Приглашение отклонено',
'blog_user_invite_readd' => 'повторить',
'blog_user_invite_remove' => 'удалить',
/**
* Топики
*/
@ -330,6 +487,7 @@ return array(
*/
'topic_vote_up' => 'нравится',
'topic_vote_down' => 'не нравится',
'topic_vote_abstain' => 'Воздержаться от голосования и посмотреть рейтинг',
'topic_vote_error_already' => 'Вы уже голосовали за этот топик!',
'topic_vote_error_self' => 'Вы не можете голосовать за свой топик!',
'topic_vote_error_guest' => 'для голосования необходимо авторизоваться',
@ -451,6 +609,8 @@ return array(
'user_search_empty' => 'Поиск не дал результатов',
'user_status_online' => 'Онлайн',
'user_status_offline' => 'Оффлайн',
'user_status_was_online_male' => 'Заходил',
'user_status_was_online_female' => 'Заходила',
/**
* Меню профиля пользователя
*/
@ -755,15 +915,6 @@ return array(
'block_blog_navigator_button' => 'Смотреть',
'site_history_back' => 'Вернуться назад',
'site_go_main' => 'перейти на главную',
/**
* Поиск
*/
'search' => 'Поиск',
'search_submit' => 'Найти',
'search_results' => 'Результаты поиска',
'search_results_empty' => 'Удивительно, но поиск не дал результатов',
'search_results_count_topics' => 'топиков',
'search_results_count_comments' => 'комментариев',
/**
* Почта
*/
@ -1081,17 +1232,6 @@ return array(
'favourite_form_tags_button_save' => 'Сохранить',
'favourite_form_tags_button_cancel' => 'Отмена',
'favourite_form_tags_button_show' => 'изменить свои теги',
/**
* Инфо-блоки
*/
'infobox_blog_create' => 'Создан',
'infobox_blog_topics' => 'Топиков',
'infobox_blog_users' => 'Подписчиков',
'infobox_blog_rating' => 'Рейтинг',
'infobox_blog_limit_rating' => 'Ограничение на постинг',
'infobox_blog_topic_last' => 'Последний топик',
'infobox_blog_url' => 'Читать блог',
'infobox_blog_rss' => 'Подписаться на RSS',
/**
* Создание
*/

View file

@ -3,9 +3,9 @@
* TODO: Вынести rangelength в конфиг
*}
{extends file='layouts/layout.base.tpl'}
{extends 'layouts/layout.base.tpl'}
{block name='layout_options'}
{block 'layout_options'}
{$bNoSidebar = true}
{if $sEvent == 'edit'}
@ -13,17 +13,17 @@
{/if}
{/block}
{block name='layout_page_title'}
{block 'layout_page_title'}
{if $sEvent == 'add'}
{$aLang.blog_create}
{$aLang.blog.add.title}
{else}
{$aLang.blog_admin}: <a href="{$oBlogEdit->getUrlFull()}">{$oBlogEdit->getTitle()|escape:'html'}</a>
{$aLang.blog.admin.title}: <a href="{$oBlogEdit->getUrlFull()}">{$oBlogEdit->getTitle()|escape}</a>
{/if}
{/block}
{block name='layout_content'}
{block 'layout_content'}
{* Подключение редактора *}
{include file='forms/editor.init.tpl' sEditorType='comment'}
{include 'forms/editor.init.tpl' sEditorType='comment'}
<form method="post" enctype="multipart/form-data" class="js-form-validate">
@ -31,19 +31,19 @@
{* Название блога *}
{include file='forms/fields/form.field.text.tpl'
{include 'forms/fields/form.field.text.tpl'
sFieldName = 'blog_title'
sFieldRules = 'required="true" rangelength="[2,200]"'
sFieldNote = $aLang.blog_create_title_notice
sFieldLabel = $aLang.blog_create_title}
sFieldNote = $aLang.blog.add.fields.title.note
sFieldLabel = $aLang.blog.add.fields.title.label}
{* URL блога *}
{include file='forms/fields/form.field.text.tpl'
{include 'forms/fields/form.field.text.tpl'
sFieldName = 'blog_url'
sFieldRules = 'required="true" type="alphanum" rangelength="[2,50]"'
bFieldIsDisabled = $_aRequest.blog_id && ! $oUserCurrent->isAdministrator()
sFieldNote = $aLang.blog_create_url_notice
sFieldLabel = $aLang.blog_create_url}
sFieldNote = $aLang.blog.add.fields.url.note
sFieldLabel = $aLang.blog.add.fields.url.label}
{* Категория блога *}
@ -59,10 +59,10 @@
]}
{/foreach}
{include file='forms/fields/form.field.select.tpl'
{include 'forms/fields/form.field.select.tpl'
sFieldName = 'blog_category'
sFieldLabel = $aLang.blog_create_category
sFieldNote = $aLang.blog_create_category_notice
sFieldLabel = $aLang.blog.add.fields.category.label
sFieldNote = $aLang.blog.add.fields.category.note
sFieldClasses = 'width-200'
aFieldItems = $aBlogCategoriesCustom
sFieldSelectedValue = $_aRequest.blog_category}
@ -71,40 +71,40 @@
{* Тип блога *}
{$aBlogsType = [
[ 'value' => 'open', 'text' => $aLang.blog_create_type_open ],
[ 'value' => 'close', 'text' => $aLang.blog_create_type_close ]
[ 'value' => 'open', 'text' => $aLang.blog.add.fields.type.value_open ],
[ 'value' => 'close', 'text' => $aLang.blog.add.fields.type.value_close ]
]}
{include file='forms/fields/form.field.select.tpl'
{include 'forms/fields/form.field.select.tpl'
sFieldName = 'blog_type'
sFieldLabel = $aLang.blog_create_type
sFieldNote = $aLang.blog_create_type_open_notice
sFieldLabel = $aLang.blog.add.fields.type.label
sFieldNote = $aLang.blog.add.fields.type.note_open
sFieldClasses = 'width-200 js-blog-add-type'
aFieldItems = $aBlogsType
sFieldSelectedValue = $_aRequest.blog_type}
{* Описание блога *}
{include file='forms/fields/form.field.textarea.tpl'
{include 'forms/fields/form.field.textarea.tpl'
sFieldName = 'blog_description'
sFieldRules = 'required="true" rangelength="[10,3000]"'
sFieldLabel = $aLang.blog_create_description
sFieldLabel = $aLang.blog.add.fields.description.label
sFieldClasses = 'width-full js-editor'}
{* Если визуальный редактор отключен выводим справку по разметке для обычного редактора *}
{if ! $oConfig->GetValue('view.wysiwyg')}
{include file='forms/editor.help.tpl' sTagsTargetId='blog_description'}
{include 'forms/editor.help.tpl' sTagsTargetId='blog_description'}
{/if}
{* Ограничение по рейтингу *}
{include file='forms/fields/form.field.text.tpl'
{include 'forms/fields/form.field.text.tpl'
sFieldName = 'blog_limit_rating_topic'
sFieldRules = 'required="true" type="number"'
sFieldValue = '0'
sFieldClasses = 'width-100'
sFieldNote = $aLang.blog_create_rating_notice
sFieldLabel = $aLang.blog_create_rating}
sFieldNote = $aLang.blog.add.fields.rating.note
sFieldLabel = $aLang.blog.add.fields.rating.label}
{* Аватар *}
@ -113,27 +113,28 @@
{if $iSize}<img src="{$oBlogEdit->getAvatarPath({$iSize})}">{/if}
{/foreach}
{include file='forms/fields/form.field.checkbox.tpl' sFieldName='avatar_delete' bFieldNoMargin=true sFieldValue='on' sFieldLabel=$aLang.blog_create_avatar_delete}
{include 'forms/fields/form.field.checkbox.tpl' sFieldName='avatar_delete' bFieldNoMargin=true sFieldValue='on' sFieldLabel=$aLang.common.remove}
{/if}
{include file='forms/fields/form.field.file.tpl'
{include 'forms/fields/form.field.file.tpl'
sFieldName = 'avatar'
sFieldLabel = $aLang.blog_create_avatar}
sFieldLabel = $aLang.blog.add.fields.avatar.label}
{hook run='form_add_blog_end'}
{* Скрытые поля *}
{include file='forms/fields/form.field.hidden.security_key.tpl'}
{include 'forms/fields/form.field.hidden.security_key.tpl'}
{* Кнопки *}
{if $sEvent == 'add'}
{$sSubmitInputText = $aLang.blog_create_submit}
{$sSubmitInputText = $aLang.common.create}
{else}
{$sSubmitInputText = $aLang.topic_create_submit_update}
{$sSubmitInputText = $aLang.common.save}
{/if}
{include file='forms/fields/form.field.button.tpl' sFieldName='submit_blog_add' sFieldText=$sSubmitInputText sFieldStyle='primary'}
{include 'forms/fields/form.field.button.tpl' sFieldName='submit_blog_add' sFieldText=$sSubmitInputText sFieldStyle='primary'}
</form>
{/block}

View file

@ -1,30 +1,35 @@
{**
* Управление пользователями блога
*
* @param object oBlogEdit Блог
* @param array aBlogUsers Список пользователей
*}
{extends file='layouts/layout.base.tpl'}
{extends 'layouts/layout.base.tpl'}
{block 'layout_options'}
{if $oBlogEdit->getType() != 'close'}
{$bNoSidebar = true}
{/if}
{block name='layout_options'}
{$sNav = 'blog.edit'}
{/block}
{block name='layout_page_title'}
{$aLang.blog_admin}: <a href="{$oBlogEdit->getUrlFull()}">{$oBlogEdit->getTitle()|escape:'html'}</a>
{block 'layout_page_title'}
{$aLang.blog.admin.title}: <a href="{$oBlogEdit->getUrlFull()}">{$oBlogEdit->getTitle()|escape}</a>
{/block}
{block name='layout_content'}
{block 'layout_content'}
{if $aBlogUsers}
<form method="post" enctype="multipart/form-data" class="mb-20">
<input type="hidden" name="security_ls_key" value="{$LIVESTREET_SECURITY_KEY}" />
<table class="table table-users">
<form method="post" enctype="multipart/form-data">
<table class="table">
<thead>
<tr>
<th class="cell-name">{$aLang.blog_admin_users}</th>
<th class="ta-c">{$aLang.blog_admin_users_administrator}</th>
<th class="ta-c">{$aLang.blog_admin_users_moderator}</th>
<th class="ta-c">{$aLang.blog_admin_users_reader}</th>
<th class="ta-c">{$aLang.blog_admin_users_bun}</th>
<th class="cell-name"></th>
<th class="ta-c">{$aLang.blog.admin.role_administrator}</th>
<th class="ta-c">{$aLang.blog.admin.role_moderator}</th>
<th class="ta-c">{$aLang.blog.admin.role_reader}</th>
<th class="ta-c">{$aLang.blog.admin.role_banned}</th>
</tr>
</thead>
@ -34,28 +39,31 @@
<tr>
<td class="cell-name">
<a href="{$oUser->getUserWebPath()}"><img src="{$oUser->getProfileAvatarPath(24)}" alt="avatar" class="avatar" /></a>
<a href="{$oUser->getUserWebPath()}">{$oUser->getDisplayName()}</a>
{include 'user_item.tpl' oUser=$oUser}
</td>
{if $oUser->getId()==$oUserCurrent->getId()}
<td colspan="10" class="ta-c">{$aLang.blog_admin_users_current_administrator}</td>
{if $oUser->getId() == $oUserCurrent->getId()}
<td colspan="10" class="ta-c">&mdash;</td>
{else}
<td class="ta-c"><input type="radio" name="user_rank[{$oUser->getId()}]" value="administrator" {if $oBlogUser->getIsAdministrator()}checked{/if} /></td>
<td class="ta-c"><input type="radio" name="user_rank[{$oUser->getId()}]" value="moderator" {if $oBlogUser->getIsModerator()}checked{/if} /></td>
<td class="ta-c"><input type="radio" name="user_rank[{$oUser->getId()}]" value="reader" {if $oBlogUser->getUserRole()==$BLOG_USER_ROLE_USER}checked{/if} /></td>
<td class="ta-c"><input type="radio" name="user_rank[{$oUser->getId()}]" value="ban" {if $oBlogUser->getUserRole()==$BLOG_USER_ROLE_BAN}checked{/if} /></td>
<td class="ta-c"><input type="radio" name="user_rank[{$oUser->getId()}]" value="reader" {if $oBlogUser->getUserRole() == $BLOG_USER_ROLE_USER}checked{/if} /></td>
<td class="ta-c"><input type="radio" name="user_rank[{$oUser->getId()}]" value="ban" {if $oBlogUser->getUserRole() == $BLOG_USER_ROLE_BAN}checked{/if} /></td>
{/if}
</tr>
{/foreach}
</tbody>
</table>
<button type="submit" name="submit_blog_admin" class="button button-primary">{$aLang.blog_admin_users_submit}</button>
{* Скрытые поля *}
{include 'forms/fields/form.field.hidden.security_key.tpl'}
{* Кнопки *}
{include 'forms/fields/form.field.button.tpl' sFieldName='submit_blog_admin' sFieldText=$aLang.common.save sFieldStyle='primary'}
</form>
{include file='pagination.tpl' aPaging=$aPaging}
{include 'pagination.tpl' aPaging=$aPaging}
{else}
{$aLang.blog_admin_users_empty}
{include 'alert.tpl' mAlerts=$aLang.blog.admin.alerts.empty sAlertStyle='empty'}
{/if}
{/block}

View file

@ -1,183 +1,103 @@
{**
* Блог
*
* bCloseBlog true если блог закрытый
* @param object $oBlog Блог
* @param array $aBlogUsers Читатели блога
* @param array $aBlogModerators Модераторы блога
* @param array $aBlogAdministrators Администраторы блога
* @param integer $iCountBlogUsers Кол-во читателей
* @param integer $iCountBlogModerators Кол-во модераторов
* @param integer $iCountBlogAdministrators Кол-во администраторов
* @param boolean $bPrivateBlog Закрытый блог или нет
*
* @styles css/blog.css
* @scripts <framework>/js/livestreet/blog.js
*
* TODO: Fix alerts
*}
{extends file='layouts/layout.base.tpl'}
{block name='layout_content'}
{$oUserOwner = $oBlog->getOwner()}
{$oVote = $oBlog->getVote()}
<script>
jQuery(function($){
ls.lang.load({lang_load name="blog_fold_info,blog_expand_info"});
});
</script>
{extends 'layouts/layout.base.tpl'}
{block 'layout_content'}
{* Подключаем модальное окно удаления блога если пользователь админ *}
{if $oUserCurrent and $oUserCurrent->isAdministrator()}
{include file='modals/modal.blog_delete.tpl'}
{include 'modals/modal.blog_delete.tpl'}
{/if}
<div class="blog">
<header class="blog-header">
{* Голосование за блог *}
<div data-vote-type="blog"
data-vote-id="{$oBlog->getId()}"
class="vote js-vote
{if $oBlog->getRating() > 0}
vote-count-positive
{elseif $oBlog->getRating() < 0}
vote-count-negative
{/if}
{if $oVote}
voted
{if $oVote->getDirection() > 0}
voted-up
{elseif $oVote->getDirection() < 0}
voted-down
{/if}
{/if}">
<div class="vote-label">{$aLang.blog_rating}</div>
<a href="#" class="vote-up js-vote-up"><i></i></a>
<a href="#" class="vote-down js-vote-down"><i></i></a>
<div class="vote-count count js-vote-rating" title="{$aLang.blog_vote_count}: {$oBlog->getCountVote()}">{if $oBlog->getRating() > 0}+{/if}{$oBlog->getRating()}</div>
</div>
{* Аватар *}
<img src="{$oBlog->getAvatarPath(48)}" alt="avatar" class="avatar" />
{* Голосование *}
{include 'vote.tpl' sVoteType='blog' sVoteStyle='large' oVoteObject=$oBlog bVoteShowLabel=true}
{* Заголовок *}
<h2 class="page-header blog-title">
{if $oBlog->getType() == 'close'}
<i title="{$aLang.blog_closed}" class="icon icon-lock"></i>
{/if}
{$oBlog->getTitle()|escape:'html'}
{if $oBlog->getType() == 'close'}<i title="{$aLang.blog.private}" class="icon icon-lock"></i>{/if}
{$oBlog->getTitle()|escape}
</h2>
{* Управление *}
<ul class="actions">
<li><a href="{router page='rss'}blog/{$oBlog->getUrl()}/" class="rss">RSS</a></li>
{* Вступить/покинуть блог *}
{if $oUserCurrent and $oUserCurrent->getId() != $oBlog->getOwnerId()}
<li>
<a href="#" onclick="ls.blog.toggleJoin(this,{$oBlog->getId()}); return false;" class="link-dotted">
{if $oBlog->getUserIsJoin()}
{$aLang.blog_leave}
{else}
{$aLang.blog_join}
{/if}
</a>
</li>
{/if}
{* Администрирование *}
{if $oUserCurrent and ($oUserCurrent->getId() == $oBlog->getOwnerId() or $oUserCurrent->isAdministrator() or $oBlog->getUserIsAdministrator() )}
<li>
<a href="{router page='blog'}edit/{$oBlog->getId()}/" title="{$aLang.blog_edit}" class="edit">{$aLang.blog_edit}</a>
</li>
{if $oUserCurrent->isAdministrator()}
<li><a href="#" title="{$aLang.blog_delete}" data-type="modal-toggle" data-modal-target="modal-blog-delete" class="delete">{$aLang.blog_delete}</a></li>
{else}
<li><a href="{router page='blog'}delete/{$oBlog->getId()}/?security_ls_key={$LIVESTREET_SECURITY_KEY}"
title="{$aLang.blog_delete}"
onclick="return confirm('{$aLang.blog_admin_delete_confirm}');" >{$aLang.blog_delete}</a></li>
{/if}
{/if}
</ul>
</header>
{* Информация о блоге *}
<div class="blog-content" id="blog-more-content" style="display: none;">
<div class="blog-description text">
{$oBlog->getDescription()}
</div>
<div class="blog-content">
{* Описание *}
<div class="blog-description text">{$oBlog->getDescription()}</div>
{* Информация *}
{$aBlogInfo = [
$aLang.blog.date_created => "{date_format date=$oBlog->getDateAdd() hours_back='12' minutes_back='60' now='60' day='day H:i' format='j F Y'}",
$aLang.blog.topics_total => $oBlog->getCountTopic(),
$aLang.blog.rating_limit => $oBlog->getLimitRatingTopic()
]}
<div class="blog-info">
{hook run='blog_info_begin' oBlog=$oBlog}
<strong>{$aLang.blog_user_administrators} ({$iCountBlogAdministrators}):</strong>
{* Создатель блога *}
<a href="{$oUserOwner->getUserWebPath()}" class="user"><i class="icon-user"></i>{$oUserOwner->getDisplayName()}</a>
{* Список администраторов блога *}
{if $aBlogAdministrators}
{foreach $aBlogAdministrators as $oBlogUser}
{$oUser = $oBlogUser->getUser()}
<a href="{$oUser->getUserWebPath()}" class="user"><i class="icon-user"></i>{$oUser->getDisplayName()}</a>
{/foreach}
{/if}
<br />
{* Список модераторов блога *}
<strong>{$aLang.blog_user_moderators} ({$iCountBlogModerators}):</strong>
{if $aBlogModerators}
{foreach $aBlogModerators as $oBlogUser}
{$oUser = $oBlogUser->getUser()}
<a href="{$oUser->getUserWebPath()}" class="user"><i class="icon-user"></i>{$oUser->getDisplayName()}</a>
{/foreach}
{else}
{$aLang.blog_user_moderators_empty}
{/if}
<br />
{* Список подписавшихся пользователей *}
<strong>{$aLang.blog_user_readers} ({$iCountBlogUsers}):</strong>
{if $aBlogUsers}
{foreach $aBlogUsers as $oBlogUser}
{$oUser = $oBlogUser->getUser()}
<a href="{$oUser->getUserWebPath()}" class="user"><i class="icon-user"></i>{$oUser->getDisplayName()}</a>
{/foreach}
{* Если пользователей слишком много, то показываем ссылку на страницу со всеми пользователями *}
{if count($aBlogUsers) < $iCountBlogUsers}
<br /><a href="{$oBlog->getUrlFull()}users/">{$aLang.blog_user_readers_all}</a>
{/if}
{else}
{$aLang.blog_user_readers_empty}
{/if}
{hook run='blog_info_end' oBlog=$oBlog}
</div>
<ul class="blog-info">
{foreach $aBlogInfo as $aBlogInfoItem}
<li class="blog-info-item">
<span class="blog-info-item-label">{$aBlogInfoItem@key}:</span>
<strong class="blog-info-item-content">{$aBlogInfoItem@value}</strong>
</li>
{/foreach}
</ul>
</div>
{* Кнопка показывающая/скрывающая информацию о блоге *}
<footer class="blog-footer">
<a href="#" class="get-more" id="blog-more" onclick="return ls.blog.toggleInfo()">{$aLang.blog_expand_info}</a>
</footer>
{* Управление *}
{if $oUserCurrent && ($oUserCurrent->getId() == $oBlog->getOwnerId() || $oUserCurrent->isAdministrator() || $oBlog->getUserIsAdministrator() )}
<ul class="actions">
<li>
<i class="icon-edit icon-white"></i>
<a href="{router page='blog'}edit/{$oBlog->getId()}/">{$aLang.common.edit}</a>
</li>
<li>
<i class="icon-trash icon-white"></i>
{if $oUserCurrent->isAdministrator()}
<a href="#" data-type="modal-toggle" data-modal-target="modal-blog-delete">{$aLang.common.remove}</a>
{else}
<a href="{router page='blog'}delete/{$oBlog->getId()}/?security_ls_key={$LIVESTREET_SECURITY_KEY}" class="js-blog-remove">{$aLang.common.remove}</a>
{/if}
</li>
</ul>
{/if}
</div>
{hook run='blog_info' oBlog=$oBlog}
{* Сообщение для забаненного пользователя *}
{* TODO: Вывод сообщения о бане *}
{if false}
{include 'alert.tpl' mAlerts=$aLang.blog.alerts.banned sAlertStyle='error'}
{/if}
{* Навигация по топикам блога *}
<div class="nav-group">
{include file='navs/nav.topics.sub.tpl'}
{include 'navs/nav.topics.sub.tpl'}
</div>
{if $bCloseBlog}
{$aLang.blog_close_show}
{* Список топиков *}
{if $bPrivateBlog}
{include 'alert.tpl' mAlerts=$aLang.blog.alerts.private sAlertStyle='error'}
{else}
{include file='topics/topic_list.tpl'}
{include 'topics/topic_list.tpl'}
{/if}
{/block}

View file

@ -0,0 +1,16 @@
{**
* Кнопка Вступить / Покинуть блог
*
* @param object $oBlog Блог
* @param object $oUserCurrent Текущий пользователь
*
* @scripts <framework>/js/livestreet/blog.js
*}
{if $oUserCurrent && $oUserCurrent->getId() != $oBlog->getOwnerId() && $oBlog->getType() == 'open'}
{include 'forms/fields/form.field.button.tpl'
sFieldAttributes = "data-blog-id=\"{$oBlog->getId()}\""
sFieldClasses = 'js-blog-join'
sFieldText = ($oBlog->getUserIsJoin()) ? $aLang.blog.join.leave : $aLang.blog.join.join
sFieldStyle = ($oBlog->getUserIsJoin()) ? false : 'primary'}
{/if}

View file

@ -2,12 +2,12 @@
* Список топиков только из коллективных блогов
*}
{extends file='layouts/layout.base.tpl'}
{extends 'layouts/layout.base.tpl'}
{block name='layout_options'}
{block 'layout_options'}
{$sNav = 'topics'}
{/block}
{block name='layout_content'}
{include file='topics/topic_list.tpl'}
{block 'layout_content'}
{include 'topics/topic_list.tpl'}
{/block}

View file

@ -2,22 +2,21 @@
* Топик
*}
{extends file='layouts/layout.base.tpl'}
{extends 'layouts/layout.base.tpl'}
{block name='layout_content'}
{include file='topics/topic.tpl'}
{include
file='comments/comment_tree.tpl'
iTargetId=$oTopic->getId()
iAuthorId=$oTopic->getUserId()
sAuthorNotice=$aLang.topic_author
sTargetType='topic'
iCountComment=$oTopic->getCountComment()
sDateReadLast=$oTopic->getDateRead()
bAllowNewComment=$oTopic->getForbidComment()
sNoticeNotAllow=$aLang.topic_comment_notallow
sNoticeCommentAdd=$aLang.topic_comment_add
bAllowSubscribe=true
oSubscribeComment=$oTopic->getSubscribeNewComment()
aPagingCmt=$aPagingCmt}
{block 'layout_content'}
{include 'topics/topic.tpl'}
{include 'comments/comment_tree.tpl'
iTargetId = $oTopic->getId()
iAuthorId = $oTopic->getUserId()
sAuthorNotice = $aLang.topic_author
sTargetType = 'topic'
iCountComment = $oTopic->getCountComment()
sDateReadLast = $oTopic->getDateRead()
bAllowNewComment = $oTopic->getForbidComment()
sNoticeNotAllow = $aLang.topic_comment_notallow
sNoticeCommentAdd = $aLang.topic_comment_add
bAllowSubscribe = true
oSubscribeComment = $oTopic->getSubscribeNewComment()
aPagingCmt = $aPagingCmt}
{/block}

View file

@ -2,23 +2,13 @@
* Список пользователей которые подключены к блогу
*}
{extends file='layouts/layout.base.tpl'}
{extends 'layouts/layout.base.tpl'}
{block name='layout_page_title'}
{$aLang.blog_user_readers_all} ({$iCountBlogUsers}):
<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape:'html'}</a>
{block'layout_page_title'}
{$aLang.blog.users.readers_all} ({$iCountBlogUsers}):
<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape}</a>
{/block}
{block name='layout_content'}
{if $aBlogUsers}
{$aUsersList = []}
{foreach $aBlogUsers as $oBlogUser}
{$aUsersList[] = $oBlogUser->getUser()}
{/foreach}
{include file='user_list.tpl' aUsersList=$aUsersList bUsersUseOrder=true sUsersRootPage=$sUsersRootPage}
{else}
{$aLang.blog_user_readers_empty}
{/if}
{block'layout_content'}
{include 'user_list.tpl' aUsersList=$aBlogUsers bUsersUseOrder=true sUsersRootPage=$sUsersRootPage}
{/block}

View file

@ -1,94 +1,64 @@
{**
* Список блогов
*
* @styles css/tables.css
* @styles css/blog.css
* @scripts <frontend>/common/js/blog.js
*}
<table class="table table-blogs">
{if $bBlogsUseOrder}
<thead>
<tr>
<th class="cell-name"><a href="{$sBlogsRootPage}?order=blog_title&order_way={if $sBlogOrder=='blog_title'}{$sBlogOrderWayNext}{else}{$sBlogOrderWay}{/if}" {if $sBlogOrder=='blog_title'}class="{$sBlogOrderWay}"{/if}>{$aLang.blogs_title}</a></th>
{if $oUserCurrent}
<th class="cell-join">{$aLang.blog_join_leave}</th>
{/if}
{* Список блогов *}
{if $aBlogs}
{* Сортировка *}
{include 'sort.tpl'
sSortName = 'sort-blog-list'
aSortList = [ [ name => 'blog_title', text => $aLang.sort.by_name ],
[ name => 'blog_count_user', text => $aLang.blog.sort.by_users ],
[ name => 'blog_rating', text => $aLang.sort.by_rating ] ]
sSortUrl = $sBlogsRootPage
sSortOrder = $sBlogOrder
sSortOrderWay = $sBlogOrderWay}
<th class="cell-readers">
<a href="{$sBlogsRootPage}?order=blog_count_user&order_way={if $sBlogOrder=='blog_count_user'}{$sBlogOrderWayNext}{else}{$sBlogOrderWay}{/if}" {if $sBlogOrder=='blog_count_user'}class="{$sBlogOrderWay}"{/if}>{$aLang.blogs_readers}</a>
</th>
<th class="cell-rating align-center"><a href="{$sBlogsRootPage}?order=blog_rating&order_way={if $sBlogOrder=='blog_rating'}{$sBlogOrderWayNext}{else}{$sBlogOrderWay}{/if}" {if $sBlogOrder=='blog_rating'}class="{$sBlogOrderWay}"{/if}>{$aLang.blogs_rating}</a></th>
</tr>
</thead>
{* Список блогов *}
<ul class="object-list object-list-actions blog-list">
{foreach $aBlogs as $oBlog}
<li class="object-list-item">
{* Аватар *}
<a href="{$oBlog->getUrlFull()}">
<img src="{$oBlog->getAvatarPath(100)}" width="100" height="100" alt="{$oBlog->getTitle()|escape}" class="object-list-item-image" />
</a>
{* Заголовок *}
<h2 class="object-list-item-title">
{if $oBlog->getType() == 'close'}
<i title="{$aLang.blog.private}" class="icon-lock"></i>
{/if}
<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape}</a>
</h2>
{* Описание *}
<p class="object-list-item-description">{$oBlog->getDescription()|strip_tags|truncate:120}</p>
{* Информация *}
<ul class="object-list-item-info">
<li>{$aLang.blog.users.readers_total}: <strong class="js-blog-users-number" data-blog-id="{$oBlog->getId()}">{$oBlog->getCountUser()}</strong></li>
<li>{$aLang.vote.rating}: <strong>{$oBlog->getRating()}</strong></li>
<li>{$aLang.blog.topics_total}: <strong>{$oBlog->getCountTopic()}</strong></li>
</ul>
{* Действия *}
<div class="object-list-item-actions">
{* Вступить/покинуть блог *}
{include 'actions/ActionBlog/button_join.tpl'}
</div>
</li>
{/foreach}
</ul>
{else}
{* TODO: Fix error message *}
{if $sBlogsEmptyList}
{$sBlogsEmptyList}
{else}
<thead>
<tr>
<th class="cell-name">{$aLang.blogs_title}</th>
{if $oUserCurrent}
<th class="cell-join">{$aLang.blog_join_leave}</th>
{/if}
<th class="cell-readers">{$aLang.blogs_readers}</th>
<th class="cell-rating align-center">{$aLang.blogs_rating}</th>
</tr>
</thead>
{include 'alert.tpl' mAlerts=$aLang.blog.alerts.empty sAlertStyle='empty'}
{/if}
<tbody>
{if $aBlogs}
{foreach $aBlogs as $oBlog}
{$oUserOwner = $oBlog->getOwner()}
<tr>
<td class="cell-name">
<a href="{$oBlog->getUrlFull()}">
<img src="{$oBlog->getAvatarPath(48)}" width="48" height="48" alt="avatar" class="avatar" />
</a>
<h4>
{if $oBlog->getType() == 'close'}
<i title="{$aLang.blog_closed}" class="icon-lock"></i>
{/if}
<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape:'html'}</a>
</h4>
<p>{$oBlog->getDescription()|strip_tags|truncate:120}</p>
</td>
{if $oUserCurrent}
<td class="cell-join">
{if $oUserCurrent->getId() != $oBlog->getOwnerId() and $oBlog->getType() == 'open'}
<a href="#" onclick="ls.blog.toggleJoin(this, {$oBlog->getId()}); return false;" class="button">
{if $oBlog->getUserIsJoin()}
{$aLang.blog_leave}
{else}
{$aLang.blog_join}
{/if}
</a>
{else}
&mdash;
{/if}
</td>
{/if}
<td class="cell-readers" id="blog_user_count_{$oBlog->getId()}">{$oBlog->getCountUser()}</td>
<td class="cell-rating align-center">{$oBlog->getRating()}</td>
</tr>
{/foreach}
{else}
<tr>
<td colspan="4">
{* TODO: Fix error message *}
{if $sBlogsEmptyList}
{$sBlogsEmptyList}
{/if}
{if !$aBlogs && !$sBlogsEmptyList}
{$aLang.blog_by_category_empty}
{/if}
</td>
</tr>
{/if}
</tbody>
</table>
{/if}

View file

@ -2,16 +2,16 @@
* Список блогов
*}
{extends file='layouts/layout.base.tpl'}
{extends 'layouts/layout.base.tpl'}
{block name='layout_options'}
{block 'layout_options'}
{$sMenuHeadItemSelect = 'blogs'}
{/block}
{block name='layout_page_title'}{$aLang.blogs}{/block}
{block 'layout_page_title'}{$aLang.blog.blogs}{/block}
{block name='layout_content'}
{include file='forms/form.search.blogs.tpl'}
{block 'layout_content'}
{include 'forms/form.search.blogs.tpl'}
<div id="blogs-list-search" style="display:none;"></div>
@ -20,7 +20,7 @@
{router page='blogs' assign=sBlogsRootPage}
{/if}
{include file='actions/ActionBlogs/blog_list.tpl' bBlogsUseOrder=true sBlogsRootPage=$sBlogsRootPage}
{include file='pagination.tpl' aPaging=$aPaging}
{include 'actions/ActionBlogs/blog_list.tpl' bBlogsUseOrder=true sBlogsRootPage=$sBlogsRootPage}
{include 'pagination.tpl' aPaging=$aPaging}
</div>
{/block}

View file

@ -1,22 +0,0 @@
{**
* Содержимое поповера с информацией о блоге
*}
{$aLang.infobox_blog_create} &mdash; {$oBlog->getDateAdd()}<br/>
{$aLang.infobox_blog_topics} &mdash; {$oBlog->getCountTopic()}<br/>
{$aLang.infobox_blog_users} &mdash; {$oBlog->getCountUser()}<br/>
{$aLang.infobox_blog_rating} &mdash; {$oBlog->getRating()}<br/>
{$aLang.infobox_blog_limit_rating} &mdash; {$oBlog->getLimitRatingTopic()}<br/>
{if $oTopicLast}
<br />
{$aLang.infobox_blog_topic_last}:<br/>
<a href="{$oTopicLast->getUrl()}">{$oTopicLast->getTitle()|escape:'html'}</a>
<br />
{/if}
<br />
<a href="{$oBlog->getUrlFull()}">{$aLang.infobox_blog_url}</a><br/>
<a href="{router page='rss'}blog/{$oBlog->getUrl()}/">{$aLang.infobox_blog_rss}</a><br/>

View file

@ -14,13 +14,13 @@
*
* @template blocks/block.aside.base.tpl
*/
.block { background: #fff; margin-bottom: 30px; border-top: 3px solid #AC90DF; box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); }
.block { background: #fff; margin-bottom: 30px; }
.block:last-child { margin-bottom: 0; }
.block .text { font-size: 13px; line-height: 18px; }
.block .max-height-200 { overflow: auto; max-height: 200px; position: relative; }
.block .loading { min-height: 100px; background-image: url(../images/loader.gif); background-position: 50% 45px; }
.block .search-form { padding: 0; margin-bottom: 20px; }
.block .text { font-size: 13px; line-height: 18px; }
.block .max-height-200 { overflow: auto; max-height: 200px; position: relative; }
.block .search-form { padding: 0; margin-bottom: 20px; }
.block .block-content.loading { min-height: 100px; background-image: url(../images/loader.gif); background-position: 50% 45px; }
/* Шапка */
.block-header { padding: 18px 20px 0; position: relative; }
@ -38,7 +38,7 @@
.block-footer { border-top: 1px solid #eee; padding: 15px 20px; font-size: 12px; }
/* Кнопка обновления блока */
.block-update {
.block-update {
position: absolute;
top: 19px;
right: 15px;
@ -98,17 +98,28 @@
.block-type-blog-navigation .blog-navigator-categories option:first-child { color: #aaa; }
/**
* Информация о блоге
*
* @modifier blog-actions
* @template blocks/block.blogActions.tpl
*/
.block.block-type-blog-actions .block-content { padding: 0; }
.block.block-type-blog-actions .avatar { min-width: 100%; vertical-align: top; }
.block.block-type-blog-actions .block-footer { text-align: center; }
/**
* Фото пользователя
*
* @modifier profile
* @template blocks/block.profilePhoto.tpl
*/
.block-type-profile-photo { text-align: center; }
.block-type-profile-photo .profile-photo-wrapper { position: relative; min-height: 50px; display: inline-block; }
.block-type-profile-photo .profile-photo { vertical-align: top; }
.block-type-profile-photo .block-content { padding: 0; }
.block-type-profile-photo .profile-photo-wrapper { position: relative; min-width: 100%; min-height: 50px; display: inline-block; }
.block-type-profile-photo .profile-photo { vertical-align: top; min-width: 100%; }
.block-type-profile-photo .status { position: absolute; top: 10px; left: 0; padding: 4px 9px; }
.block-type-profile-photo .status { position: absolute; top: 20px; left: 0; padding: 12px 15px; font: 300 16px/1em 'Open Sans'; }
.block-type-profile-photo .status.status-online { background: #b7bc1c; background: rgba(183, 188, 28, .8); color: #fff; }
.block-type-profile-photo .status.status-offline { background: #333; background: rgba(0, 0, 0, .6); color: #fff; }
@ -139,9 +150,11 @@
* @modifier profile-actions
* @template blocks/block.profileActions.tpl
*/
.block-type-profile-actions .block-content { padding: 10px 15px; }
.block-type-profile-actions ul li { margin-bottom: 5px; }
.block-type-profile-actions ul li:last-child { margin-bottom: 0; }
.block-type-profile-actions { border: none; }
.block-type-profile-actions .block-content { padding: 0; }
.block-type-profile-actions ul li { margin-bottom: 0; }
.block-type-profile-actions ul li a { display: block; padding: 10px 15px; }
.block-type-profile-actions ul li a:hover { background: #fafafa; }
.block-type-profile-actions ul li a.followed { color: #f00; }

View file

@ -9,28 +9,34 @@
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.blog { margin-bottom: 15px; overflow: hidden; }
.blog {
width: 100%;
padding: 40px;
margin: -40px 0 15px -40px;
overflow: hidden;
background: #222;
color: rgba(255, 255, 255, .7);
}
/* Хидер */
.blog-header { position: relative; padding: 0 130px 15px 68px; }
.blog-header { position: relative; padding: 0 0 15px 0; }
.blog-header .blog-title { margin-bottom: 7px; }
.blog-header .blog-title { margin-bottom: 7px; color: #fff; }
.blog-header .blog-title i { position: relative; top: -2px; vertical-align: middle; }
.blog-header .avatar { position: absolute; top: 4px; left: 0; }
.blog-header .vote { position: absolute; top: -15px; right: 0; }
.blog-header .vote { position: absolute; top: 0; right: 0; }
.blog-header .vote .vote-count { padding-left: 25px; display: block; color: #333; }
.blog-header .vote .vote-up { position: absolute; top: 22px; left: 0; }
.blog-header .vote .vote-down { position: absolute; top: 35px; left: 0; }
.blog-header .vote.vote-count-positive .vote-count { color: #5055B2; }
.blog-header .vote-label { text-transform: uppercase; text-align: right; font-size: 11px; color: #aaa; }
.blog-header .count { font-size: 34px; line-height: 1em; font-weight: bold; text-align: right; }
.blog .actions { margin-bottom: 0; background: #444; border-color: #555; margin-top: 30px; margin-bottom: 0; }
.blog .actions a { color: #ddd; }
.blog-header .actions { margin-bottom: 0; }
.blog-description { margin-bottom: 20px; }
/* Информация о блоге */
.blog-info { padding: 15px 0; line-height: 20px; }
.blog-info-item { margin-bottom: 5px; }
.blog-info-item:last-child { margin-bottom: 0; }
.blog-info-item-label { opacity: .6; }
/* Кнопка показывающая/скрывающая информацию о блоге */
.blog .get-more { margin-top: 0; }
/**
* Список блогов
*/
.blog-list-item-join { position: absolute; top: 0; right: 0; }

View file

@ -171,6 +171,12 @@ jQuery(document).ready(function($){
ls.editor.init();
/**
* Blog
*/
ls.blog.init();
/**
* Topic
*/
@ -190,12 +196,6 @@ jQuery(document).ready(function($){
ls.pagination.init();
/**
* Blog
*/
ls.blog.init();
/**
* Избраноое
*/

View file

@ -4,32 +4,28 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_options'}
{block 'block_options'}
{$oBlog = $oTopic->getBlog()}
{/block}
{if $oTopic && $oBlog->getType() != 'personal'}
{block name='block_title'}<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape:'html'}</a>{/block}
{block name='block_class'}block-type-blog{/block}
{block 'block_title'}<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape}</a>{/block}
{block 'block_class'}block-type-blog{/block}
{block name='block_content'}
{block 'block_content'}
<span id="blog_user_count_{$oBlog->getId()}">{$oBlog->getCountUser()}</span>
{$oBlog->getCountUser()|declension:$aLang.reader_declension}<br />
{$oBlog->getCountUser()|declension:$aLang.blog.readers_declension}<br />
{$oBlog->getCountTopic()} {$oBlog->getCountTopic()|declension:$aLang.topic_declension}
<br />
<br />
{if $oUserCurrent and $oUserCurrent->getId() != $oBlog->getOwnerId()}
<button type="submit"
class="button button-primary {if $oBlog->getUserIsJoin()}active{/if}"
id="blog-join"
data-only-text="1"
onclick="ls.blog.toggleJoin(this,{$oBlog->getId()}); return false;">{if $oBlog->getUserIsJoin()}{$aLang.blog_leave}{else}{$aLang.blog_join}{/if}</button>&nbsp;&nbsp;
{/if}
{* Подписаться через RSS *}
<a href="{router page='rss'}blog/{$oBlog->getUrl()}/" class="button">RSS</a>
<a href="{router page='rss'}blog/{$oBlog->getUrl()}/" class="rss">RSS</a>
{* Вступить / Покинуть блог *}
{include 'actions/ActionBlog/button_join.tpl'}
{/block}
{/if}

View file

@ -0,0 +1,24 @@
{**
* Список пользователей блога
*
* @styles css/blocks.css
*}
{extends 'blocks/block.aside.base.tpl'}
{block 'block_type'}blog-actions{/block}
{block 'block_content'}
<a href="{$oBlog->getUrlFull()}">
{* TODO: Fix avatar size *}
<img src="{$oBlog->getAvatarPath(100)}" alt="{$oBlog->getTitle()|escape}" class="avatar" />
</a>
{/block}
{block 'block_footer'}
{* Подписаться через RSS *}
<a href="{router page='rss'}blog/{$oBlog->getUrl()}/" class="button">RSS</a>
{* Вступить / Покинуть блог *}
{include 'actions/ActionBlog/button_join.tpl'}
{/block}

View file

@ -4,24 +4,24 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_type'}blog-add{/block}
{block 'block_type'}blog-add{/block}
{block name='block_options'}
{block 'block_options'}
{if ! $oUserCurrent}
{$bBlockNotShow = true}
{/if}
{/block}
{block name='block_content'}
{block 'block_content'}
{if $oUserCurrent and ($oUserCurrent->getRating() > {cfg name='acl.create.blog.rating'} or $oUserCurrent->isAdministrator())}
<p>{$aLang.blog_can_add}</p>
<p>{$aLang.blog.can_add}</p>
<a href="{router page='blog'}add/" class="button button-primary button-large">{$aLang.blog_add}</a>
<a href="{router page='blog'}add/" class="button button-primary button-large">{$aLang.blog.create_blog}</a>
{else}
<p>{$aLang.blog_cant_add|ls_lang:"rating%%`$oConfig->get('acl.create.blog.rating')`"}</p>
<p>{$aLang.blog.cant_add|ls_lang:"rating%%`$oConfig->get('acl.create.blog.rating')`"}</p>
<button class="button button-primary button-large" disabled>{$aLang.blog_add}</button>
<button class="button button-primary button-large" disabled>{$aLang.blog.create_blog}</button>
{/if}
{/block}

View file

@ -0,0 +1,41 @@
{**
* Список управляющих блога
*
* @styles css/blocks.css
*}
{extends 'blocks/block.aside.base.tpl'}
{block 'block_title'}{$aLang.blog.administrators}{/block}
{block 'block_type'}blog-admins{/block}
{block 'block_content'}
{**
* Функции
*}
{* Список пользователей *}
{function blog_user_list}
{if $aUsers}
<h3>{$sTitle}</h3>
<ul class="user-list-small">
{foreach $aUsers as $oUser}
{if $oUser->getUser()}{$oUser = $oUser->getUser()}{/if}
<li class="user-list-small-item">{include 'user_item.tpl' oUser=$oUser}</li>
{/foreach}
</ul>
{/if}
{/function}
{* Создатель *}
{blog_user_list sTitle="{$aLang.blog.owner}" aUsers=[ $oBlog->getOwner() ]}
{* Администраторы *}
{blog_user_list sTitle="{$aLang.blog.administrators} ({$iCountBlogAdministrators})" aUsers=$aBlogAdministrators}
{* Модераторы *}
{blog_user_list sTitle="{$aLang.blog.moderators} ({$iCountBlogModerators})" aUsers=$aBlogModerators}
{/block}

View file

@ -4,31 +4,31 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_title'}{$aLang.block_category_blog}{/block}
{block name='block_type'}blog-categories{/block}
{block 'block_title'}{$aLang.block_category_blog}{/block}
{block 'block_type'}blog-categories{/block}
{block name='block_header_end'}
{block 'block_header_end'}
{if $oUserCurrent and $oUserCurrent->isAdministrator()}
<a href="{router page="admin"}blogcategory/" title="{$aLang.admin_list_blogcategory}" class="icon-cog blog-categories-admin"></a>
{/if}
{/block}
{block name='block_content'}
{block 'block_content'}
{if $aBlogCategories}
<ul class="nested-list">
<li class="nested-list-item {if !$oBlogCategoryCurrent}active{/if}">
<li class="nested-list-item {if ! $oBlogCategoryCurrent}active{/if}">
<a href="{router page='blogs'}">{$aLang.block_category_blog_all} ({$iCountBlogsAll})</a>
</li>
{foreach $aBlogCategories as $oCategory}
<li class="nested-list-item {if $oBlogCategoryCurrent and $oBlogCategoryCurrent->getId()==$oCategory->getId()}active{/if}">
<a style="margin-left: {$oCategory->getLevel()*20}px;" href="{$oCategory->getUrlWeb()}">{$oCategory->getTitle()|escape} ({$oCategory->getCountBlogs()})</a>
<li class="nested-list-item {if $oBlogCategoryCurrent && $oBlogCategoryCurrent->getId() == $oCategory->getId()}active{/if}">
<a style="margin-left: {$oCategory->getLevel() * 20}px;" href="{$oCategory->getUrlWeb()}">{$oCategory->getTitle()|escape} ({$oCategory->getCountBlogs()})</a>
</li>
{/foreach}
</ul>
{else}
No categories {* TODO: Language *}
{include 'alert.tpl' mAlerts=$aLang.blog.categories.empty sAlertStyle='empty'}
{/if}
{/block}

View file

@ -4,16 +4,10 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_title'}{$aLang.block_blog_info}{/block}
{block name='block_content'}
{* Загрузка описания блога *}
<script>
jQuery(document).ready(function($){
ls.blog.loadInfo($('#blog_id').val());
});
</script>
<p id="block_blog_info" class="text"></p>
{block 'block_title'}{$aLang.block_blog_info}{/block}
{block 'block_content'}
<p class="text js-blog-info"></p>
{/block}

View file

@ -4,7 +4,7 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_title'}{$aLang.block_blog_info_note}{/block}
{block name='block_content'}{$aLang.block_blog_info_note_text}{/block}
{block 'block_title'}{$aLang.block_blog_info_note}{/block}
{block 'block_content'}{$aLang.block_blog_info_note_text}{/block}

View file

@ -5,41 +5,39 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_title'}{$aLang.blog_admin_user_add_header}{/block}
{block name='block_type'}blog-invite{/block}
{block 'block_title'}{$aLang.blog.invite.invite_users}{/block}
{block 'block_type'}blog-invite{/block}
{block name='block_content'}
<form onsubmit="return ls.blog.addInvite({$oBlogEdit->getId()});">
<p>
<label for="blog_admin_user_add">{$aLang.blog_admin_user_add_label}:</label>
<input type="text" id="blog_admin_user_add" name="add" class="input-text width-full autocomplete-users-sep" />
</p>
{block 'block_content'}
{* Форма добавления *}
<form class="js-blog-invite-form mb-20" data-blog-id="{$oBlogEdit->getId()}">
{include 'forms/fields/form.field.text.tpl'
sFieldName = 'add'
sFieldClasses = 'width-full autocomplete-users-sep js-blog-invite-form-users'
sFieldLabel = $aLang.blog.invite.form.users_label}
{include 'forms/fields/form.field.button.tpl' sFieldText=$aLang.common.add sFieldStyle='primary' sFieldClasses='js-blog-invite-form-submit'}
</form>
<br />
<h3>{$aLang.blog_admin_user_invited}:</h3>
{* Список приглашенных *}
<div class="js-blog-invite-container" {if ! $aBlogUsersInvited}style="display: none"{/if}>
<h3>{$aLang.blog.invite.users_title}</h3>
<div id="invited_list_block">
{if $aBlogUsersInvited}
<ul id="invited_list">
{foreach $aBlogUsersInvited as $oBlogUser}
{$oUser = $oBlogUser->getUser()}
<ul class="user-list-small js-blog-invite-users">
{foreach $aBlogUsersInvited as $oBlogUser}
{$oUser = $oBlogUser->getUser()}
<li class="user-list-small-item js-blog-invite-user" data-blog-id="{$oBlogEdit->getId()}" data-user-id="{$oUser->getId()}">
{include 'user_item.tpl' oUser=$oUser}
<li id="blog-invite-remove-item-{$oBlogEdit->getId()}-{$oUser->getId()}">
<a href="{$oUser->getUserWebPath()}" class="user">{$oUser->getDisplayName()}</a> -
<a href="#" onclick="return ls.blog.repeatInvite({$oUser->getId()}, {$oBlogEdit->getId()});">{$aLang.blog_user_invite_readd}</a>
<a href="#" onclick="return ls.blog.removeInvite({$oUser->getId()}, {$oBlogEdit->getId()});">{$aLang.blog_user_invite_remove}</a>
</li>
{/foreach}
</ul>
{/if}
{include file='alert.tpl'
mAlerts = $aLang.user_note_list_empty
sAlertStyle = 'info'
bAlertVisible = ! count($aBlogUsersInvited)
sAlertAttributes = 'id="blog-invite-empty"'}
<div class="user-list-small-item-actions">
<a href="#" class="icon-repeat js-blog-invite-user-repeat" title="{$aLang.blog.invite.repeat}"></a>
<a href="#" class="icon-remove js-blog-invite-user-remove" title="{$aLang.common.remove}"></a>
</div>
</li>
{/foreach}
</ul>
</div>
{/block}

View file

@ -1,34 +1,34 @@
{**
{**
* Навигация по блогам с возможностью выбрать категорию и блог из этой категории
*
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_title'}{$aLang.block_blog_navigator}{/block}
{block name='block_type'}blog-navigation{/block}
{block 'block_title'}{$aLang.block_blog_navigator}{/block}
{block 'block_type'}blog-navigation{/block}
{block name='block_content'}
{block 'block_content'}
{if $aNavigatorBlogCategories}
<p><select id="blog-navigator-category" class="width-full blog-navigator-categories" onchange="ls.blog.loadBlogsByCategory($(this).val());">
<option value="0">{$aLang.blog_category}</option>
<p><select class="width-full js-blog-nav-categories">
<option value="0">{$aLang.blog.categories.category}</option>
{foreach $aNavigatorBlogCategories as $oCategoryItem}
<option style="margin-left: {$oCategoryItem->getLevel()*20}px;" value="{$oCategoryItem->getId()}">{$oCategoryItem->getTitle()|escape:'html'}</option>
<option style="margin-left: {$oCategoryItem->getLevel()*20}px;" value="{$oCategoryItem->getId()}">{$oCategoryItem->getTitle()|escape}</option>
{/foreach}
</select></p>
<p><select id="blog-navigator-blog" class="width-full" disabled>
<option value="0">{$aLang.blog}</option>
<p><select class="width-full js-blog-nav-blogs" disabled>
<option value="0">{$aLang.blog.blog}</option>
{foreach $aNavigatorBlogs as $oBlogItem}
<option value="{$oBlogItem->getId()}" data-url="{$oBlogItem->getUrlFull()}">{$oBlogItem->getTitle()|escape:'html'}</option>
<option value="{$oBlogItem->getId()}" data-url="{$oBlogItem->getUrlFull()}">{$oBlogItem->getTitle()|escape}</option>
{/foreach}
</select></p>
<button onclick="ls.blog.navigatorGoSelectBlog();" class="button" id="blog-navigator-button" disabled>{$aLang.block_blog_navigator_button}</button>
{include 'forms/fields/form.field.button.tpl' sFieldText=$aLang.block_blog_navigator_button sFieldClasses='js-blog-nav-submit' bFieldIsDisabled=true}
{else}
No categories {* TODO: Language *}
{include 'alert.tpl' mAlerts=$aLang.blog.categories.empty sAlertStyle='empty'}
{/if}
{/block}

View file

@ -0,0 +1,25 @@
{**
* Список пользователей блога
*
* @styles css/blocks.css
*}
{extends 'blocks/block.aside.base.tpl'}
{block 'block_title'}
{$iUsersCount = count($aBlogUsers)}
<a href="{$oBlog->getUrlFull()}users/">
{if $iUsersCount}
{$iUsersCount} {$iUsersCount|declension:$aLang.blog.readers_declension:'russian'}
{else}
{$aLang.blog.users.empty}
{/if}
</a>
{/block}
{block 'block_type'}blog-users{/block}
{block 'block_content'}
{include 'user_list_avatar.tpl' aUsersList=$aBlogUsers}
{/block}

View file

@ -4,12 +4,12 @@
* @styles css/blocks.css
*}
{extends file='blocks/block.aside.base.tpl'}
{extends 'blocks/block.aside.base.tpl'}
{block name='block_title'}{$aLang.block_blogs}{/block}
{block name='block_type'}blogs{/block}
{block 'block_title'}{$aLang.block_blogs}{/block}
{block 'block_type'}blogs{/block}
{block name='block_nav'}
{block 'block_nav'}
<ul class="nav nav-pills js-block-nav" data-type="tabs">
<li data-type="tab" data-tab-url="{router page='ajax'}blogs/top" data-tab-target="js-tab-pane-blogs" class="active"><a href="#">{$aLang.block_blogs_top}</a></li>
@ -20,12 +20,12 @@
</ul>
{/block}
{block name='block_content'}
{block 'block_content'}
<div id="js-tab-pane-blogs">
{$sBlogsTop}
</div>
{/block}
{block name='block_footer'}
{block 'block_footer'}
<a href="{router page='blogs'}">{$aLang.block_blogs_all}</a>
{/block}

View file

@ -8,12 +8,12 @@
<ul class="item-list">
{foreach $aBlogs as $oBlog}
<li>
<a href="{$oBlog->getUrlFull()}"><img src="{$oBlog->getAvatarPath(48)}" alt="avatar" class="avatar" /></a>
<a href="{$oBlog->getUrlFull()}"><img src="{$oBlog->getAvatarPath(48)}" alt="{$oBlog->getTitle()|escape}" class="avatar" /></a>
{if $oBlog->getType()=='close'}<i title="{$aLang.blog_closed}" class="icon icon-lock"></i>{/if}
<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape:'html'}</a>
{if $oBlog->getType() == 'close'}<i title="{$aLang.blog.private}" class="icon icon-lock"></i>{/if}
<a href="{$oBlog->getUrlFull()}">{$oBlog->getTitle()|escape}</a>
<p>{$aLang.blog_rating}: <strong>{$oBlog->getRating()}</strong></p>
<p>{$aLang.vote.rating}: <strong>{$oBlog->getRating()}</strong></p>
</li>
{/foreach}
</ul>

View file

@ -75,7 +75,7 @@
<script>
ls.lang.load({json var = $aLangJs});
ls.lang.load({lang_load name="blog, talk_favourite_add, talk_favourite_del, topic_question_create_answers_error_max, geo_select_city, geo_select_region, blog_create_type_open_notice, blog_create_type_close_notice"});
ls.lang.load({lang_load name="blog.blog, favourite.add, favourite.remove, topic_question_create_answers_error_max, geo_select_city, geo_select_region, blog.add.fields.type.note_open, blog.add.fields.type.note_close"});
ls.registry.set('comment_max_tree', {json var=$oConfig->Get('module.comment.max_tree')});
ls.registry.set('block_stream_show_tip', {json var=$oConfig->Get('block.stream.show_tip')});
@ -192,7 +192,7 @@
{/if}
<form action="{router page='search'}topics/" class="search-form">
<input type="text" placeholder="{$aLang.search}" maxlength="255" name="q" class="search-form-input width-full">
<input type="text" placeholder="{$aLang.search.search}" maxlength="255" name="q" class="search-form-input width-full">
<input type="submit" value="" title="{$aLang.search_submit}" class="search-form-submit icon-search">
</form>
</nav>
@ -218,7 +218,7 @@
<nav class="grid-row grid-role-nav">
<ul class="nav nav-main">
<li {if $sMenuHeadItemSelect=='blog'}class="active"{/if}><a href="{cfg name='path.root.web'}">{$aLang.topic_title}</a></li>
<li {if $sMenuHeadItemSelect=='blogs'}class="active"{/if}><a href="{router page='blogs'}">{$aLang.blogs}</a></li>
<li {if $sMenuHeadItemSelect=='blogs'}class="active"{/if}><a href="{router page='blogs'}">{$aLang.blog.blogs}</a></li>
<li {if $sMenuHeadItemSelect=='people'}class="active"{/if}><a href="{router page='people'}">{$aLang.people}</a></li>
<li {if $sMenuHeadItemSelect=='stream'}class="active"{/if}><a href="{router page='stream'}">{$aLang.stream_menu}</a></li>