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

Шаблон Synio

This commit is contained in:
Denis Shakhov 2016-09-03 09:39:46 +07:00
parent 8201e54367
commit 0d09fee0d3
27 changed files with 727 additions and 16 deletions

View file

@ -14,5 +14,5 @@
assign = blockContent}
{component 'block'
mods = 'nopadding transparent blog-actions'
mods = 'nopadding transparent blog-photo'
content = $blockContent}

View file

@ -25,7 +25,11 @@
<header class="{$component}-header">
{block 'block_header_inner'}
<h3 class="{$component}-title">
{$title}
{if $titleUrl}
<a href="{$titleUrl}">{$title}</a>
{else}
{$title}
{/if}
</h3>
{/block}
</header>

View file

@ -32,6 +32,9 @@
max-height: 200px;
position: relative;
}
.ls-block h3 {
font-size: 16px;
}
/* Шапка */
.ls-block-header {
@ -96,4 +99,13 @@
.ls-block--transparent {
background-color: transparent;
border-color: transparent;
}
.ls-block .ls-blankslate {
margin-bottom: 0;
padding: 10px;
background: #eafff8;
color: #555;
border-radius: 5px;
font-size: 11px;
}

View file

@ -0,0 +1,83 @@
{**
* Форма добавления/редактирования
*
* @param object $blog
*}
{component_define_params params=[ 'blog' ]}
<form method="post" enctype="multipart/form-data" class="syn-form-panel js-blog-add js-form-validate">
{hook run='form_add_blog_begin'}
{* Название блога *}
{component 'field' template='text'
name = 'blog_title'
rules = [ 'required' => true, 'length' => "[2,200]" ]
note = $aLang.blog.add.fields.title.note
label = $aLang.blog.add.fields.title.label}
{* URL блога *}
{component 'field' template='text'
name = 'blog_url'
rules = [ 'required' => true, 'regexp' => '^[\w- ]{2,50}$' ]
isDisabled = $_aRequest.blog_id && ! $oUserCurrent->isAdministrator()
note = $aLang.blog.add.fields.url.note
label = $aLang.blog.add.fields.url.label}
{* Категория блога *}
{if Config::Get('module.blog.category_allow') && ($oUserCurrent->isAdministrator() or ! Config::Get('module.blog.category_only_admin'))}
{* Подключаем блок для управления категориями *}
{insert name='block' block='fieldCategory' params=[ 'target' => $blog, 'entity' => 'ModuleBlog_EntityBlog' ]}
{/if}
{* Тип блога *}
{component 'field' template='select'
name = 'blog_type'
label = $aLang.blog.add.fields.type.label
note = $aLang.blog.add.fields.type.note_open
classes = 'js-blog-add-field-type'
inputClasses = 'ls-width-200 js-blog-add-type'
selectedValue = $_aRequest.blog_type
items = [
[ 'value' => 'open', 'text' => $aLang.blog.add.fields.type.value_open ],
[ 'value' => 'close', 'text' => $aLang.blog.add.fields.type.value_close ]
]}
{* Описание блога *}
{component 'editor'
mediaTargetType = 'blog'
mediaTargetId = $_aRequest.blog_id
name = 'blog_description'
rules = [ 'required' => true, 'length' => '[10,3000]' ]
inputClasses = 'js-editor-default'
label = $aLang.blog.add.fields.description.label}
{* Ограничение по рейтингу *}
{component 'field' template='text'
name = 'blog_limit_rating_topic'
rules = [ 'required' => true, 'type' => 'number' ]
value = '0'
inputClasses = 'ls-width-100'
note = $aLang.blog.add.fields.rating.note
label = $aLang.blog.add.fields.rating.label}
{* Принудительный вывод топиков на главную (доступно только админам) *}
{if $oUserCurrent->isAdministrator()}
{component 'field' template='checkbox'
name = 'blog_skip_index'
note = $aLang.blog.add.fields.skip_index.note
label = $aLang.blog.add.fields.skip_index.label}
{/if}
{hook run='form_add_blog_end'}
{* Скрытые поля *}
{component 'field' template='hidden.security-key'}
{* Кнопки *}
{component 'button'
name = 'submit_blog_add'
text = {lang "{( $sEvent == 'add' ) ? 'common.create' : 'common.save'}"}
mods = 'primary'}
</form>

View file

@ -0,0 +1,60 @@
{**
* Действия
*}
{capture 'block_content'}
{* Список экшенов *}
{$actions = []}
{* Вступить/покинуть *}
{if $oUserCurrent && $oUserCurrent->getId() != $blog->getOwnerId() && $blog->getType() == 'open'}
{$actions[] = [
'classes' => 'js-blog-profile-join',
'attributes' => [ 'data-blog-id' => $blog->getId() ],
'text' => {($blog->getUserIsJoin()) ? {lang 'blog.actions.leave'} : {lang 'blog.actions.join'}}
]}
{/if}
{* Написать в блог *}
{if $oUserCurrent && ( ( $blog->getUserIsJoin() && $oUserCurrent->getRating() >= $blog->getLimitRatingTopic() ) || $blog->isAllowEdit() )}
{$topicType=$LS->Topic_GetTopicTypeFirst()}
{if $topicType}
{$actions[] = [
'url' => "{$topicType->getUrlForAdd()}?blog_id={$blog->getId()}",
'text' => {lang 'blog.actions.write'}
]}
{/if}
{/if}
{* Подписаться через RSS *}
{$actions[] = [
'url' => "{router page='rss'}blog/{$blog->getUrl()}/",
'text' => {lang 'blog.actions.rss'}
]}
{if $blog->isAllowEdit()}
{* Редактировать *}
{$actions[] = [ 'url' => "{router page='blog'}edit/{$blog->getId()}/", 'text' => $aLang.common.edit ]}
{* Удалить *}
{if $oUserCurrent->isAdministrator()}
{$actions[] = [
'classes' => 'js-modal-toggle-default',
'attributes' => [ 'data-lsmodaltoggle-modal' => 'modal-blog-delete' ],
'text' => $aLang.common.remove
]}
{else}
{$actions[] = [
'url' => "{router page='blog'}delete/{$blog->getId()}/?security_ls_key={$LIVESTREET_SECURITY_KEY}",
'classes' => 'js-confirm-remove-default',
'text' => $aLang.common.remove
]}
{/if}
{/if}
{component 'nav' hook='blog_actions' items=$actions mods='stacked' classes='profile-actions'}
{/capture}
{component 'block'
mods = 'nopadding user-actions'
content = $smarty.capture.block_content}

View file

@ -0,0 +1,67 @@
{**
* Фильтр блогов
*}
{capture 'block_content'}
<h3>{lang 'blog.blocks.search.categories.title'}</h3>
{* Категории *}
{if $aBlogCategories}
{$items = [[
'name' => 'all',
'text' => {lang 'blog.blocks.search.categories.all'},
'url' => {router page='blogs'},
'attributes' => [ 'data-value' => '0' ],
'count' => $iCountBlogsAll
]]}
{foreach $aBlogCategories as $category}
{$oCategory = $category.entity}
{$items[] = [
'text' => ($oCategory->getTitle()),
'url' => '#',
'attributes' => [ 'data-value' => $oCategory->getId(), 'style' => "margin-left: {$category.level * 20}px;" ],
'count' => $oCategory->getCountTargetOfDescendants()
]}
{/foreach}
{component 'nav'
name = 'blogs_categories'
classes = 'actionbar-item-link'
attributes = [ 'id' => 'js-search-ajax-blog-category' ]
activeItem = 'all'
mods = 'stacked pills'
items = $items}
{else}
{component 'blankslate' text=$aLang.blog.categories.empty}
{/if}
<br>
{* Тип блога *}
<h3>{lang 'blog.blocks.search.type.title'}</h3>
<div class="ls-field-checkbox-group">
{component 'field' template='radio' inputClasses='js-search-ajax-blog-type' name='blog_search_type' value='' label='Любой' checked=true}
{component 'field' template='radio' inputClasses='js-search-ajax-blog-type' name='blog_search_type' value='open' label='Открытый'}
{component 'field' template='radio' inputClasses='js-search-ajax-blog-type' name='blog_search_type' value='close' label='Закрытый'}
</div>
{* Тип принадлежности блога *}
{if $oUserCurrent}
<h3>{lang 'blog.blocks.search.relation.title'}</h3>
<div class="ls-field-checkbox-group">
{component 'field' template='radio' inputClasses='js-search-ajax-blog-relation' name='blog_search_relation' value='all' label='Все' checked=true}
{component 'field' template='radio' inputClasses='js-search-ajax-blog-relation' name='blog_search_relation' value='my' label='Мои'}
{component 'field' template='radio' inputClasses='js-search-ajax-blog-relation' name='blog_search_relation' value='join' label='Читаю'}
</div>
{/if}
{/capture}
{component 'block'
mods = 'blogs-search'
title = {lang 'blog.blocks.search.title'}
content = $smarty.capture.block_content}

View file

@ -0,0 +1,22 @@
{**
* Блок со списком блогов
*}
{capture 'block_footer'}
<a href="{router 'blogs'}">{lang 'synio.all_blogs'}</a>
{/capture}
{component 'block'
mods = 'blogs'
classes = 'blog-block-blogs js-block-default'
title = {lang 'blog.blocks.blogs.title'}
titleUrl = {router page='blogs'}
footer = $smarty.capture.block_footer
tabs = [
'classes' => 'js-tabs-block',
'tabs' => [
[ 'text' => {lang 'blog.blocks.blogs.nav.top'}, 'url' => "{router page='ajax'}blogs/top", 'list' => $sBlogsTop ],
[ 'text' => {lang 'blog.blocks.blogs.nav.joined'}, 'url' => "{router page='ajax'}blogs/join", 'is_enabled' => !! $oUserCurrent ],
[ 'text' => {lang 'blog.blocks.blogs.nav.self'}, 'url' => "{router page='ajax'}blogs/self", 'is_enabled' => !! $oUserCurrent ]
]
]}

View file

@ -0,0 +1,26 @@
{**
* Блок со списоком блогов
* Список блогов
*}
{$items = []}
{foreach $aBlogs as $blog}
{capture 'item_content'}
{lang 'blog.users.readers_total'}: <strong>{$blog->getCountUser()}</strong>
{/capture}
{$items[] = [
'title' => $blog->getTitle()|escape,
'titleUrl' => $blog->getUrlFull(),
'mods' => $blog->getUrlFull(),
'content' => $smarty.capture.item_content,
'image' => [
'path' => $blog->getAvatarPath(48),
'url' => $blog->getUrlFull(),
'alt' => $blog->getTitle()|escape
]
]}
{/foreach}
{component 'item' template='group' items=$items}

View file

@ -0,0 +1,56 @@
{**
* Блог
*
* @param object $blog Блог
* @param object $blogs Список блогов для переноса топиков (для модальника удаления)
* @param string $mods Модификаторы
* @param string $attributes Дополнительные атрибуты основного блока
* @param string $classes Дополнительные классы
*}
{* Название компонента *}
{$component = 'blog'}
{component_define_params params=[ 'blog', 'blogs', 'mods', 'classes', 'attributes' ]}
{* Подключаем модальное окно удаления блога если пользователь админ *}
{if $oUserCurrent && $oUserCurrent->isAdministrator()}
{component 'blog' template='modal.delete' blog=$blog blogs=$blogs}
{/if}
{* Является ли пользователь администратором или управляющим блога *}
{$isBlogAdmin = $oUserCurrent && ($oUserCurrent->getId() == $blog->getOwnerId() || $oUserCurrent->isAdministrator() || $blog->getUserIsAdministrator())}
{* Блог *}
<div class="{$component} {cmods name=$component mods=$mods} {$classes}" {cattr list=$attributes} data-id="{$blog->getId()}">
<header class="{$component}-header">
{* Заголовок *}
<h2 class="page-header blog-title">
{if $blog->getType() == 'close'}
{component 'syn-icon' icon='lock' attributes=[ title => {lang 'blog.private'} ]}
{/if}
{$blog->getTitle()|escape}
</h2>
</header>
{* Информация о блоге *}
<div class="{$component}-content">
{* Описание *}
<div class="{$component}-description ls-text">
{$blog->getDescription()}
</div>
{* Информация *}
{$info = [
[ 'label' => $aLang.blog.date_created, 'content' => "{date_format date=$blog->getDateAdd() hours_back='12' minutes_back='60' now='60' day='day H:i' format='j F Y'}" ],
[ 'label' => $aLang.blog.topics_total, 'content' => $blog->getCountTopic() ],
[ 'label' => $aLang.blog.rating_limit, 'content' => $blog->getLimitRatingTopic() ]
]}
{if $blog->category->getCategory()}
{$info[] = [ 'label' => "{$aLang.blog.categories.category}:", 'content' => $blog->category->getCategory()->getTitle() ]}
{/if}
{component 'info-list' list=$info}
</div>
</div>

View file

@ -0,0 +1,5 @@
{
"styles": {
"blog-list": "css/blog-list.css"
}
}

View file

@ -0,0 +1,28 @@
/**
* Блок с кнопкой "Создать блог"
*/
.ls-block--blog-add .ls-block-content {
padding: 20px;
text-align: center;
}
/**
* Список блогов
*/
.ls-block.blog-block-blogs .ls-item {
padding: 10px 0;
font-size: 11px;
}
.ls-block.blog-block-blogs .ls-item-title {
font-size: 14px;
margin-bottom: 3px;
}
.ls-block.blog-block-blogs .ls-item-image {
width: 36px;
height: 36px;
}
.ls-block.ls-block--blog-photo {
border: none;
padding-bottom: 0;
}

View file

@ -0,0 +1,46 @@
.ls-item-group .blog-list-item {
padding-right: 70px;
}
.blog-list-item .ls-item-title {
margin-top: -3px;
line-height: 24px;
font-size: 16px;
margin-bottom: 5px;
}
.blog-list-item .ls-item-title a {
text-decoration: underline;
color: #275ec2;
}
.blog-list-item .ls-item-title a:hover {
color: #f00;
}
.blog-list-item .ls-item-title .syn-icon {
vertical-align: middle;
margin-right: 3px;
position: relative;
top: -1px;
cursor: help;
}
.blog-list-item-category {
font-size: 11px;
margin-top: -5px;
margin-bottom: 7px;
}
.blog-list-item-category .fa {
color: #65aed2;
}
.blog-list-item-users {
position: absolute;
top: 15px;
right: 15px;
font-size: 11px;
color: #5396b7;
cursor: help;
}
.blog-list-item-users .syn-icon {
vertical-align: middle;
position: relative;
top: -1px;
}

View file

@ -0,0 +1,42 @@
/**
* Блог
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.blog {
margin-bottom: 40px;
padding: 25px;
background: #f8fbfe;
border-radius: 5px;
}
/* Хидер */
.blog-header {
position: relative;
padding: 0 0 15px 0;
}
.blog-title {
margin-bottom: 7px;
}
.blog-title .syn-icon {
position: relative;
top: -2px;
vertical-align: middle;
cursor: help;
}
/* Контент */
.blog-description {
margin-bottom: 30px;
}
.blog-content .ls-info-list-item-content,
.blog-content .ls-info-list-item-label-text {
background: #f8fbfe;
}
.blog-content .ls-info-list-item-label {
width: 200px;
}

View file

@ -0,0 +1,12 @@
{**
* Пользователь
*}
{extends 'component@user-list-add.item'}
{block 'user_list_add_item_actions' prepend}
{* Кнопка "Повторно отправить инвайт" *}
<li class="js-blog-invite-user-repeat" title="{$aLang.blog.invite.repeat}" data-user-id="{$userId}">
{component 'icon' icon='repeat'}
</li>
{/block}

View file

@ -0,0 +1,9 @@
{**
* Список пользователей
*}
{extends 'component@user-list-add.list'}
{block 'user_list_add_item'}
{component 'blog' template='invite-item' user=$user showActions=true}
{/block}

View file

@ -0,0 +1,15 @@
{**
* Приглашение пользователей в закрытый блог
*}
{extends 'component@user-list-add.user-list-add'}
{block 'user_list_add_list'}
{component 'blog' template='invite-list'
hideableEmptyAlert = true
users = $users
showActions = true
show = !! $users
classes = "js-$component-users"
itemClasses = "js-$component-user"}
{/block}

View file

@ -0,0 +1,48 @@
{**
* Блог в списке блогов
*
* @param object $blog
*}
{$component = 'blog-list-item'}
{component_define_params params=[ 'blog' ]}
{* Заголовок *}
{capture 'title'}
{if $blog->getType() == 'close'}
{component 'syn-icon' icon='lock' attributes=[ title => {lang 'blog.private'} ]}
{/if}
<a href="{$blog->getUrlFull()}">{$blog->getTitle()|escape}</a>
{/capture}
{* Описание *}
{capture 'content'}
{* Рейтинг *}
<div class="{$component}-users" title="{lang 'blog.users.readers_total'}">
{component 'syn-icon' icon='user'} {$blog->getCountUser()}
</div>
{$category = $blog->category->getCategory()}
{if $category}
<div class="{$component}-category">
{component 'icon' icon='folder'}
{$category->getTitle()}
</div>
{/if}
<div class="ls-item-description">
{$blog->getDescription()|strip_tags|truncate:170}
</div>
{/capture}
{component 'item'
classes='blog-list-item'
title=$smarty.capture.title
content=$smarty.capture.content
image=[
'url' => $blog->getUrlFull(),
'path' => $blog->getAvatarPath(64),
'alt' => $blog->getTitle()|escape
]}

View file

@ -0,0 +1,18 @@
/**
* Группированный список
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-item-group {
}
.ls-item-group .ls-item {
padding: 13px 15px 13px 0;
border-top: 1px solid #f1f3f5;
}
.ls-item-group .ls-item:last-child {
border-bottom: none;
}

View file

@ -0,0 +1,75 @@
/**
* Item
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
.ls-item {
position: relative;
padding: 13px 15px 13px 0;
border: none;
}
.ls-item:hover {
background: #f5fdff;
}
.ls-item:hover .ls-info-list-item-content,
.ls-item:hover .ls-info-list-item-label-text {
background: #f8fbfe;
}
/* */
.ls-item > * {
vertical-align: top;
display: table-cell;
padding-right: 15px;
}
.ls-item > *:last-child {
padding-right: 0;
}
/* Делаем так, чтобы блок body занимал максимальное */
/* пространство по ширине */
.ls-item-body {
width: 100%;
}
.ls-item-image {
vertical-align: top;
}
.ls-item-title {
font-size: 24px;
line-height: 1.1em;
margin-bottom: 15px;
}
.ls-item-description {
font-size: 11px;
line-height: 16px;
margin-bottom: 10px;
}
.ls-item-description:last-child {
margin-bottom: 0;
}
.ls-item-actions {
position: absolute;
top: 15px;
right: 0;
width: 150px;
text-align: right;
}
/**
* @modifier has-image
*/
.ls-item--has-image {
}
/**
* @modifier image-rounded
*/
.ls-item--image-rounded .ls-item-image {
border-radius: 50%;
}

View file

@ -42,4 +42,14 @@
}
.syn-icon-trash:hover {
background-image: url(icons/trash-hover.png);
}
.syn-icon-lock {
width: 21px;
height: 21px;
background-image: url(icons/lock.png);
}
.syn-icon-user {
width: 12px;
height: 12px;
background-image: url(icons/user.png);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,80 @@
/**
* Таблицы
*
* @license GNU General Public License, version 2
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
* @author Denis Shakhov <denis.shakhov@gmail.com>
*/
caption {
text-align: left;
}
th {
text-align: left;
}
.ls-table {
width: 100%;
max-width: 100%;
margin-bottom: 15px;
}
.ls-table:last-child {
margin-bottom: 0;
}
.ls-table td, .ls-table th {
padding: 15px;
vertical-align: top;
line-height: 18px;
border-top: 1px solid #f1f3f5;
}
.ls-table td {
vertical-align: middle;
}
.ls-table tr:hover td {
background: #f5fdff;
}
.ls-table th {
vertical-align: bottom;
border-bottom: 1px solid #c3d4dc;
font-weight: normal;
padding: 10px;
}
.ls-table caption + thead th,
.ls-table colgroup + thead th,
.ls-table thead:first-child tr:first-child th,
.ls-table thead:first-child tr:first-child td {
border-top: 0;
}
.ls-table tr.active td {
background: #F6F6FA;
}
.ls-table .ls-table-sort-asc:after {
content: "▲";
}
.ls-table .ls-table-sort-desc:after {
content: "▼";
}
/**
* Condensed
*/
.ls-table--condensed td,
.ls-table--condensed th {
padding: 7px;
}
/**
* Striped
*/
.ls-table--striped tbody tr:nth-child(odd) td {
background: #fafafa;
}
/**
* Hover
*/
.ls-table--hover tbody tr:hover td {
background: #f5fdff;
}

View file

@ -9,6 +9,10 @@
.user-list-small:last-child {
margin-bottom: 0;
}
.user-list-small-title {
font-size: 16px;
margin-bottom: 5px;
}
.user-list-small-item {
background: #f8fbfe;
padding: 10px 55px 10px 10px;

View file

@ -1,15 +1,3 @@
.user-list.ls-item-group {
border: none;
}
.user-list .ls-item {
padding: 13px 15px 13px 0;
border: none;
border-top: 1px solid #f1f3f5;
}
.user-list .ls-item:hover {
background: #f5fdff;
}
.user-list-item-username {
margin-bottom: 0;
}

View file

@ -34,7 +34,7 @@
{* Статус *}
<div class="{$component}-status {if $isOnline}{$component}-status--online{/if}">
{if $isOnline && $smarty.now - strtotime($session->getDateLast()) < 60*5}
{if $isOnline}
{$aLang.user.status.online}
{else}
{$date = {date_format date=$session->getDateLast() hours_back="12" minutes_back="60" day_back="8" now="60*5" day="day H:i" format="j F в G:i"}|lower}

View file

@ -5,7 +5,8 @@ return [
'guest' => 'Гость',
'site_pages' => 'Разделы',
'drafts' => '%%count%% черновик;%%count%% черновика;%%count%% черновиков',
'user_about_empty' => 'Пока ничего не известно...'
'user_about_empty' => 'Пока ничего не известно...',
'all_blogs' => 'Все блоги'
],
'activity' => [
'block_recent' => [