Создадим информационную панель (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