<?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-11-02T15:58:19Z</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=&amp;#039;Cache-Control&amp;#039; content=&amp;#039;no-cache&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;#039;Pragma&amp;#039; content=&amp;#039;no-cache&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;#039;Content-Type&amp;#039; content=&amp;#039;text/html; charset=utf-8&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;#039;stylesheet&amp;#039; href=&amp;#039;{{cfg::img_dir}}/user.css&amp;#039; type=&amp;#039;text/css&amp;#039;&amp;gt;&lt;br /&gt;
{{ template::base.head }}&lt;br /&gt;
&amp;lt;script type=&amp;#039;text/javascript&amp;#039;&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=&amp;#039;body&amp;#039;&amp;gt;&lt;br /&gt;
     &amp;lt;div id=&amp;#039;top_lines&amp;#039;&amp;gt;{{ top_lines }}&lt;br /&gt;
         {% if made_msg %}&amp;lt;div class=&amp;#039;top_msg&amp;#039;&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=&amp;#039;float: left; width: 300px; margin-left: 5px&amp;#039;&amp;gt;&lt;br /&gt;
         {% include &amp;#039;menu.html&amp;#039; menu=user_info.plugin_menu user_info=user_info %}       &lt;br /&gt;
     &amp;lt;/div&amp;gt;&lt;br /&gt;
     &amp;lt;div style=&amp;#039;margin-left: 310px&amp;#039;&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=&amp;#039;Cache-Control&amp;#039; content=&amp;#039;no-cache&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;#039;Pragma&amp;#039; content=&amp;#039;no-cache&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;meta http-equiv=&amp;#039;Content-Type&amp;#039; content=&amp;#039;text/html; charset=utf-8&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;#039;stylesheet&amp;#039; href=&amp;#039;{{cfg::img_dir}}/font-awesome/css/font-awesome.min.css&amp;#039; type=&amp;#039;text/css&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;{{cfg::img_dir}}/js/jquery.js&amp;#039;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;{{cfg::img_dir}}/js/nody_modal.js&amp;#039; charset=&amp;#039;UTF-8&amp;#039;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;{{cfg::img_dir}}/js/nody_select.js&amp;#039; charset=&amp;#039;UTF-8&amp;#039;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;#039;text/javascript&amp;#039; src=&amp;#039;{{cfg::img_dir}}/js/nody.js&amp;#039; charset=&amp;#039;UTF-8&amp;#039;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
{{ template::base.head }}&lt;br /&gt;
&amp;lt;script type=&amp;#039;text/javascript&amp;#039;&amp;gt;&lt;br /&gt;
var nody;&lt;br /&gt;
$(function() {&lt;br /&gt;
    if( $(&amp;#039;body&amp;#039;).height() &amp;lt; $(window).height() ) $(&amp;#039;body&amp;#039;).height($(window).height());&lt;br /&gt;
    nody = {&lt;br /&gt;
        msg_after_submit : &amp;#039;{{lang::msg_after_submit}}&amp;#039;,&lt;br /&gt;
        img_after_submit : &amp;#039;{{cfg::img_dir}}/loading.gif&amp;#039;,&lt;br /&gt;
        script_url       : &amp;#039;{{ses::script_url}}&amp;#039;,&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 &amp;#039;css.html&amp;#039; %}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body class=&amp;#039;{{body_class}}&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;#039;modal_window&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;#039;header&amp;#039;&amp;gt;&lt;br /&gt;
   &amp;lt;img src=&amp;#039;/nodeny_logo.png&amp;#039; style=&amp;#039;vertical-align:middle; width:300px; height:80px;&amp;#039;&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=&amp;#039;content_title&amp;#039;&amp;gt;&amp;lt;div id=&amp;#039;content_title_exit&amp;#039;&amp;gt;&amp;lt;a href=&amp;#039;?a=logout&amp;#039;&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=&amp;#039;main&amp;#039;&amp;gt;&lt;br /&gt;
   &amp;lt;div id=&amp;#039;content&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;#039;top_lines&amp;#039;&amp;gt;{{ top_lines }}&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;#039;main_block&amp;#039;&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=&amp;#039;menu_block&amp;#039;&amp;gt;&lt;br /&gt;
      {% include &amp;#039;menu.html&amp;#039; menu=user_info.plugin_menu user_info=user_info %}&lt;br /&gt;
      {% if news %}&amp;lt;div id=&amp;#039;news_block&amp;#039;&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 &amp;#039;login_base.html&amp;#039; %}&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>