Документация → Изменение титульной страницы личного кабинента

Шаблон титульной страницы личного кабинента находится в web/tmpl/user/main.html.
Тексты в зависимости от языка (локализация) в web/lang/RU_user.pl (UA_user.pl и т.д)

Изменения не нужно вносить в эти файлы, поскольку при обновлении NoDeny они могут быть изменены автором и тогда возникнет конфликт. Вам необходимо редактировать:

    modules/MyNetwork/create.tmpl.user.main.html - шаблон
    modules/MyNetwork/patch.RU_user.pl - локализация

Меняем шаблон

cd /usr/local/nodeny/
ee modules/MyNetwork/create.tmpl.user.main.html
Вставляем текст
#<ACTION> file=>'web/tmpl/user/main.html',hook=>'new'

<p>Здравствуйте, {{ usr.fio }}. Ваш текущий баланс {{ usr.balance }} {{ cfg::gr }}</p>

Установим новую титульную страницу личного кабинета
perl install.pl -x

Открываем в браузере личный кабинент и видим всего одну фразу о балансе.


Данные клиента доступны в следующих переменных:

usr             : личные данные
messages        : сообщения для клиента
services        : подключенные услуги
tmp_pays        : временные платежи
lang            : локализованные сообщения

В каждой переменной через точку доступны свои поля. Например, для переменной usr:

id              : id учетной записи клиента
name            : логин
pass            : пароль
fio             : ФИО
ppc             : платежный код
grp             : номер группы клиента
grp_name        : имя группы
state           : on - доступ открыт, off - закрыт
state_off       : установлен если state равен off
contract        : договор
contract_date   : дата договора (timestamp)
contract_date_as_text : дата договора в виде dd.mm.yyyy
balance         : баланс
limit_balance   : граница отключения
block_if_limit  : отключать ли запись при достижении границы отключения
cstate          : техническое состояние (настроить/ремонт/вирусы...) в виде числа
comment         : комментарий
lstate          : нужна авторизация/всегда онлайн
discount        : скидка
traf            : суммарный трафик
traf_in         : суммарный трафик к клиенту
traf_out        : суммарный трафик от клиента
traf1           : трафик в байтах направления 1
...
traf4           : трафик в байтах направления 4
in1             : входящий трафик направления 1
out1            : исходящий трафик направления 1
...
dopdata         : дополнительные данные
services        : подключенные услуги
ips             : ip адреса
frozen_srv      : количество замороженных услуг

Давайте выведем личные данные клиента:

Редактируем modules/MyNetwork/create.tmpl.user.main.html
#<ACTION> file=>'web/tmpl/user/main.html',hook=>'new'

<table class='td_medium td_wide'>
    <tr><td>{{ lang::fullusers_fields_name.name }}</td><td>{{ usr.name }}</td></tr>
    <tr><td>{{ lang::fullusers_fields_name.fio }}</td><td>{{ usr.fio }}</td></tr>
    <tr><td>{{ lang.lbl_street }}</td><td>{{ usr.dopdata._adr_street.show() }}</td></tr>
    <tr><td>{{ lang.lbl_house }}</td><td>{{ usr.dopdata._adr_house.show() }}</td></tr>
</table>

Дополнительные поля клиента хранятся в usr.dopdata. Чтобы получить их значения, необходимо обратиться по имени поля в базе данных (смотри настройки дополнительного поля) и добавить show(): usr.dopdata.имя_поля.show().

Обратите внимание, мы использовали локализацию: lang::fullusers_fields_name - названия стандартных полей клиента. lang.lbl_street и lang.lbl_house описаны в modules/MyNetwork/patch.RU_user.pl и вы их можете изменить прямо в этом файле. Там же можете добавить метку для телефона (lbl_phone) либо иное другое (город, район, пол, паспортные данные).

Если необходимо обернуть вывод в стандартной рамке NoDeny:

#<ACTION> file=>'web/tmpl/user/main.html',hook=>'new'

{% block main_block %}

<table class='td_medium td_wide'>
    <tr><td>{{ lang::fullusers_fields_name.name }}</td><td>{{ usr.name }}</td></tr>
    <tr><td>{{ lang::fullusers_fields_name.fio }}</td><td>{{ usr.fio }}</td></tr>
    <tr><td>{{ lang.lbl_street }}</td><td>{{ usr.dopdata._adr_street.show() }}</td></tr>
    <tr><td>{{ lang.lbl_house }}</td><td>{{ usr.dopdata._adr_house.show() }}</td></tr>
