<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https:///index.php?action=history&amp;feed=atom&amp;title=%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B0</id>
	<title>Дизайн личного кабинета - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https:///index.php?action=history&amp;feed=atom&amp;title=%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD_%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B0"/>
	<link rel="alternate" type="text/html" href=""/>
	<updated>2026-05-05T12:30:51Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id></id>
		<title>Sv в 17:35, 25 березня 2023</title>
		<link rel="alternate" type="text/html" href=""/>
		<updated>2023-03-25T17:35:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Личный кабинет==&lt;br /&gt;
Дизайн, как обычно, формируется двумя составляющими:&lt;br /&gt;
* стилями (css)&lt;br /&gt;
* шаблонами страниц&lt;br /&gt;
&lt;br /&gt;
Шаблоны кабинета абонента находятся в папке /usr/local/nodeny/web/tmpl/user/:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|base&lt;br /&gt;
|основной шаблон, в котором задается структура документа, подгружаются css и js-скрипты&lt;br /&gt;
|-&lt;br /&gt;
|box&lt;br /&gt;
|шаблон для отображения чего-либо обособленным блоком (например, в рамке)&lt;br /&gt;
|-&lt;br /&gt;
|error_box&lt;br /&gt;
|шаблон для отображения ошибки&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Кроме данных файлов, присутствуют шаблоны конкретных страниц кабинета:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|main&lt;br /&gt;
|титульная страница&lt;br /&gt;
|-&lt;br /&gt;
|pays&lt;br /&gt;
|история платежей&lt;br /&gt;
|-&lt;br /&gt;
|auth_log&lt;br /&gt;
|лог авторизаций&lt;br /&gt;
|-&lt;br /&gt;
|pay_*&lt;br /&gt;
|шаблоны страниц оплаты через платежные системы&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Менять файлы на диске вам не нужно, поскольку:&lt;br /&gt;
&lt;br /&gt;
* при обновлении биллинга, эти файлы могут быть изменены автором&lt;br /&gt;
* разработан простой механизм их замены прямо в админке.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Шаблоны, которые подлежат замене, необходимо создавать в админке в разделе «Документы».  Залогиньтесь под суперадмином и в этом разделе создайте папку с именем, например, «Кабинет клиента». Справа в поле «теги» обязательно введите system&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Можно переопределить какой-либо шаблон, либо их все. Давайте попробуем создать совершенно иной дизайн. Сначала переопределим основной шаблон: в папке «Кабинет клиента» создадим документ с именем «Base» и установим ему теги:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
system&lt;br /&gt;
template=base&lt;br /&gt;
role=user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь system указывает на то, что файл системный, без этого тега NoDeny будет игнорировать шаблон чтобы не давать обычным операторам менять дизайн. template=base указывает имя темплейта (смотрим таблицу выше). role=user говорит, что данный шаблон будет использоваться только когда залогинен пользователь, а не админ. Обязательно ставим этот тег, иначе изменим и административный интерфейс.&lt;br /&gt;
&lt;br /&gt;
В поле, где отображается содержимое файла «Base», вставим такой текст:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;{{ cfg::net_title }}&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv='Cache-Control' content='no-cache'&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv='Pragma' content='no-cache'&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv='Content-Type' content='text/html; charset=utf-8'&amp;gt;&lt;br /&gt;
&amp;lt;link rel='stylesheet' href='{{cfg::img_dir}}/user.css' type='text/css'&amp;gt;&lt;br /&gt;
{{ template::base.head }}&lt;br /&gt;
&amp;lt;script type='text/javascript'&amp;gt;&lt;br /&gt;
{{ template::base.document_ready }}{{ document_ready }}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body id='body'&amp;gt;&lt;br /&gt;
     &amp;lt;div id='top_lines'&amp;gt;{{ top_lines }}&lt;br /&gt;
         {% if made_msg %}&amp;lt;div class='top_msg'&amp;gt;{{ made_msg }}&amp;lt;/div&amp;gt;{% endif %}&lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div style='float: left; width: 300px; margin-left: 5px'&amp;gt;&lt;br /&gt;
         {% include 'menu.html' menu=user_info.plugin_menu user_info=user_info %}       &lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div style='margin-left: 310px'&amp;gt;{{ main_block }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если зайти в личный кабинет под клиентом (не будучи авторизованным администратором), то увидим поломанный дизайн. Все правильно, мы поменяли блоки шаблона, а css остались прежними (файл user.css). Пока разберемся что в шаблоне за что отвечает.&lt;br /&gt;
&lt;br /&gt;
Блоки, которые находятся в body:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
main_block: основной блок&lt;br /&gt;
top_lines: информация, которую NoDeny рекомендует отобразить в верхней части страницы&lt;br /&gt;
made_msg: блок с сообщением о том, что операция выполнена или произошла ошибка&lt;br /&gt;
template::base.head: в этот блок конкретный модуль кабинета может записать дополнительную информацию, например, дополнительные css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Давайте загрузим тестовый дизайн, подготовленный автором:&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:Пример_интерфейса_личного_кабинета.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Документ «Base»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;title&amp;gt;{{ cfg::net_title }}&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv='Cache-Control' content='no-cache'&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv='Pragma' content='no-cache'&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv='Content-Type' content='text/html; charset=utf-8'&amp;gt;&lt;br /&gt;
&amp;lt;link rel='stylesheet' href='{{cfg::img_dir}}/font-awesome/css/font-awesome.min.css' type='text/css'&amp;gt;&lt;br /&gt;
&amp;lt;script type='text/javascript' src='{{cfg::img_dir}}/js/jquery.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type='text/javascript' src='{{cfg::img_dir}}/js/nody_modal.js' charset='UTF-8'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type='text/javascript' src='{{cfg::img_dir}}/js/nody_select.js' charset='UTF-8'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type='text/javascript' src='{{cfg::img_dir}}/js/nody.js' charset='UTF-8'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
{{ template::base.head }}&lt;br /&gt;
&amp;lt;script type='text/javascript'&amp;gt;&lt;br /&gt;
var nody;&lt;br /&gt;
$(function() {&lt;br /&gt;
    if( $('body').height() &amp;lt; $(window).height() ) $('body').height($(window).height());&lt;br /&gt;
    nody = {&lt;br /&gt;
        msg_after_submit : '{{lang::msg_after_submit}}',&lt;br /&gt;
        img_after_submit : '{{cfg::img_dir}}/loading.gif',&lt;br /&gt;
        script_url       : '{{ses::script_url}}',&lt;br /&gt;
        document_ready   : nody_ready&lt;br /&gt;
    };&lt;br /&gt;
    nody.document_ready();&lt;br /&gt;
    {{ template::base.document_ready }}{{ document_ready }}&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
{% include 'css.html' %}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body class='{{body_class}}'&amp;gt;&lt;br /&gt;
&amp;lt;div id='modal_window'&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id='header'&amp;gt;&lt;br /&gt;
   &amp;lt;img src='/nodeny_logo.png' style='vertical-align:middle; width:300px; height:80px;'&amp;gt;&lt;br /&gt;
   &amp;lt;div&amp;gt;Здравствуйте, {{user_info.fio}}&amp;lt;br&amp;gt;Вы находитесь в личном кабинете сети NoDeny&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id='content_title'&amp;gt;&amp;lt;div id='content_title_exit'&amp;gt;&amp;lt;a href='?a=logout'&amp;gt;{{ lang::btn_logout }}&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;{{ content_title }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id='main'&amp;gt;&lt;br /&gt;
   &amp;lt;div id='content'&amp;gt;&lt;br /&gt;
      &amp;lt;div id='top_lines'&amp;gt;{{ top_lines }}&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id='main_block'&amp;gt;&amp;lt;div&amp;gt;{{ main_block }}&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;/div&amp;gt;&lt;br /&gt;
   &amp;lt;div id='menu_block'&amp;gt;&lt;br /&gt;
      {% include 'menu.html' menu=user_info.plugin_menu user_info=user_info %}&lt;br /&gt;
      {% if news %}&amp;lt;div id='news_block'&amp;gt;{{ news.0.news }}&amp;lt;/div&amp;gt;{% endif %}&lt;br /&gt;
   &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Документ «Кабинет css», теги:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
system&lt;br /&gt;
template=user/css&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
содержимое возьмите с [[Пример 1 css личного кабинета|данной страницы]]&lt;br /&gt;
&lt;br /&gt;
==Дизайн страницы логина==&lt;br /&gt;
&lt;br /&gt;
В /usr/local/nodeny/web/tmpl/ хранятся такие шаблоны:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|login_base.html&lt;br /&gt;
|основной шаблон&lt;br /&gt;
|-&lt;br /&gt;
|login.html&lt;br /&gt;
|ввод логина и пароля&lt;br /&gt;
|-&lt;br /&gt;
|login_select_mod.html&lt;br /&gt;
|выбор метода авторизации&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
В NoDeny есть модули для авторизации не только по логину и паролю, а например, через google или telegram. В этом случае сперва выводится список методов авторизации. Вот как происходит отображение в данном случае:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login_select_mod.html → login_base.html → base.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В случае отображения окна ввода логина и пароля:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.html → login_base.html → base.html&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видите, финальная станица собирается из нескольких. Это сделано для того, чтобы общие части были в одном месте и не требовалось их дублировать во всех шаблонах. Если посмотрим на файл login.html, то увидим такую структуру:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{% global_block template::base.head %}&lt;br /&gt;
...&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
{% global_block template::login_base.main %}&lt;br /&gt;
...&lt;br /&gt;
{% endblock %}&lt;br /&gt;
&lt;br /&gt;
{% include 'login_base.html' %}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь include загружает общий шаблон логина login_base.html.  global_block указывает поместить данные внутри него в блок, который определен в другом шаблоне и имеет такое же имя. Например, блок base.head определен в base.html:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{ template::base.head }}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Давайте изменим страницу логина. В документах создайте файл «Логин base» с тегами:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
system&lt;br /&gt;
template=login_base&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Содержимое файла скопируйте из /usr/local/nodeny/web/tmpl/login_base.html  и измените, например, бекграунд:&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
.login_main {&lt;br /&gt;
    padding: 40pt 15pt;&lt;br /&gt;
    background-color: #ffffff;&lt;br /&gt;
    color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|→&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
.login_main {&lt;br /&gt;
    padding: 40pt 15pt;&lt;br /&gt;
    background-color: #e0e0e0;&lt;br /&gt;
    color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sv</name></author>
	</entry>
</feed>