Page tree
Skip to end of metadata
Go to start of metadata

ЛК позволяет не только менять оформление и тексты, но и дорабатывать поведение: переопределять шаблоны и скрипты экранов, добавлять свои страницы, передавать во фронтенд дополнительные данные и подключать серверный код. Эта страница описывает клиентскую часть; серверная вынесена на страницу Серверные расширения (engine), а пошаговые примеры — на страницу Разработка виджетов.

Общие принципы, расположение каталогов и правила наложения слоев описаны на странице Настройка личного кабинета. Все пути ниже указаны относительно каталога кастомизации (local/<client> или clients_stuff/<client>).

Никогда не правьте файлы внутри контейнера или в каталоге приложения /opt/hydra/hupo: они теряются при обновлении. Все доработки размещаются только в каталогах кастомизации.

Как устроен интерфейс

ЛК — одностраничное приложение: сервер отдает данные в JSON, а страницы собираются в браузере из шаблонов. Используются Backbone.js (модели, коллекции, представления), CoffeeScript и шаблоны .jst.hamlc (Haml с возможностью вставлять CoffeeScript). Исключение — страница входа, восстановление пароля и печатная форма квитанции: они рендерятся на сервере.

Полезные объекты в консоли браузера:

  • Application.data — данные, переданные сервером при загрузке страницы;
  • Application.objects — те же данные в виде моделей и коллекций: personalAccounts, servs, person или company, widgets и другие;
  • Application.getCurrentAccount() — текущий лицевой счет;
  • JST — скомпилированные шаблоны по их путям, например JST['layout/footer'].

Шаблоны интерфейса

Чтобы изменить экран, положите в assets/templates файл с тем же путем, что у шаблона приложения: он полностью заменит стандартный. Пути шаблонов приложения можно посмотреть внутри контейнера в /opt/hydra/hupo/app/assets/templates; наиболее востребованные:

Шаблон

Что это

layout.jst.hamlc

Шапка страницы

layout/footer.jst.hamlc

Подвал (переопределен в слое default)

layout/welcome.jst.hamlc

Приветствие и выбор лицевого счета

accounts/show.jst.hamlc

Сводная страница лицевого счета

accounts/servs/_show.jst.hamlc, accounts/servs/detailed_info/*

Карточка услуги

accounts/receipt/new.jst.hamlc

Форма квитанции

accounts/promised_payment/show.jst.hamlc

Обещанный платеж

notifications/*

Подписка на уведомления

shortcuts/banners/*.jst.hamlc

Баннеры главной страницы (в слое default)

widgets/shortcuts/*.jst.hamlc, widgets/container/iframe.jst.hamlc

Шаблоны виджетов

Шаблоны, которые есть в приложении, подхватываются автоматически. Новые шаблоны (свои баннеры, страницы, виджеты) нужно подключить к сборке, см. следующий раздел.

JavaScript

Точка входа

Скрипты лежат в assets/javascripts с расширением .js.coffee (CoffeeScript) или .js. Точка входа клиентского кода — файл custom.js.coffee; в слое default он подключает шаблоны, представления и файл client_custom:

default/assets/javascripts/custom.js.coffee
#= require_tree ../templates
#= require_tree ./views
#= require client_custom

Поэтому для своих доработок достаточно создать в своем слое файл client_custom.js.coffee:

assets/javascripts/client_custom.js.coffee
#= require_tree ../templates
#= require_tree ./views
#= require my_plugin

Директивы require подключают другие файлы: require_tree — каталог целиком, require имя — файл по логическому имени без расширения. Так подключаются и jQuery-плагины, положенные в assets/javascripts.

Не переопределяйте custom.js.coffee без необходимости: он заменит файл из default целиком вместе с директивами подключения. Если файл client_custom.js.coffee уже есть в clients_stuff/<client>, а вы создаете свой в local/<client>, скопируйте содержимое нижнего файла и дополните.

Код после загрузки ЛК

Код, которому нужен инициализированный ЛК, выполняется в обработчике ApplicationLoader.done:

assets/javascripts/client_custom.js.coffee
#= require_tree ../templates
#= require_tree ./views

ApplicationLoader.done (app) ->
  # app -- экземпляр ЛК, Application.data -- данные сервера
  console.log('Текущий счёт', app.getCurrentAccount().get('vc_account'))
  $.get('/my_info').done (data) ->
    $('.content').prepend("<div class='my-info'>#{data.text}</div>")

Переопределение представлений

Поведение существующих экранов меняется переопределением класса представления: положите файл с тем же путем, что в app/assets/javascripts/views приложения, и объявите в нем класс с тем же именем. Так слой default переопределяет views/accounts/servs/closed_subscription.js.coffee. Исходный класс при этом недоступен, поэтому скопируйте его из контейнера и измените нужные методы.

Чтобы дополнить класс, а не заменить, положите файл под другим именем и унаследуйтесь от исходного класса:

assets/javascripts/views/example/index.js.coffee
#= require views/index

BaseIndex = HupoApp.Views.Index

class HupoApp.Views.Index extends BaseIndex
  render: =>
    super()
    @$el.append('<div class="promo">Акция месяца</div>')
    @$el

Свои страницы

Новые страницы со своими адресами добавляются расширением маршрутов и диспетчера:

assets/javascripts/example_routes.js.coffee
HupoApp.routes.push ->
  @resources 'accounts', {only: ['show']}, ->
    @get 'bonus': 'bonus'
assets/javascripts/example_dispatcher.js.coffee
class ExampleDispatcher extends HupoApp.Dispatcher
  accounts: =>
    Object.assign(
      super,
      bonus: (vc_account_no) =>
        view = new HupoApp.Views.Example.Bonus(vc_account_no)
        @router.updateContent(view.index))

@HupoApp.Dispatcher = ExampleDispatcher

Оба файла подключаются из client_custom.js.coffee директивами require. Страница открывается по адресу /accounts/<номер счёта>/bonus. Данные для нее, если они нужны с сервера, отдает engine.

Серверные представления (views)

Каталог views переопределяет серверные шаблоны приложения; путь указывается относительно app/views:

Файл

Что это

login/login.haml, layouts/login.haml

Страница входа, см. Оформление

password_recovery/index.haml, recover.haml, validate.haml

Восстановление пароля

accounts/receipts/create.html.erb

Печатная форма квитанции

application/_custom.json.jbuilder

Дополнительные данные для фронтенда

Данные для фронтенда

Пустой серверный шаблон application/_custom.json.jbuilder — место, куда можно добавить свои данные. Все, что в нем выведено, попадает в Application.data и доступно в шаблонах и скриптах:

views/application/_custom.json.jbuilder
json.current_user_person current_user.person?
json.qr_image_url asset_path('qr.jpg')
json.support_hours '09:00-21:00'
assets/templates/shortcuts/banners/qr.jst.hamlc
.shortcut-content
  - if Application.data.current_user_person
    %img{src: Application.data.qr_image_url}
    .shortcut-text= "Поддержка: #{Application.data.support_hours}"

В шаблоне доступен текущий пользователь (current_user, его лицевые счета, услуги, дополнительные параметры) и хелперы Rails. Это самый простой способ вынести во фронтенд данные из Гидры без написания engine.