</table>

{% if usr.state_off %}<p class='big'>Доступ в интернет закрыт!</p>{% endif %}

{% endblock %}

{% include '../box.html' msg=main_block title=lang.private_data css_class='boxpddng' wide='1' %}

Для примера, мы еще выводим большими буквами (класс big) сообщение о том, что доступ закрыт (если он действительно закрыт). По-хорошему, нам необходимо локализировать это сообщение, например, с кодом msg_inet_denied чтобы, когда клиент выберет иной язык, он увидел сообщение на этом языке.

Для закрепления еще один пример: если баланс отрицательный, мы хотим вывести баланс красным цветом, иначе bold-ом:

    {{lang.balance_is}} <span class='{% if usr.balance < 0 %}error{% else %}bold{% endif %}'>{{ usr.balance }}</span>
    {{cfg::gr}}

Результат в случает отрицательного баланса:

    Остаток на счете <span class='error'>-10</span> грн

Подключенные услуги

Список подключенных услуг хранится в массиве services. Для каждой услуги доступны следующие поля:

title        : имя услуги
text         : локализированное сообщение "{время} подлючена {услуга}"
change_url   : ссылка "Управление" на страницу изменения услуги. Может быть пустой строкой
when_end     : локализированное сообщение о том, когда заканчивается услуга. Может быть пустой строкой
next_service : локализированное сообщение с информацией о следующей услуге
time_left    : сколько секунд осталось до завершения услуги
frozen       : установлено, если услуга заморожена

В отдельной рамке выведем список подключенных услуг. Для этого в тексте создаем отдельный блок с именем services_block, затем этот блок вставляем в рамку:

#<ACTION> file=>'web/tmpl/user/main.html',hook=>'new'

{% block main_block %}
    Здравствуйте!
{% endblock %}
{% include '../box.html' msg=main_block title=lang.private_data css_class='boxpddng' wide='1' %}


{% if services %}
    {% block services_block %}
        {% for s in services %}
            <p>{{ s.text }}{% if s.change_url %} ({{ s.change_url }}){% endif %}. {{ s.when_end }}</p>
            {% if s.next_service %}<p>{{ s.next_service }}</p>{% endif %}
            <hr class='info'>
        {% endfor %}
    {% endblock %}
    {% include '../box.html' msg=services_block title=lang::lbl_services css_class='boxpddng' wide='1' %}
{% endif %}

Детальнее разберем этот пример. {% if services %} - условие, проверяющее, что массив services не пустой. Если массив пустой - значит ни одна услуга не подключена. Если мы удалим это условие, то получим рамку с заголовком "услуги", в которой ничего не будет в случае пустого services. А при использовании условия рамка не будет выведена. Обратите внимание, что условие всегда заканчивается на {% endif %}. Если вы ошибетесь и не вставите endif, либо вставите лишний или не в том месте, NoDeny не покажет вообще ничего, кроме сообщения о том, что произошла внутренняя ошибка.

s.change_url может быть не заполнен, поэтому мы проверяем это: {% if s.change_url %}. Если заполнен: выводим его в скобках сразу за описанием услуги. Тоже самое с полем s.next_service - оно может быть не заполнено, когда не подключена следующая услуга.

Рекомендуем тестировать различные ситуации: создайте клиента. Посмотрите его данные без подключенных услуг, с одной подключенной, с несколькими подключенными, с услугой с автопродлением и без, с услугой, которая заканчивается менее чем через сутки.

Подключенные ip

#<ACTION> file=>'web/tmpl/user/main.html',hook=>'new'

{% if usr.ips %}
{% block ip_block %}
    <table class='td_medium td_wide'>
    <tr><td>Ip</td><td>Тип</td></tr>
    {% for i in usr.ips %}
        <tr><td>{{ i.ip }}</td><td>{{ i.type }}</td></tr>
    {% endfor %}
    </table>
{% endblock %}
{% include '../box.html' msg=ip_block title='ip' css_class='boxpddng' wide='1' %}
{% endif %}