Создадим информационную панель (datapanel) для справочника «Подразделения».
1) В каталоге <userdata>/default/datapanelstorage создайте файл departments.xml и скопируйте в него код из листинга, приведённого ниже.
<?xml version="1.0" encoding="UTF-8"?> <datapanel> <tab id="1" name="Подразделения"> <element id="11" type="webtext" proc="deps.webtext.buttons.dirbuttons.celesta" /> <element id="12" type="grid" subtype="JS_LIVE_GRID" plugin="liveDGrid" proc="deps.grids.departments.gridData.celesta" > <proc id="depsGrMeta" name="deps.grids.departments.gridMeta.celesta" type="METADATA"/> <proc id="depsGrTollBar" name="deps.grids.departments.gridToolBar.celesta" type="TOOLBAR"/> </element> </tab> </datapanel>
Каждый элемент в этом xml содержит уникальный для данной информационной панели (datapanel) идентификатор (@id) и одну (для элемента webtext) или более (для элемента grid) функций загрузки данных:
-
атрибут @proc для элементов типа webtext содержит имя функции, возвращающей html-текст (подробнее см. п. 5).
-
атрибут @proc для данной таблицы (grid) содержит имя функции, возвращающей набор данных (dataset).
-
дочерние элементы <proc/> таблицы содержат имена функций для её настройки:
-
<proc … type = «METADATA»> - функция, загружающая настройки таблицы, например: количество видимых записей, полное количество записей, высота и ширина таблицы и др. (подробнее см. п. 4)
-
<proc … type = «TOOLBAR»> - функция, загружающая настройки панели инструментов (toolbar) таблицы, а именно описание кнопок и их свойств (иконок, событий, генерируемых при нажатии на кнопку) (подробнее см. п. 4).
2) В грануле deps создайте два каталога:
-
webtext – для хранения функций отображения html;
-
grids – для хранения функций, относящихся к таблицам
В каждом каталоге создайте файл __init__.py
3) В каталоге webtext создайте файл buttons.py и скопируйте в него следующий код:
# coding: utf-8
try:
from ru.curs.showcase.core.jython import JythonDTO
except:
from ru.curs.celesta.showcase import JythonDTO
from common.xmlutils import XMLJSONConverter
def dirbuttons(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
buttonstyle = "blue"
# Описание кнопки "Добавить"
addButton = {"div":{"@class": "newbutton highbutton",
"span": {"@class": "blue xforms-trigger",
"span": {"@class": "value",
"button": {"@style": "width: 135px; text-align: center",
"span": {"@class": "xforms-label", "#text": "Добавить"
}
}
}
}
}
}
# Описание кнопки "Редактировать"
editButton = {"div":{"@class": "newbutton highbutton",
"span": {"@class": buttonstyle + ' xforms-trigger',
"span": {"@class": "value",
"button": {"@style": "width: 135px; text-align: center",
"span": {"@class": "xforms-label", "#text": "Редактировать"
}
}
}
}
}
}
# Описание кнопки "Удалить"
delButton = {"div":{"@class": "newbutton highbutton",
"span": {"@class": buttonstyle + ' xforms-trigger',
"span": {"@class": "value",
"button": {"@style": "width: 135px; text-align: center",
"span": {"@class": "xforms-label", "#text": "Удалить"
}
}
}
}
}
}
# Разметка кнопок
data = {"div": {"table": {"@cellpadding": "0px",
"@cellspacing": "1px",
"tr":{"td": [addButton,
editButton,
delButton
]
}
}
}
}
settings = { "properties": "" }
return JythonDTO(XMLJSONConverter(input=data).parse(), XMLJSONConverter(input=settings).parse())
В приведённом листинге c помощью HTML в формате JSON (см. Конвертер XML - JSON) описываются кнопки «Добавить», «Редактировать» и «Удалить».
Обратите внимание структуру свойств properties (переменная settings). Здесь не задаются свойства webtext, но далее в этой структуре будут описываться события нажатия на кнопки.
4) В каталоге grid создайте файл departments.py и скопируйте в него следующие фрагменты кода:
импорт модулей и определение заголовков столбцов:
# coding: utf-8
import simplejson as json #@UnresolvedImport
import base64
from common.xmlutils import XMLJSONConverter
from common.sysfunctions import toHexForXml
from deps._deps_orm import departmentsCursor #@UnresolvedImport
try:
from ru.curs.showcase.core.jython import JythonDTO #@UnresolvedImport
except:
from ru.curs.celesta.showcase import JythonDTO #@UnresolvedImport
# Заголвоки для полей таблицы
departmentsHeaders = {'code': u'Код', 'name': u'Наименование подразделения'}
функция загрузки набора данных (dataset) таблицы gridData:
def gridData(context, main=None, add=None, filterinfo=None,
session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None):
u'''Функция получения данных для грида. '''
# Курсор таблицы departments
cursor = departmentsCursor(context)
# Определяем переменную для JSON данных
data = {"records":{"rec":[]}}
# Обновляем параметры сортировки
for column in sortColumnList:
sortindex = '%s' % column.getSorting()
for key in departmentsHeaders:
if departmentsHeaders[key] == column.getId():
cursor.orderBy(key + ' ' + sortindex)
# Создаём JSON с данными
if cursor.tryFirst():
# Заменяем пробел на код символа, чтобы получился корректный XML
depCodeHeader = departmentsHeaders['code'].replace(' ', '_x0020_')
depNameHeader = departmentsHeaders['name'].replace(' ', '_x0020_')
while True:
recDict = {}
recDict[toHexForXml('~~id')] = cursor.id
recDict[depCodeHeader] = cursor.code
recDict[depNameHeader] = cursor.name
recDict['properties'] = ""
}
data["records"]["rec"].append(recDict)
if not cursor.next():
break
res = XMLJSONConverter(input=data).parse()
return JythonDTO(res, None)
функция загрузки настроек таблицы gridMeta:
def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
u'''Функция получения настроек грида. '''
# Курсор таблицы departments
cursor = departmentsCursor(context)
# Получаем количество записей в таблице
totalcount = cursor.count()
# Заголовок таблицы
header = "Подразделения"
# В случае если таблица пустая
if totalcount == 0 or totalcount is None:
totalcount = "0"
header = header + " ПУСТ"
# Определяем список полей таблицы для отображения
settings = {}
settings["gridsettings"] = {
"columns": {
"col":[]
},
"properties": {
"@pagesize": "20",
"@gridWidth": "900px",
"@totalCount": totalcount,
"@profile": "default.properties"
},
"labels": {"header": header}
}
# Добавляем поля для отображения в gridsettings
settings["gridsettings"]["columns"]["col"].append({"@id": departmentsHeaders['code'], "@width": "50px"})
settings["gridsettings"]["columns"]["col"].append({"@id": departmentsHeaders['name'], "@width": "400px"})
res = XMLJSONConverter(input=settings).parse()
return JythonDTO(None, res)
функция загрузки настроек панели инструментов (toolbar) таблицы gridToolbar:
def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None):
u'''Toolbar для грида. '''
if 'currentRecordId' not in json.loads(session)['sessioncontext']['related']['gridContext']:
style = "true"
else:
style = "false"
data = {"gridtoolbar": {"item": []}}
return XMLJSONConverter(input = data).parse()
Параметры и содержимое этих функций будут рассмотрены в ССЫЛКА НА РАЗДЕЛ
5) Далее внесите исправления в модуль depsNavigator.py, добавив действие (action) для отображения панели departments.xml в раздел «Подразделения» группы «Справочники».
"level1": [
{ "@id": "dir11",
"@name": "Подразделения",
"@selectOnLoad": "true",
"action": {
"main_context": "current",
"datapanel": {
"@type": "departments.xml",
"@tab": "1"
}
}
},
{"@id": "dir12", "@name": "Сотрудники"}
]
6) Перезапустите Tomcat.
7) Теперь откройте браузер и войдите в приложение (http://localhost:8081/celesta_training). В навигаторе должен быть по умолчанию выбран раздел «Пдразделения» и его информационная панель должна выглядеть как на рис. 4

Справочник «Подразделения». Информационная панель.

