У цьому розділі описується приклад імпорту даних з таблиці Excel в базу даних системи. Всі вихідні тексти і працездатний приклад можна знайти в репозиторії A2v10.Web.Sample на Github.
Для того, щоб система знала, як обробляти файли, що завантажуються, їх формат повинен бути попередньо визначеним. Для цього рекомендується пропонувати користувачам завантажити зразки файлів.
Ми будемо розглядати імпорт товарів. Тому всі основні файли знаходяться в папці /sample/catalog/product.
Спочатку додамо в панель інструментів списку товарів кнопку Import.
Фрагмент файлу index.view.xaml
Кнопка просто викликає діалог import.
Не забудемо вказати цей діалог в файлі /catalog/product/model.json.
Фрагмент файлу model.json
Модель даних для цього діалога нам не потрібна, тому вказуємо пустий рядок у
властивості model
. Можливі інші сценарії, які, наприклад, будуть спочатку
відображати імпортовані записи. У цьому випадку модель буде потрібна.
В усьому іншому це стандартний діалог платформи.
При його роботі використовується шаблон import.template
Фрагмент файлу import.dialog.xaml
У цьому діалозі цікаві два елементи керувння.
В першу чергу UploadFile.
Цей елемент виведе на екран поле для завантаження файлу (кліком або перетягуваням).
Вміст обраного файлу буде відправлено на сервер і буде оброблятися командою
/catalog/product/import
з розділу files файлу model.json.
Після завантаження і обробки файлу буде викликаний делегат, який вказано у властивості Delegate
.
Другий елемент керування - посилання, яке дозволить користувачу завантажити зразок файлу для завантаження. Команда Download дозволяє завантажити файл з спеціальної папки _files.
Після завантаження файла на сервер буде викликана команда з розділу files файлу model.json
Тип команди parse
говорить про те, що файл необхідно розібрати, а вид обробки parse
про те, що система очікує файл Microsoft Excel.
Зверніть увагу! Обробляються тільки файли формата .xlsx (Excel 2007 і новіші версії). Старі версії таблиць у форматі .xls не підтримуються.
Після того, як система отримає файл від клієнта, вона намагатиметься його розібрати і отримати з нього просту таблицю. Якщо в команді вказана модель (властивість model, то створюється об`єкт з єдиною властивістю Rows (ім'я попередньо визначене!), що являє собою масив рядків з файла Excel. Після цього система намагатиметься зберігти цей об`єкт як стандартну модель, викликавши процедури .Metadata та .Update.
В результаті обробки на клієнті буде повернуто модель, яка повернеться з процедури .Update.
Зі збереженими процедурами і типами даних можна ознайомитися, переглянувши файл import.sql
Після того, як дані будуть імпортовані в базу даних, необхідно мати якийсь спосіб оповістити про це викликаючий код.
Для цього простіше за все використовувати користувацькі події. В обробнику події Model.load діалогу можна зберігти у змінній посилання на викликаючий контекст. В делегаті, який буде викликаний після завершення завантаження, можна ініціювати подію в викликаючому контексті.
Фрагмент файлу шаблону діалогу import.template.ts
При отриманні події $product.import.done сторінка індекса просто перезавантажується.
Фрагмент файлу шаблону діалогу import.template.ts
Для того, щоб виконати імпорт даних з одного контекста (в цьому випадку події будуть не потрібні), можна використовувати елемент керування InlineDialog.
Реалізацію цього способу залишимо як вправу.