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

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

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