Шаблон титульной страницы личного кабинента находится в 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 : количество замороженных услуг
Давайте выведем личные данные клиента:
#<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 - оно может быть не заполнено, когда не подключена следующая услуга.
Рекомендуем тестировать различные ситуации: создайте клиента. Посмотрите его данные без подключенных услуг, с одной подключенной, с несколькими подключенными, с услугой с автопродлением и без, с услугой, которая заканчивается менее чем через сутки.
#<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 %}